前言
由于容器的 IP 地址会在容器重启后发生变化,因不能写死 IP 地址,使用容器的名字访问容器服务是最优的,所以就有了下文。
1.使用 --link 参考
docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。
--link的格式:
--link <name or id>:alias
其中,name和id是源容器的name和id,alias是源容器在link下的别名。
举例:
源容器
创建并启动名为nginx_test的容器。
[root@ambari01 ~]# docker run -d --name nginx_test nginx
接收容器
创建并启动名为node的容器,并把该容器和名为nginx的容器链接起来。
[root@ambari01 ~]# docker run -itd --name node --link nginx_test:nginx centos:7 bash
其中:
--link nginx_test:nginx
nginx_test是上面启动的源容器的名字,nginx是该容器在link下的别名,可省略。
通俗易懂的讲,站在node容器的角度,nginx_test和nginx都是指向提供nginx服务容器的名字,并且作为容器的hostname,node用这2个名字中的任何一个都可以访问到那个容器并与之通信(docker通过DNS自动解析)。我们可以来看下:
进入node容器:
[root@ambari01 ~]# docker exec -it nginx
[root@2398e6006f7e /]# ping nginx
PING nginx (172.17.0.5) 56(84) bytes of data.
64 bytes from nginx (172.17.0.5): icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from nginx (172.17.0.5): icmp_seq=2 ttl=64 time=0.045 ms
[root@2398e6006f7e /]# ping nginx_test
PING nginx (172.17.0.5) 56(84) bytes of data.
64 bytes from nginx (172.17.0.5): icmp_seq=1 ttl=64 time=0.060 ms
64 bytes from nginx (172.17.0.5): icmp_seq=2 ttl=64 time=0.058 ms
[root@2398e6006f7e /]# ping node
ping: node: Name or service not known
当使用--link时,docker会自动在接收容器内创建基于--link参数的环境变量:
docker会在接收容器中设置名为<alias>_NAME的环境变量,我们进入node容器,看下此环境变量:
[root@ambari01 ~]# docker exec -it node /bin/bash
[root@2398e6006f7e /]# env | grep -i nginx_name
NGINX_NAME=/node/nginx
另外,docker还会在接收容器中创建关于源容器暴露的端口号的环境变量,这些环境变量有一个统一的前缀名称: