Torres-tao  

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
posted on   雷子锅  阅读(705)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
 
点击右上角即可分享
微信分享提示