1. 程式人生 > 其它 >docker網路之容器互聯:--link

docker網路之容器互聯:--link

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