一、啟動兩個容器測試
1.創建容器:
# 啟動第一個容器
[root@yang ~]# docker run -it -d --name tomcat1 tomcat
# 啟動第二個容器
[root@yang ~]# docker run -it -d --name tomcat2 tomcat
[root@yang ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fcdd4c02da9c tomcat "catalina.sh run" 2 hours ago Up 2 hours 8080/tcp tomcat2
346962a1d73b tomcat "catalina.sh run" 5 hours ago Up 5 hours 8080/tcp tomcat1
2.測試兩個容器間連通性
[root@yang ~]# docker exec -it tomcat1 ping tomcat2 ping: tomcat2: No address associated with hostname
以上顯示兩個容器之前ping不通!
思考:怎么做才能讓兩個容器之間ping通呢?
二、具體演示
1.創建容器:
# 啟動第一個容器
[root@yang ~]# docker run -it -d --name tomcat3 --link tomcat2 tomcat
--link # 在hosts配置中,指定某容器的映射
2.測試
[root@yang ~]# docker exec -it tomcat3 ping tomcat2 PING tomcat2 (172.17.0.9) 56(84) bytes of data. 64 bytes from tomcat2 (172.17.0.9): icmp_seq=1 ttl=64 time=0.247 ms 64 bytes from tomcat2 (172.17.0.9): icmp_seq=2 ttl=64 time=0.089 ms 64 bytes from tomcat2 (172.17.0.9): icmp_seq=3 ttl=64 time=0.105 ms
查看tomcat3中配置:
[root@yang ~]# docker inspect tomcat3 [ { "Id": "ee6a1fd2ba6708fe79f3708489e44e8aa00f9404640c585ae1d2ea5bd2395cdf", "Created": "2021-01-29T09:06:20.640610921Z", "Path": "catalina.sh", "Args": [ "run" ], "State": { "Status": "running", "Running": true, "Paused": false, "Restarting": false, "OOMKilled": false, "Dead": false, "Pid": 7964, "ExitCode": 0, "Error": "", "StartedAt": "2021-01-29T09:06:21.625013975Z", "FinishedAt": "0001-01-01T00:00:00Z" }, "Image": "sha256:345867df0879186da623555494dcf5f4561e5bf0b8d2e4276a71947f30bdca0d", "ResolvConfPath": "/var/lib/docker/containers/ee6a1fd2ba6708fe79f3708489e44e8aa00f9404640c585ae1d2ea5bd2395cdf/resolv.conf", "HostnamePath": "/var/lib/docker/containers/ee6a1fd2ba6708fe79f3708489e44e8aa00f9404640c585ae1d2ea5bd2395cdf/hostname", "HostsPath": "/var/lib/docker/containers/ee6a1fd2ba6708fe79f3708489e44e8aa00f9404640c585ae1d2ea5bd2395cdf/hosts", "LogPath": "/var/lib/docker/containers/ee6a1fd2ba6708fe79f3708489e44e8aa00f9404640c585ae1d2ea5bd2395cdf/ee6a1fd2ba6708fe79f3708489e44e8aa00f9404640c585ae1d2ea5bd2395cdf-json.log", "Name": "/tomcat3", "RestartCount": 0, "Driver": "overlay2", "Platform": "linux", "MountLabel": "", "ProcessLabel": "", "AppArmorProfile": "", "ExecIDs": null, "HostConfig": { "Binds": null, "ContainerIDFile": "", "LogConfig": { "Type": "json-file", "Config": {} }, "NetworkMode": "default", "PortBindings": {}, "RestartPolicy": { "Name": "no", "MaximumRetryCount": 0 }, "AutoRemove": false, "VolumeDriver": "", "VolumesFrom": null, "CapAdd": null, "CapDrop": null, "Capabilities": null, "Dns": [], "DnsOptions": [], "DnsSearch": [], "ExtraHosts": null, "GroupAdd": null, "IpcMode": "private", "Cgroup": "", "Links": [ "/tomcat2:/tomcat3/tomcat2" ],
以上links位置顯示,tomcat3綁定了tomcat2!
3.通過進入容器查看:
# 查看 hosts 配置,發現已經綁定!
[root@yang ~]# docker exec -it tomcat3 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.9 tomcat2 fcdd4c02da9c 172.17.0.10 ee6a1fd2ba67
其實tomcat3在本地就已經配置了tomcat2的配置了。
結論:
1.兩個容器間互相通信使用--link,可以實現互通。
2.docker0 不支持容器名連接訪問。
建議:
docker官方已不推薦使用docker run --link來鏈接2個容器互相通信,隨后的版本中會刪除--link,但了解其原理,對如何使2個容器之間互相通信還是有幫助。