docker網路之容器互聯:--link
阿新 • • 發佈:2022-04-20
docker網路之容器互聯:--link
Docker中存在多個容器時,容器與容器之間經常需要進行通訊,例如nacos訪問mysql,redis叢集中各個節點之間的通訊。
通過容器名稱互聯
在同一個宿主機上的容器之間可以通過自定義的容器名稱相互訪問,比如一個業務前端靜態頁面是使用nginx,動態頁面使用的是tomcat,由於容器在啟動的時候其內部的IP地址是DHCP隨機分配的,因此如果通過內部訪問的話,自定義名稱是相對比較固定的,比較適用於此場景。
啟動第一個容器
[root@aliyun ~]# docker run -itd --name tomcat01 -p 8088:8080 tomcat 70892d9cd0c7ec7efb6b2deedeca979b8917ab885db8c4d0b0a6d808a37d0777 #進入容器檢視hosts檔案 [root@aliyun ~]# docker exec -it tomcat01 /bin/bash root@70892d9cd0c7:/usr/local/tomcat# cd root@70892d9cd0c7:~# 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.18.0.2 70892d9cd0c7
啟動第二個容器,與第一個容器連通
[root@aliyun ~]# docker run -itd --name nginx01 --link tomcat01 nginx b7837c95dd7c5e9d0a3d1f64c793a5081d8d8c35080e6ba72bdc069af6092001 [root@aliyun ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b7837c95dd7c nginx "/docker-entrypoint.…" 4 seconds ago Up 4 seconds 80/tcp nginx01 70892d9cd0c7 tomcat "catalina.sh run" 4 minutes ago Up 4 minutes 0.0.0.0:8088->8080/tcp tomcat01 [root@aliyun ~]# docker exec -it nginx01 /bin/bash #檢視容器hosts檔案,發現記錄這第一個容器的ip資訊:172.18.0.2 tomcat01 70892d9cd0c7 root@b7837c95dd7c:/# 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.18.0.2 tomcat01 70892d9cd0c7 172.18.0.3 b7837c95dd7c
測試連通性
[root@aliyun ~]# docker exec -it nginx01 ping tomcat01 PING tomcat01 (172.18.0.2): 56 data bytes 64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.102 ms 64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.093 ms 64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.110 ms 64 bytes from 172.18.0.2: icmp_seq=3 ttl=64 time=0.073 ms ^C--- tomcat01 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.073/0.095/0.110/0.000 ms
注意:nginx01可以ping通tomcat01,但是反向是ping不通的
通過自動啟容器別名互聯
由於自定義的容器名稱可能後期發生變化,一旦容器名稱發生變化,程式之間也會隨之發生變化,比如程式通過容器名稱進行服務呼叫,但是容器名稱發生變化之後再使用之前的名稱肯定無法成功呼叫,每次都進行更改的話又比較麻煩,因此可以使用自定義別名的方式解決,即容器名稱可以隨意變更,只要不更改別名即可。格式如下:
$ docker run -d --name 新容器名稱 --link 目標容器名稱:自定義的名稱 -p 本地埠:容器埠 映象名稱 shell命令
#建立容器tesk-link
[root@aliyun ~]# docker run -d --name tesk-link --link tomcat01:java-server -P nginx:v1
01fde69ddd192d56039b7d108a2acdd5344c56da64a9b030f8112a06e954d684
[root@aliyun ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
01fde69ddd19 nginx:v1 "/docker-entrypoint.…" 4 seconds ago Up 2 seconds 0.0.0.0:49160->80/tcp tesk-link
b7837c95dd7c nginx "/docker-entrypoint.…" 15 minutes ago Up 15 minutes 80/tcp nginx01
70892d9cd0c7 tomcat "catalina.sh run" 19 minutes ago Up 19 minutes 0.0.0.0:8088->8080/tcp tomcat01
#進入容器tesk-link
[root@aliyun ~]# docker exec -it 01fde69ddd19 /bin/bash
#檢視/etc/hosts
root@01fde69ddd19:/# 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.18.0.2 java-server 70892d9cd0c7 tomcat01
172.18.0.4 01fde69ddd19
#測試連通性
root@01fde69ddd19:/# ping java-server
PING java-server (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.129 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.105 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.101 ms
^C--- java-server ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.101/0.112/0.129/0.000 ms