背景说明

Docker Compose中的 default network 是根据环境来决定的,在当前的单节点环境中默认为 bridge 模式,在swarm中为 overlay。
默认情况下,Docker Compose中的多个服务会加入一个名为default的网络。这些服务在default网络中是互通的。该default网络的全称是项目名称_default

解决方案

查看网桥

  1. [root@vm1 ~]# docker network ls

默认网桥

默认网络的网络名称为default可以通过指定default来指定

  1. version: '2'
  2. services:
  3. front:
  4. image: nginx
  5. networks:
  6. default:
  7. external:
  8. name: "mynet" # 已经存在的network

这里的name也可指定网络的资源ID docker network ls|grep mynet,例如:657ffea86794

定义网桥

version: '2'
services:
  front:
    image: nginx
    networks:
      - existnetwork
networks:
  net1: #网络名称
    ipam:  #ip地址管理
      driver: default
      config:
        - subnet: 172.20.0.0/16 # 网段管理
          gateway: 172.20.0.1  # 网关地址
  net2: #网络名称
    ipam:  #ip地址管理
      driver: bridge
      config:
        - subnet: 172.20.0.0/16 # 网段管理
          gateway: 172.20.0.1  # 网关地址
  net3:
    driver: default

driver可选值:bridge、default、overlay[节点必须在swarm中]

外部网桥

创建外部网络

[root@vm1 ~]# docker network create mynet
657ffea86794376427cdcacfdd243783e5e8ac803dafea4c812357619b22b9ca
[root@vm1 ~]# docker network inspect mynet
[
    {
        "Name": "mynet",
        "Id": "657ffea86794376427cdcacfdd243783e5e8ac803dafea4c812357619b22b9ca",
        "Created": "2022-04-12T15:28:18.802924635+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "172.23.0.0/16",
                    "Gateway": "172.23.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@vm1 ~]#

可以看到网段IP: {“Subnet”: “172.23.0.0/16”,”Gateway”: “172.23.0.1”}

引用外部已经存在的网络,语法格式如下

version: '2'
services:
  front:
    image: nginx
    networks:
      - existnetwork
networks:
  existnetwork:
    external:
      name: "xxx-network"

version: '2'
services:
  front:
    image: nginx
networks:
  externalnetwork: # 网络名称
    external:
      name: "mynet" # 已经存在的network

mynet必须事先存在

创建外部网络也可以指定网段、网关、网络名称、网卡名称

[root@vm1 ~]# docker network create --subnet=10.16.1.0/16 --gateway=10.16.1.1 --opt "com.docker.network.bridge.name"="bridgexxx" bridgexxx
e8188b58e28e511dae5195720afeb135f874119bc35c613080556e2fe5ea3636
[root@vm1 ~]# docker network ls
NETWORK ID     NAME                             DRIVER    SCOPE
e8188b58e28e   bridgexxx                        bridge    local
[root@vm1 ~]# ip addr
309: bridgexxx: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:ef:2d:6a:5b brd ff:ff:ff:ff:ff:ff
    inet 10.16.1.1/16 brd 10.16.255.255 scope global bridgexxx
       valid_lft forever preferred_lft forever