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
相關文章
相關標籤/搜索