Aeizzz / aeizzz

0 stars 2 forks source link

docker run --link #15

Open Aeizzz opened 5 years ago

Aeizzz commented 5 years ago

docker run --link的作用

docker run --link 是在docker启动时连接两个容器,使得源容器(被链接的容器)和接收容器(主动去链接的容器)之间可以互相通信,并且接受容器可以获取到源容器的一些配置,环境变量.

--link的格式:

--link :alias

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

docker 容器质检的通信使用dns 自动解析

在容器内你可以使用命令 ping 源容器的名字和$alias$ 的名字,他俩指向相同的ip地址

--link下容器间的通信

按照上述的方法就能把两个容器连接起来

那这2个容器间是怎么通信传送数据的呢?另外,前言中提到的接收容器可以获取源容器的一些信息,比如环境变量,又是怎么一回事呢?

设置环境变量

当使用--link时,docker会自动在接收容器内创建基于--link参数的环境变量: docker会在接收容器中设置名为<alias>_NAME的环境变量,该环境变量的值为:
<alias>_NAME=/接收容器名/源容器alias

docker还会在接收容器中创建关于源容器暴露的端口号的环境变量,这些环境变量有一个统一的前缀名称: <name>PORT<port>_<protocol>

<name>表示链接的源容器alias
<port>是源容器暴露的端口号
<protocol>是通信协议:TCP or UDP

docker用上面定义的前缀定义3个环境变量:

<name>PORT<port>_<protocol>ADDR
<name>PORT<port><protocol>PORT
<name>PORT<port><protocol>_PROTO

可以查看我一个应用连接数据库的环境变量

root@ae08f2270800:/# env | grep -i mariadb 
MARIADB_NAME=/domserver/mariadb
MARIADB_ENV_GPG_KEYS=199369E5404BD5FC7D2FE43BCBCB082A1BB943DB   177F4010FE56CA3336300305F1656F24C74CD1D8        430BDF5C56E7C94E848EE60C1C4CBDCDCD2EFD2A        4D1BB29D63D98E422B2113B19334A25F8507EFA5
MARIADB_ENV_GOSU_VERSION=1.10
MYSQL_HOST=mariadb
MARIADB_ENV_MYSQL_DATABASE=domjudge
MARIADB_PORT=tcp://172.17.0.2:3306
MARIADB_ENV_MARIADB_MAJOR=10.3
MARIADB_PORT_3306_TCP_ADDR=172.17.0.2
MARIADB_PORT_3306_TCP_PROTO=tcp
MARIADB_ENV_MARIADB_VERSION=1:10.3.10+maria~bionic
MARIADB_PORT_3306_TCP=tcp://172.17.0.2:3306
MARIADB_ENV_MYSQL_ROOT_PASSWORD=rootpw
MARIADB_ENV_MYSQL_PASSWORD=djpw
MARIADB_ENV_MYSQL_USER=domjudge
MARIADB_PORT_3306_TCP_PORT=3306

更新/etc/hosts文件

docker会将源容器的host更新到目标容器的/etc/hosts中: 我们再进入node容器,查看node容器中的/etc/hosts文件的内容:

root@ae08f2270800:/# 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      mariadb 9341398f03da dj-mariadb
172.17.0.3      ae08f2270800

可以看出连接的docker 容器 的ip 都会被更新到 host文件中

总结

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