[Docker]七.配置 Docker 网络

一.Docker0****网络

1.多个容器之间如何通信,是否可以直接连接

默认启动的所有容器都会加入到docker0这个网络中,所有各个容器件是可以直接通信的

先看看网卡信息:

启动几个容器来演示一下:

bash 复制代码
#启动mycentos这个容器
[root@localhost zph]# docker run -it -d --name mycentos d757f6342cfa /bin/bash
7845d3930d4a6ee995f11c33e9dae2b688032b2d5c6a655148104ab4f33cd2c5
[root@localhost zph]# 
[root@localhost zph]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS         PORTS     NAMES
7845d3930d4a   d757f6342cfa   "/bin/bash"   11 seconds ago   Up 3 seconds             mycentos

说明了每次启动一个容器时,都会增加一个网卡信息,下面来测试一下几个容之间可以相互通信不?
分别查看 3 块网卡的 IP 信息

bash 复制代码
[root@localhost zph]# docker exec -it mycentos ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 45  bytes 5710 (5.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost zph]# docker exec -it mycentos2 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 21  bytes 2436 (2.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@localhost zph]# docker exec -it mycentos3 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.4  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:04  txqueuelen 0  (Ethernet)
        RX packets 20  bytes 2366 (2.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

发现:

mycentos 的IP地址为:172.17.0.2

mycentos2 的IP地址为:172.17.0.3

mycentos3 的IP地址为:172.17.0.4

进入mycentos容器,ping一下mycentos2,看看两个容器是否可以通信

ping得通,说明几个容器之间可以相互通信
然后,退出容器,在主机上ping一下容器,看看是否ping通

ping得通,说明同一台主机上面的容器和主机之间是可以互相通信的
结论
默认情况同一台主机上面的容器是可以互相通信的,默认情况同一台主机上面的容器
和主机之间是可以互相通信的

2.通信原理

每启动一个 Docker 容器, Docker 就会给 Docker 容器分配一个 ip ,只要安装了 Docker ,
就会有一个网卡 Docker0 , Docker0 使用的是桥接模式,使用的技术是 veth-pair 技术

bash 复制代码
#启动mycentos这个容器
[root@localhost zph]# docker run -it -d --name mycentos d757f6342cfa /bin/bash
7845d3930d4a6ee995f11c33e9dae2b688032b2d5c6a655148104ab4f33cd2c5
[root@localhost zph]# 
[root@localhost zph]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS         PORTS     NAMES
7845d3930d4a   d757f6342cfa   "/bin/bash"   11 seconds ago   Up 3 seconds             mycentos

说明了每次启动一个容器时,都会增加一个网卡信息

3.使用默认网络的问题

(1).没法使用计算机主机名实现通信

(2).没法实现网络隔离

当有几个容器:nignx, mysql等时,启动容器后,都加入了docker0网络,没法实现网络隔离
那么,该怎么处理呢,就需要进行自定义网络设置了,可以通过docker network来实现

二.Docker Network****详解

1.关于docker network命令

(1).docker network ls****查看当前计算机上的网络

(2).docker network inspect****查看网络详情

bash 复制代码
[root@localhost zph]# docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
2d19a8dfb493   bridge               bridge    local
fe75119d5a77   dockerlnmp_default   bridge    local
9a2fe27fdd30   dockerlnmp_server    bridge    local
fc03b9653496   host                 host      local
b8b81a5aa87c   none                 null      local
[root@localhost zph]# docker network inspect 2d19a8dfb493
[
    {
        "Name": "bridge",
        "Id": "2d19a8dfb4930b4581ec74f9b6c07878a5cb85378c6841c0ea3e0eabdc3d8bc3",
        "Created": "2023-11-18T18:36:58.528816645-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "005f0e3b21e468d2526f4b444b82b9459599d64db465cf029cc7b1794351cd64": {
                "Name": "mycentos2",
                "EndpointID": "e1935af85b74f19cd8d6b078c1535b09d6e509ff28da355b5473ca116643c8b2",
                "MacAddress": "02:42:ac:11:00:03",
                "IPv4Address": "172.17.0.3/16",
                "IPv6Address": ""
            },
            "7845d3930d4a6ee995f11c33e9dae2b688032b2d5c6a655148104ab4f33cd2c5": {
                "Name": "mycentos",
                "EndpointID": "7be4ae43f9e0881e63e58878d56507ad9235eb542212acf2874e35aa698e4d63",
                "MacAddress": "02:42:ac:11:00:02",
                "IPv4Address": "172.17.0.2/16",
                "IPv6Address": ""
            },
            "8f7731eea4d11d1829a1d963ba539bcab876a085bad442014a9727c519a455f2": {
                "Name": "mycentos3",
                "EndpointID": "25fc5c8d55d4ec52b786f78ddbbfc66551c372e6043466f04c98b14c1f695e6e",
                "MacAddress": "02:42:ac:11:00:04",
                "IPv4Address": "172.17.0.4/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

(3).docker network rm 删除网络

bash 复制代码
#查看网络
[root@localhost zph]# docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
2d19a8dfb493   bridge               bridge    local
fe75119d5a77   dockerlnmp_default   bridge    local
9a2fe27fdd30   dockerlnmp_server    bridge    local
fc03b9653496   host                 host      local
f336219e4dbb   mysql                bridge    local

#删除网络
[root@localhost zph]# docker network rm mysql
mysql

#查看是否已删除
[root@localhost zph]# docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
2d19a8dfb493   bridge               bridge    local
fe75119d5a77   dockerlnmp_default   bridge    local
9a2fe27fdd30   dockerlnmp_server    bridge    local
fc03b9653496   host                 host      local

(4).docker network create****创建网络以及启动容器指定网络

通过docker network create 创建网络以及启动容器指定网络(可以创建网络的类型), 这样当启动容器后就可以把容器加入到自己的网络了,这样就可以解决上面使用默认网络的问题:

  • 没法实现网络隔离
  • 没法使用计算机主机名实现通信
网络的类型分类如下

|--------------|------------------------------|-------------------------------------------------------------------------------|
| Docker 网络模式 | 配置 | 说明 |
| host 模式 | --net=host | 容器和宿主机共享 Network namespace,使用同一个ip |
| container 模式 | --net=container:NAME or ID | 容器和另外一个容器共享 Network namespace, kubernetes 中的 pod 就是多个容器共享一个 Network namespace |
| none 模式 | --net=none | 容器有独立的 Network namespace ,但并没有对其进行任何网 络设置 ,如分配 evth pair 和网桥连 接,配置 IP 等 |
| bridge 模式 | --net=bridge | 默认为该模式 |

host****模式

如果启动容器的时候使用 host 模式,那么这个容器 将不会获得一个独立的 Network
Namespace ,而是 和宿主机共用一个 Network Namespace 。容器将不会虚拟出自己的网卡, 配置自己的 IP 等,而是 使用宿主机的 IP 和端口, 但是,容器的其他方面,如文件系统、进 程列表等还是和宿主机隔离的。 使用 host 模式的容器可以直接使用宿主机的 IP 地址与外界通信,容器内部的服务端口也可 以使用宿主机的端口,不需要进行 NAT , host 最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再用了, 网络的隔离性不好

container****模式

这个模式指定新创建的容器和 已经存在的一个容器 共享一个 Network Namespace ,而不是和
宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP ,而是和一个指定的容器共享 IP 、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的,两个容器的进程可以通过 lo 网卡设备通信

none****模式

使用 none 模式, Docker 容器拥有自己的 Network Namespace ,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、 IP 、路由等信息。需要自己为 Docker 容器添加网卡、配置 IP 等。 这种网络模式下容器只有 lo 回环网络,没有其他网卡。 none 模式可以在容器创建时通过 --network=none 来指定。 这种类型的网络没有办法联网 ,封闭的网络能很好的保证容器的安全性

bridge****模式

当 Docker 进程启动时,会在主机上创建一个名为 docker0 的 虚拟网桥 ,此主机上启动 Docker容器会连接到这个虚拟网桥上,虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中,从docker0 子网中 分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关 。在主机上创建一对 虚拟网卡 veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网卡),另一端放在主机中,以 vethxxx 这样类似的名字命名,并将这个网络设备加入到 docker0 网中。可以通过 brctl show 命令查看,bridge 模式是 docker 的默认网络模式,不写--net 参数,就是 bridge 模式。使用 docker run -p时, docker 实际是在 iptables 做了 DNAT 规则,实现端口转发功能,可以使用 iptables -t nat -vnL 查看

docker network create基本语法

--driver 配置网络连接方式,一般是bridge

--gateway: 配置网关

--subnet: 配置子网,局域网的网段

建议配置子网范围的时候范围不要太大

创建一个docker1网络

--driver bridge
配置网络类型 bridge 桥接
--subnet 192.168.1.0/24
配置子网 建议每个网络的范围尽量小
--gateway 192.168.1.1
配置网关

bash 复制代码
docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 docker1
bash 复制代码
#创建一个docker网络
[root@localhost zph]# docker network create --driver bridge --subnet 192.168.1.0/24 --gateway 192.168.1.1 docker1
c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8
#创建成功
[root@localhost zph]# docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
2d19a8dfb493   bridge               bridge    local
c0fbaf2266c8   docker1              bridge    local
fe75119d5a77   dockerlnmp_default   bridge    local
9a2fe27fdd30   dockerlnmp_server    bridge    local
fc03b9653496   host                 host      local
创建一个docker2网络

--driver bridge
配置网络类型 bridge 桥接
--subnet 192.168.2.0/24
配置子网 建议每个网络的范围尽量小
--gateway 192.168.2.1
配置网关

bash 复制代码
docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 docker2
bash 复制代码
#创建一个docker2网络
[root@localhost zph]# docker network create --driver bridge --subnet 192.168.2.0/24 --gateway 192.168.2.1 docker2
2d9c2d29e6d308733bf266978914a6b43cbab575a2d99d0928908bc09a6d4f40
#创建成功
[root@localhost zph]# docker network ls
NETWORK ID     NAME                 DRIVER    SCOPE
2d19a8dfb493   bridge               bridge    local
c0fbaf2266c8   docker1              bridge    local
2d9c2d29e6d3   docker2              bridge    local
fe75119d5a77   dockerlnmp_default   bridge    local
9a2fe27fdd30   dockerlnmp_server    bridge    local
fc03b9653496   host                 host      local

可以通过docker inspect docker1/docker2 查看相关配置:

bash 复制代码
[root@localhost zph]# docker inspect docker1
[
    {
        "Name": "docker1",
        "Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
        "Created": "2023-11-20T18:19:18.375826061-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]
[root@localhost zph]# docker inspect docker2
[
    {
        "Name": "docker2",
        "Id": "2d9c2d29e6d308733bf266978914a6b43cbab575a2d99d0928908bc09a6d4f40",
        "Created": "2023-11-20T18:21:29.173750083-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.2.0/24",
                    "Gateway": "192.168.2.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {},
        "Labels": {}
    }
]

(5).启动容器指定网络

启动容器的时候可以加上 --net 参数可以指定启动容器的时候使用的网络,如果不加表示默认使用 docker0 网络
--net bridge 表示使用 docker0 网络

bash 复制代码
#查看目前启动的容器
[root@localhost zph]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED        STATUS        PORTS     NAMES
8f7731eea4d1   d757f6342cfa   "/bin/bash"   42 hours ago   Up 42 hours             mycentos3
005f0e3b21e4   d757f6342cfa   "/bin/bash"   42 hours ago   Up 42 hours             mycentos2
7845d3930d4a   d757f6342cfa   "/bin/bash"   42 hours ago   Up 42 hours             mycentos

#查看对应的镜像
[root@localhost zph]# docker images | grep d757f6342cfa
mycentos                         v1                  d757f6342cfa   2 days ago      434MB

#启动一个容器mycentos4 ,并指定docker1为其网络
[root@localhost zph]# docker run -it -d --name mycentos4 --net docker1 d757f6342cfa /bin/bash
0ef1ea47894936e011c3efbafd5dbc49df14e5285f836a08345a48eb800349e6

#启动一个容器mycentos5,并指定docker1为其网络
[root@localhost zph]# docker run -it -d --name mycentos5 --net docker1 d757f6342cfa /bin/bash
a1a6d02bb8ba6ce5bfdc96b32e7d16d8e76ce9960656dab3a2281bf46fa86793

#启动一个容器mycentos6,并指定docker2为其网络
[root@localhost zph]# docker run -it -d --name mycentos6 --net docker2 d757f6342cfa /bin/bash
a6ed25db1e1e221eb510ad80646674d775313977360dda6070f24b320230e6fd

#启动一个容器mycentos7,并指定docker2为其网络
^[[A[root@localhost zpdocker run -it -d --name mycentos7 --net docker2 d757f6342cfa /bin/bash
63aaf78d8a855dd6700b1e7c91b206103155871b845f6de863eff6907896d5cc

#查看启动的容器列表
[root@localhost zph]# docker ps
CONTAINER ID   IMAGE          COMMAND       CREATED              STATUS              PORTS     NAMES
63aaf78d8a85   d757f6342cfa   "/bin/bash"   7 seconds ago        Up 4 seconds                  mycentos7
a6ed25db1e1e   d757f6342cfa   "/bin/bash"   18 seconds ago       Up 16 seconds                 mycentos6
a1a6d02bb8ba   d757f6342cfa   "/bin/bash"   27 seconds ago       Up 24 seconds                 mycentos5
0ef1ea478949   d757f6342cfa   "/bin/bash"   About a minute ago   Up About a minute             mycentos4
8f7731eea4d1   d757f6342cfa   "/bin/bash"   42 hours ago         Up 42 hours                   mycentos3
005f0e3b21e4   d757f6342cfa   "/bin/bash"   42 hours ago         Up 42 hours                   mycentos2
7845d3930d4a   d757f6342cfa   "/bin/bash"   42 hours ago         Up 42 hours                   mycentos

#查看容器mycentos4配置信息:发现网络在docker1中,子网范围在192.168.1.0/24范围中
[root@localhost zph]# docker inspect mycentos4
[
            ...
            "Networks": {
                "docker1": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "0ef1ea478949"
                    ],
                    "NetworkID": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
                    "EndpointID": "da176af0d1630cd9ab8c0bb78e6a3974933686f66f9c334c83b0b622f0b1d3fb",
                    "Gateway": "192.168.1.1",
                    "IPAddress": "192.168.1.2",
                    "IPPrefixLen": 24,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:c0:a8:01:02",
                    "DriverOpts": null
                }
            }
        }
    }
]

#查看容器mycentos5配置信息:发现网络在docker1中,子网范围在192.168.1.0/24范围中
[root@localhost zph]# docker inspect mycentos5
[
    ...
        "HostConfig": {
            "Binds": null,
            "ContainerIDFile": "",
            "LogConfig": {
                "Type": "json-file",
                "Config": {}
            },
            "NetworkMode": "docker1",
            "PortBindings": {},
            .
        "NetworkSettings": {
          
            "Networks": {
                "docker1": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "a1a6d02bb8ba"
                    ],
                    "NetworkID": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
                    "EndpointID": "6611729f48e83c6c5b6829dd4cdb6437aca1aa0796679b9c6815769fac48a5cc",
                    "Gateway": "192.168.1.1",
                    "IPAddress": "192.168.1.3",
                    "IPPrefixLen": 24,
                    "
                }
            }
        }
    }
]

#查看容器mycentos6配置信息:发现网络在docker2中,子网范围在192.168.2.0/24范围中
[root@localhost zph]# docker inspect mycentos6
[
            ...
            "NetworkMode": "docker2",
            "PortBindings": {},
            "RestartPolicy": {
                "Name": "no",
                "MaximumRetryCount": 0
            },
            
            "Networks": {
                "docker2": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "a6ed25db1e1e"
                    ],
                    "NetworkID": "2d9c2d29e6d308733bf266978914a6b43cbab575a2d99d0928908bc09a6d4f40",
                    "EndpointID": "7973882a048f4d78a8d3f72e93b8f8a7ee914841689f8d342116a8be9a1ffb5d",
                    "Gateway": "192.168.2.1",
                    "IPAddress": "192.168.2.2",
                    "IPPrefixLen": 24,
                    ...
                }
            }
        }
    }
]


