六、docker中容器间的互联(--link)

很多情况下,同一虚机或不同虚机中的不同容器间有互通的要求。看看常用的方法有哪些吧

先看看同一虚机中的不同容器间互通:

复制代码
[root@docker-1-26 ~]# docker run -d --name centos1 --privileged=true  centos:centos7 /usr/sbin/init      #先通过centos7的镜像起两个容器
d1bb318b462e7e928d7b743fe90daa17ec28c47e4f5c7ed317ad981bfd2a8266 
[root@docker-1-26 ~]# docker run -it --name centos2 --privileged=true --link centos1:centos1_to_2 centos:centos7 /usr/sbin/init  #创建第二个容器的使用使用--link参数连接一个容器
[root@docker-1-26 ~]# 
[root@docker-1-26 ~]# docker ps -a 
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
b823c5dc34e3        centos:centos7      "/usr/sbin/init"    19 seconds ago       Up 18 seconds                           centos2
d1bb318b462e        centos:centos7      "/usr/sbin/init"    About a minute ago   Up About a minute                       centos1
[root@docker-1-26 ~]# 
复制代码
--link list                      Add link to another container
--link centos1:centos1_to_2  #需要连接的容器是centos1,连接以后的名字时centos1_to_2
复制代码
[root@docker-1-26 ~]# docker exec -it b823 /bin/bash    #进入容器后
[root@b823c5dc34e3 /]# 
[root@b823c5dc34e3 /]# ping centos1_to_2    #通过上面创建时连接的名字,进行ping测试,发现解析出来的地址为172.17.0.2
PING centos1_to_2 (172.17.0.2) 56(84) bytes of data.
64 bytes from centos1_to_2 (172.17.0.2): icmp_seq=1 ttl=64 time=0.678 ms
64 bytes from centos1_to_2 (172.17.0.2): icmp_seq=2 ttl=64 time=0.074 ms
64 bytes from centos1_to_2 (172.17.0.2): icmp_seq=3 ttl=64 time=0.102 ms
64 bytes from centos1_to_2 (172.17.0.2): icmp_seq=4 ttl=64 time=0.082 ms
^C
--- centos1_to_2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.074/0.234/0.678/0.256 ms
[root@b823c5dc34e3 /]# 
复制代码

对比centos2容器的域名解析发现,正常情况下只有本身容器的地址,解析方式是通过docker自身实现解析的

复制代码
[root@b823c5dc34e3 /]# 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.2    centos1_to_2 d1bb318b462e centos1 #通过link参数连接后,创建的容器域名解析文件中解析出了被连接主机的信息  
172.17.0.3    b823c5dc34e3
[root@b823c5dc34e3 /]# 

[root@docker-1-26 ~]# docker container inspect d1| grep IPAd
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",

复制代码

但是需要注意的是:--link是单向的,也就是centos2可以访问centos1,但是centos1无法访问centos2,这里的访问是指通过名字访问哈。同意虚机中的两个容器,知道IP地址肯定是能互ping通的。

--link常用在将允许在不同容器的服务连接起来实现一个完成的功能,下面我用就zabbix官网的从容器安装指导简单部署一下zabbix。可参照:https://www.zabbix.com/documentation/4.0/zh/manual/installation/containers

这里就运行 MySQL 数据库支持、基于 Nginx Web 服务器的 Zabbix Web 界面和 Zabbix Java gateway。

1、首先运行mysql容器

复制代码
docker run --name mysql-server -t \      #-t 开启终端
      -e MYSQL_DATABASE="zabbix" \       #-e 配置环境变量  创建一个库
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -d mysql:5.7 \
      --character-set-server=utf8 --collation-server=utf8_bin  #这里在最后还能跟命令??检查mysql:5.7的镜像,发现用到了entrypoint,所以这里可以跟其他的命令,而不影响容器被夯住

[root@docker-1-26 ~]# docker ps -a --no-trunc -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28134782feb670a88789a6c86d14b07398dda19d69f8f8931b90599e2bdcf549 mysql:5.7 "docker-entrypoint.sh --character-set-server=utf8 --collation-server=utf8_bin" About a minute ago Up About a minute 3306/tcp, 33060/tcp mysql-server  #这条command就是说entrypoint的脚本和创建时的命令;

查看docker官网mysql:5.7的dockerfile

COPY docker-entrypoint.sh /usr/local/bin/

RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat

ENTRYPOINT ["docker-entrypoint.sh"]

复制代码

2、其次,启动 Zabbix Java gateway 实例

docker run --name zabbix-java-gateway -t \
      -d zabbix/zabbix-java-gateway:latest

3、然后,启动 Zabbix server 实例,并将其关联到已创建的 MySQL server 实例。

复制代码
docker run --name zabbix-server-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      -e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
      --link mysql-server:mysql \              #这里使用的也是--link实现zabbix server实例与刚创建的管理
      --link zabbix-java-gateway:zabbix-java-gateway \
      -p 10051:10051 \
      -d zabbix/zabbix-server-mysql:latest
复制代码
复制代码
[root@docker-1-26 ~]# docker exec -it zabbix-server-mysql bash 
bash-5.0$ 
bash-5.0$ 
bash-5.0$ 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.4    mysql 28134782feb6 mysql-server  #配饰--link后的解析结果
172.17.0.5    zabbix-java-gateway 1dddbb822f3a
172.17.0.6    9f1a532a2814
bash-5.0$ 
复制代码

4、最后,启动 Zabbix Web 界面,并将其关联到已创建的 MySQL server 和 Zabbix server 实例。

复制代码
docker run --name zabbix-web-nginx-mysql -t \
      -e DB_SERVER_HOST="mysql-server" \
      -e MYSQL_DATABASE="zabbix" \
      -e MYSQL_USER="zabbix" \
      -e MYSQL_PASSWORD="zabbix_pwd" \
      -e MYSQL_ROOT_PASSWORD="root_pwd" \
      --link mysql-server:mysql \
      --link zabbix-server-mysql:zabbix-server \
      -p 80:80 \
      -d zabbix/zabbix-web-nginx-mysql:latest
复制代码

 

posted @   woshinidaye  阅读(394)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· Qt个人项目总结 —— MySQL数据库查询与断言
点击右上角即可分享
微信分享提示