Docker --link实现源容器与接收容器通信

docker间常常需要互联或者说通信,比如后台程序访问数据库容器,一般是需要ip+端口的形式,然而ip是经常会变化的,docker中采用link来为容器起个名字,以后访问只要名字+端口就行了,这样减少了ip访问下,ip常发生变化而导致的问题

操作概述,在创建第二个容器时,将第二个容器link到第一个容器中,这样第一个容器访问第二个容器时利用名字就能访问。

 

docker run --link的作用


docker run --link可以用来链接2个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接收容器可以获取源容器的一些数据,如源容器的环境变量。

--link的格式:

--link <name or id>:alias

其中,name和id是源容器的name和id,alias是源容器在link下的别名。

源容器

创建并启动名为selenium_hub的容器。

[root@www ~]# docker run  -itd  --name os1 centos7-ssh  /bin/bash
5918f085120250968a94285466f43aee54b5be35ce24c1a0d42c2cd2e812ade2
[root@www ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5918f0851202        centos7-ssh         "/bin/bash"         3 seconds ago       Up 2 seconds        22/tcp              os1

接收容器

创建并启动名为node的容器,并把该容器和名为selenium_hub的容器链接起来。

[root@www ~]# docker run  -itd  --name os2 --link os1:hub  centos7-ssh 
8ff11199385ef35cf90bde523596d2e4b3fe887a6e7434af900c1fadf7c7ae9c
[root@www ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS               NAMES
8ff11199385e        centos7-ssh         "/bin/sh -c /usr/sbi??   3 seconds ago        Up 2 seconds        22/tcp              os2
5918f0851202        centos7-ssh         "/bin/bash"              About a minute ago   Up About a minute   22/tcp              os1

其中:--link os1:hub

os1是上面启动的5918f0851202 容器的名字,这里作为源容器,hub是该容器在link下的别名(alias),通俗易懂的讲,站在os2容器的角度,os1和hub都是5918f0851202容器的名字,并且作为容器的hostname,os2用这2个名字中的哪一个都可以访问到5918f0851202 容器并与之通信(docker通过DNS自动解析)。我们可以来看下:

[root@www ~]# docker exec -it 8ff11199385e  /bin/bash
[root@8ff11199385e ~]# ping os1
PING hub (172.17.0.2) 56(84) bytes of data.
64 bytes from hub (172.17.0.2): icmp_seq=1 ttl=64 time=0.369 ms
64 bytes from hub (172.17.0.2): icmp_seq=2 ttl=64 time=0.075 ms
^C


[root@8ff11199385e ~]# ping hub 
PING hub (172.17.0.2) 56(84) bytes of data.
64 bytes from hub (172.17.0.2): icmp_seq=1 ttl=64 time=0.043 ms
64 bytes from hub (172.17.0.2): icmp_seq=2 ttl=64 time=0.044 ms
^C

#docker会将源容器的host更新到目标容器的/etc/hosts中,我们再进入os2容器,查看os2容器中的/etc/hosts文件的内容
[root@8ff11199385e ~]# 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	hub 5918f0851202 os1
172.17.0.3	8ff11199385e

其中172.17.0.3是os2容器的ip,并使用os2容器的容器id作为host name。另外,源容器的ip和hostname也写进来了,172.17.0.2是os1容器的ip,hub是容器在link下的alias,后面是hub容器的容器id。如果重启了源容器,接收容器的/etc/hosts会自动更新源容器的新ip。可见,os1和hub都指向172.17.0.2。

 

总结


在--link标签下,接收容器就是通过设置环境变量和更新/etc/hosts文件来获取源容器的信息,并与之建立通信和传递数据的。

在docker的后续版本中,会取消docker run中的--link选项,但了解其如何在2个容器之间建立通信的原理是非常有用的,因为这有助于理解如何用官方推荐的所有容器在同一个network下来通信的方法,以及用docker-compose来链接2个容器来通信的方法。

需要注意一下几点:

  1. 使用link选项建立的容器所链接的主机需要在运行状态
  2. 使用link选项建立的容器运行时需要所链接的容器也必须是运行状态
  3. 使用link选项链接的主机ip不需要固定,因为每次新建容器都会检查所链接容器的ip,在/etc/hosts里生成新的alias 名称对应的ip
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值