#查看容器mycentos7配置信息:发现网络在docker2中,子网范围在192.168.2.0/24范围中
[root@localhost zph]# docker inspect mycentos7
[
        ...
        "Config": {
            
        "NetworkSettings": {
          ...
            "Networks": {
                "docker2": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": [
                        "63aaf78d8a85"
                    ],
                    "NetworkID": "2d9c2d29e6d308733bf266978914a6b43cbab575a2d99d0928908bc09a6d4f40",
                    "EndpointID": "d980fd516be8c6260647579dcad6e5dc9376e4090b7560ab206b04a3ce3ba5a0",
                    "Gateway": "192.168.2.1",
                    "IPAddress": "192.168.2.3",
                    "IPPrefixLen": 24,
                   ...
                }
            }
        }
    }
]

#查看docker1网络:发现mycentos4,mycentos5容器在网络中
[root@localhost zph]# docker inspect docker1
[
    {
        "Name": "docker1",
        "Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
        "Created": "2023-11-20T18:19:18.375826061-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
       ...
        "ConfigOnly": false,
        "Containers": {
            "0ef1ea47894936e011c3efbafd5dbc49df14e5285f836a08345a48eb800349e6": {
                "Name": "mycentos4",
                "EndpointID": "da176af0d1630cd9ab8c0bb78e6a3974933686f66f9c334c83b0b622f0b1d3fb",
                "MacAddress": "02:42:c0:a8:01:02",
                "IPv4Address": "192.168.1.2/24",
                "IPv6Address": ""
            },
            "a1a6d02bb8ba6ce5bfdc96b32e7d16d8e76ce9960656dab3a2281bf46fa86793": {
                "Name": "mycentos5",
                "EndpointID": "6611729f48e83c6c5b6829dd4cdb6437aca1aa0796679b9c6815769fac48a5cc",
                "MacAddress": "02:42:c0:a8:01:03",
                "IPv4Address": "192.168.1.3/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

#查看docker2网络:发现mycentos6,mycentos7容器在网络中
[root@localhost zph]# docker inspect docker2
[
    {
        "Name": "docker2",
        "Id": "2d9c2d29e6d308733bf266978914a6b43cbab575a2d99d0928908bc09a6d4f40",
        "Created": "2023-11-20T18:21:29.173750083-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.2.0/24",
                    "Gateway": "192.168.2.1"
                }
            ]
        },
        ...
        "Containers": {
            "63aaf78d8a855dd6700b1e7c91b206103155871b845f6de863eff6907896d5cc": {
                "Name": "mycentos7",
                "EndpointID": "d980fd516be8c6260647579dcad6e5dc9376e4090b7560ab206b04a3ce3ba5a0",
                "MacAddress": "02:42:c0:a8:02:03",
                "IPv4Address": "192.168.2.3/24",
                "IPv6Address": ""
            },
            "a6ed25db1e1e221eb510ad80646674d775313977360dda6070f24b320230e6fd": {
                "Name": "mycentos6",
                "EndpointID": "7973882a048f4d78a8d3f72e93b8f8a7ee914841689f8d342116a8be9a1ffb5d",
                "MacAddress": "02:42:c0:a8:02:02",
                "IPv4Address": "192.168.2.2/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

使用主机名称可以 ping 通

这样就把 centos4 和 centos5 ,centos6 和 centos7 分别加入了自定义的dockert1,docker2 网络,这样的话 centos4和 centos5是互通的,centos6和 centos7 是互通的,但是docker1,docker2 网络 docker0 网络默认是不互通的

(6).docker network connect****实现不同网络之间的连通

如上图,如果想my centos2 可以 访问docker1 里面的 centos4 和 centos5 ,这个时候
就需要使用 docker network connect来实现

bash 复制代码
#查看mycentos2 ip地址: 发现是 172.17.0.3
[root@localhost zph]# docker exec -it mycentos2 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.3  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:03  txqueuelen 0  (Ethernet)
        RX packets 68  bytes 5754 (5.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 6  bytes 476 (476.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

#查看mycentos4 ip地址: 发现是 192.168.1.2  
[root@localhost zph]# docker exec -it mycentos4 ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.2  netmask 255.255.255.0  broadcast 192.168.1.255
        ether 02:42:c0:a8:01:02  txqueuelen 0  (Ethernet)
        RX packets 45  bytes 5699 (5.5 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

说明mycentos2和mycentos4直接是不能通信的,因为他们不在同一个网段,如果想他们通信,就需要把mycentos2加入到mycentos4的网段中才得行,这样就需要使用docker network connect语句来实现了,语法:

bash 复制代码
#网络名:可以通过docker network ls查看
docker network connect 网络名 容器名/容器ID
bash 复制代码
#把mycentos2容器加入docker1网络
[root@localhost zph]# docker network connect docker1 mycentos2

#查看dokcer1网络,发现容器中已经加入了mycentos2了
[root@localhost zph]# docker network inspect docker1
[
    {
        "Name": "docker1",
        "Id": "c0fbaf2266c86f504d02a9324c45fb49c1909f908631d6a2cd5b1bb04dc981a8",
        "Created": "2023-11-20T18:19:18.375826061-08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": {},
            "Config": [
                {
                    "Subnet": "192.168.1.0/24",
                    "Gateway": "192.168.1.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {
            "005f0e3b21e468d2526f4b444b82b9459599d64db465cf029cc7b1794351cd64": {
                "Name": "mycentos2",
                "EndpointID": "144b2d2989d1aded19d04229865aa9beacc72e95cae36acc30fd719e578c0b1d",
                "MacAddress": "02:42:c0:a8:01:04",
                "IPv4Address": "192.168.1.4/24",
                "IPv6Address": ""
            },
            "0ef1ea47894936e011c3efbafd5dbc49df14e5285f836a08345a48eb800349e6": {
                "Name": "mycentos4",
                "EndpointID": "da176af0d1630cd9ab8c0bb78e6a3974933686f66f9c334c83b0b622f0b1d3fb",
                "MacAddress": "02:42:c0:a8:01:02",
                "IPv4Address": "192.168.1.2/24",
                "IPv6Address": ""
            },
            "a1a6d02bb8ba6ce5bfdc96b32e7d16d8e76ce9960656dab3a2281bf46fa86793": {
                "Name": "mycentos5",
                "EndpointID": "6611729f48e83c6c5b6829dd4cdb6437aca1aa0796679b9c6815769fac48a5cc",
                "MacAddress": "02:42:c0:a8:01:03",
                "IPv4Address": "192.168.1.3/24",
                "IPv6Address": ""
            }
        },
        "Options": {},
        "Labels": {}
    }
]

#mycentos4 ping mycentos2,可以ping通
[root@localhost zph]# docker exec -it mycentos4 ping mycentos2
PING mycentos2 (192.168.1.4) 56(84) bytes of data.
64 bytes from mycentos2.docker1 (192.168.1.4): icmp_seq=1 ttl=64 time=0.176 ms
64 bytes from mycentos2.docker1 (192.168.1.4): icmp_seq=2 ttl=64 time=0.058 ms

这样就实现了不同网络不同容器之间的通信了

[上一节][Docker]六.Docker自动部署nodejs以及golang项目

[下一节][Docker]八.Docker 容器跨主机通讯

相关推荐
wanhengidc14 分钟前
短视频运营行业该如何选择服务器?
运维·服务器
雨中rain28 分钟前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
-KamMinG39 分钟前
Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
运维·grafana
Bessssss1 小时前
centos日志管理,xiao整理
linux·运维·centos
豆是浪个1 小时前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&1 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
王铁柱子哟-1 小时前
解决 正在下载VS Code 服务器... 问题
运维·服务器
我自飞扬临天下1 小时前
Docker常用命令
docker
chinayu20072 小时前
虚拟机桥接模式
linux·运维·桥接模式
vvw&2 小时前
如何在 Ubuntu 22.04 上安装 Graylog 开源日志管理平台
linux·运维·服务器·ubuntu·开源·github·graylog