Docker 容器互联
一、容器互联之--link
接上节【Docker 学习笔记(十六)— Docker0 网络详解】,我们知道通过 ip 测试 ping 连接,容器内部是可以 ping 通的。
那么通过容器名是否能够互相 ping 通?
# 测试:通过容器名 ping 连接 [root@cloud ~]# docker exec -it tomcat02 ping tomcat01 ping: tomcat01: Name or service not known # 发现无法 ping 通
解决方法:
通过--link
就可以解决网络连通问题
# --link 命令 [root@cloud ~]# docker run -d -P --name tomcat03 --link tomcat02 tomcat:9.0 c33876c9c6c53dd5c3e722265f4a7bead9a4afa011db547fc6efe44e52a19f28 # 再次测试通过容器名 ping 连接,发现能 ping 通! [root@cloud ~]# docker exec -it tomcat03 ping tomcat02 PING tomcat02 (172.17.0.3) 56(84) bytes of data. 64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.203 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.077 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.076 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.069 ms 64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.081 ms # 反向是否可以 ping 通? [root@cloud ~]# docker exec -it tomcat02 ping tomcat03 ping: tomcat03: Name or service not known # 发现 --link 是单向的,tomcat02 无法 ping 通 tomcat03
查看 tomcat03 的配置文件
# 查看 tomcat03 的 hosts 文件 [root@cloud ~]# docker exec -it tomcat03 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 tomcat02 418b6338ca59 172.17.0.4 c33876c9c6c5 # 发现 --link 就是在 hosts 配置文件中增加了一个 172.17.0.3 tomcat02 418b6338ca59 映射 # 反之,在 tomcat02 的配置文件中并没有这样一个配置,所以反向是无法 ping 通的! [root@cloud ~]# docker exec -it tomcat02 cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.3 418b6338ca59
总结:
现在 Docker 已经不建议使用
使用自定义网络,不使用 docker0!
docker0 是一个官方的网桥,有很多局限,它不支持容器名连接访问!
现在 Docker 已经不建议使用
--link
了使用自定义网络,不使用 docker0!
docker0 是一个官方的网桥,有很多局限,它不支持容器名连接访问!
二、容器互联之自定义网络
查看所有的 docker 网络
[root@cloud ~]# docker network --help [root@cloud ~]# docker network ls NETWORK ID NAME DRIVER SCOPE bdfb62a5d66a bridge bridge local a892ce6ea3b7 host host local 224773ce41ec none null local
网络模式:
bridge:桥接模式(默认,自己创建的网络也使用桥接模式),即在 docker 上搭桥
host:和宿主机共享网络
none:不配置网络
container:容器内网络联通(用的少,局限很大,不建议使用)
bridge:桥接模式(默认,自己创建的网络也使用桥接模式),即在 docker 上搭桥
host:和宿主机共享网络
none:不配置网络
container:容器内网络联通(用的少,局限很大,不建议使用)
# 我们直接启动一个容器的命令时,默认就带参数--net bridge,它就是 docker0。 docker run -d -P --name tomcat01 tomcat:9.0 docker run -d -P --name tomcat01 --net bridge tomcat:9.0 # 等同上面的命令 # docker0 特点:默认,域名不能访问,--link 可以打通连接!
自定义网络
# 删除所有容器,保证测试环境干净 [root@cloud ~]# docker rm -f $(docker ps -aq) # 自定义一个网络 mynet # --driver bridge 桥接 # --subnet 192.168.0.0/16 子网 # --gateway 192.168.0.1 网关,路由器地址 [root@cloud ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet 8adf8a0dbc9b5f7f012eea6d355bcbde36447be6f75d3e172edb0d0e42987513 # 查看 docker 网络,多了一个 mynet [root@cloud ~]# docker network ls NETWORK ID NAME DRIVER SCOPE bdfb62a5d66a bridge bridge local a892ce6ea3b7 host host local 8adf8a0dbc9b mynet bridge local 224773ce41ec none null local
查看 mynet 信息
[root@cloud ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "8adf8a0dbc9b5f7f012eea6d355bcbde36447be6f75d3e172edb0d0e42987513", "Created": "2021-12-18T14:47:08.679352116+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": {}, "Options": {}, "Labels": {} } ] # 到这里,网络就创建好了
用自定义的网络 mynet 启动 2 个容器
[root@cloud ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat:9.0 beb804f98f26e8ba89e5da51d7e9c72d0836d765c667bb7632438c181bc64cd8 [root@cloud ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat:9.0 c0fc4067aad37f500d4876d19fc25d6ea2715b2732da17c05d032709d08ea4e8
再次查看 mynet 信息,可以看到有两个关联的容器 tomcat-net-01,tomcat-net-02
[root@cloud ~]# docker network inspect mynet [ { "Name": "mynet", "Id": "8adf8a0dbc9b5f7f012eea6d355bcbde36447be6f75d3e172edb0d0e42987513", "Created": "2021-12-18T14:47:08.679352116+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": {}, "Config": [ { "Subnet": "192.168.0.0/16", "Gateway": "192.168.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "beb804f98f26e8ba89e5da51d7e9c72d0836d765c667bb7632438c181bc64cd8": { "Name": "tomcat-net-01", "EndpointID": "e7e4d1e3e726d3238ad1b4d9d44b5919c935d3734eac8cf6fca3d0bd8c88015b", "MacAddress": "02:42:c0:a8:00:02", "IPv4Address": "192.168.0.2/16", "IPv6Address": "" }, "c0fc4067aad37f500d4876d19fc25d6ea2715b2732da17c05d032709d08ea4e8": { "Name": "tomcat-net-02", "EndpointID": "9f98a98fdeb39f361e3294989260a844b0aaa1af95977d3940b12b1b54245a4b", "MacAddress": "02:42:c0:a8:00:03", "IPv4Address": "192.168.0.3/16", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
再次测试 ping 连接
# 通过 ip 测试 ping 连接 [root@cloud ~]# docker exec -it tomcat-net-01 ping 192.168.0.3 PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data. 64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.210 ms 64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.103 ms 64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.099 ms 64 bytes from 192.168.0.3: icmp_seq=4 ttl=64 time=0.110 ms # 通过容器名测试 ping 连接,发现不使用--link 也可以连接了! [root@cloud ~]# docker exec -it tomcat-net-01 ping tomcat-net-02 PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data. 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.071 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.083 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.129 ms 64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=4 ttl=64 time=0.078 ms
总结:
自定义的网络,docker 已经维护了对应的关系。
优点:不同的集群(redis,mysql)使用不同的网络,保证集群的健康和安全
自定义的网络,docker 已经维护了对应的关系。
优点:不同的集群(redis,mysql)使用不同的网络,保证集群的健康和安全
三、网络连通(不在同一网段的两个容器)
测试不同网段的容器是否能 ping 通
# 使用默认网络 docker0(即 bridge)创建 2 个容器 tomcat01,tomcat02 [root@cloud ~]# docker run -d -P --name tomcat01 tomcat:9.0 7b15c071d18638e893147af8ead378a0bf7a6a3d9c2d230ef0871b80df824a47 [root@cloud ~]# docker run -d -P --name tomcat02 tomcat:9.0 c3f9671c0011726f9f1a06414e63f1dbedfc1d7493ac1856e3c42b8c2f18c885 # 测试 tomcat01 尝试 ping 连接 tomcat-net-01,发现不能 ping 通 [root@cloud ~]# docker exec -it tomcat01 ping tomcat-net-01 ping: tomcat-net-01: Name or service not known
# 测试打通 tomcat01 - mynet [root@cloud ~]# docker network connect mynet tomcat01 # 查看 mynet 网络信息 [root@cloud ~]# docker network inspect mynet # 发现:连通之后,就是将 tomcat01 放到了 mynet 网络下,即一个容器两个 ip 地址!
再次 ping 测试
# tomcat01 连通 ok [root@cloud ~]# docker exec -it tomcat01 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.162 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.083 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.082 ms 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=4 ttl=64 time=0.082 ms # tomcat02 依旧不通(因为 tomcat02 与 mynet 网络没有打通) [root@cloud ~]# docker exec -it tomcat02 ping tomcat-net-01 ping: tomcat-net-01: Name or service not known
结论:
如果需要跨网络操作容器,则需要使用
如果需要跨网络操作容器,则需要使用
docker network connect
连通
分享:Docker 学习视频地址:【狂神说 Java】Docker 最新超详细版教程通俗易懂