Docker 学习 | 网络连通

335 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Docker 学习 | 网络连通

本文研究 Docker 自定义创建的多个 docker 网络之间如何连通

准备工作

创建一个Docker自定义网络

# 我们自定义一个网络
# docker network create 
# --driver bridge 
# --subnet 192.168.0.0/16
# --gateway 192.168.0.1
# mynet
$ docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

现在我们就有两个网络了 , 一个 Docker0 一个 mynet

使用我们创建的mynet网络创建两个 Tomcat 容器

$ docker run -d -P --name tomcat-net-01 --net mynet mytomcat
$ docker run -d -P --name tomcat-net-02 --net mynet mytomcat

使用默认 Docker0 网络创建两个 Tomcat 容器

$ docker run -d -P --name tomcat-01  mytomcat
$ docker run -d -P --name tomcat-02  mytomcat

Tomcat-01 Tomcat-02 如何能 ping 通 tomcat-net-01 tomcat-net-02 呢?

$ docker exec -it tomcat-01 ping tomcat-net-01

ping: tomcat-net-01: Name or service not known # ping 不通

打通 Docker0 和 mynet

docker network connect 连接一个容器到网络

$ docker network connect --help

Usage:  docker network connect [OPTIONS] NETWORK CONTAINER

Connect a container to a network

Options:
      --alias strings           Add network-scoped alias for the container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the container
# 测试: 打通 tomcat-01 到 mynet
$ docker network connect mynet tomcat-01
# 将 tomcat-01 放到了 mynet 网络下

# 一个容器两个 IP 地址

docker inspect mynet 查看连通结果

 "Containers": {
 						# tomcat-01 已经加入到 mynet 网络
            "6624b5f469ed47b1d450d9797c5fd1857b59d561e812c4b5a34ecb07a34f5627": {
                "Name": "tomcat-01",
                "EndpointID": "1b4e9858a366b459990a042236cc3647b407995bf8b030bd3891fbb377751b10",
                "MacAddress": "02:42:c0:a8:00:04",
                "IPv4Address": "192.168.0.4/16",
                "IPv6Address": ""
            },
            "9b19e655ee16fb21a6de8313bea2efcf0c067c78c231d00b43db842c88a47ed3": {
                "Name": "tomcat-net-02",
                "EndpointID": "3306d678dfebfd86fa84f76abac44b1fb14fa8a4782af46b91f2f9745f4f4310",
                "MacAddress": "02:42:c0:a8:00:03",
                "IPv4Address": "192.168.0.3/16",
                "IPv6Address": ""
            },
            "bd090d6d03dc520808c4ec2a0ba7fba93bbbed8ecbd83cdb19838d3350088464": {
                "Name": "tomcat-net-01",
                "EndpointID": "2800a0372352de17eb07f89a8d13dab09c50a76f42716b376b96573c97c05417",
                "MacAddress": "02:42:c0:a8:00:02",
                "IPv4Address": "192.168.0.2/16",
                "IPv6Address": ""
            }
        },

再次使用 tomcat-01 Ping tomcat-net-01

$ docker exec -it tomcat-01 ping tomcat-net-01
PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.104 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.059 ms
64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.055 ms
^C
--- tomcat-net-01 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3111ms
rtt min/avg/max/mdev = 0.051/0.067/0.104/0.022 ms

# ping 通大功告成

结论

假设要跨网络操作容器, 就需要docker network connect连通网络

image.png