六、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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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数据库查询与断言