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

不少状况下,同一虚机或不一样虚机中的不一样容器间有互通的要求。看看经常使用的方法有哪些吧java

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

[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自身实现解析的mysql

[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",nginx

可是须要注意的是:--link是单向的,也就是centos2能够访问centos1,可是centos1没法访问centos2,这里的访问是指经过名字访问哈。赞成虚机中的两个容器,知道IP地址确定是能互ping通的。web

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

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

一、首先运行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的脚本和建立时的命令;centos

查看docker官网mysql:5.7的dockerfilebash

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

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

ENTRYPOINT ["docker-entrypoint.sh"]

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

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

三、而后,启动 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$ 

四、最后,启动 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
相关文章
相关标签/搜索