Docker Link原理解析

容器间的通讯由Docker daemon的启动参数-icc控制,但很多情交下为了保证容器及主机的安全,-icc通常设置为false来关闭容器间的通讯。这时候Docker Link系统可以在两个容器之间建立一个安全的通道,使得接收器(如web应用)可以通过通道得到源容器(如数据库服务)指定的相关信息。

  1. 使用Link通讯

Link是在容器创建的时候通过--link参数创建的,如:

docker un -d --name db training/mysql docker run -d -P --name web --link db:webdb training/webapp python app.py

这样一个连接创建完成了,web容器可以从db容器中获取数据,web容器叫作接收器或父容器,db容器叫作源容器或子容器 。

  1. 设置接收容器的环境变量

当两个容器通过--link建立连接后,会在接收器中额外设置一些环境变量,以保存容器列表的一些信息。

  1. 更新接收容器的/etc/hosts文件

    Docker容器的IP地址是不固定的,容器重启后地址可能就和之前不同了。link操作除了在将link信息保存在接收容器之外,还在/etc/hosts中添加了一项---源窗口的IP和别名(--link参数指定的别名),以用来解析源容器的IP地址。并且当源容器重启后,会自动更新接收器的/etc/hosts文件。因此可以用这个别名来配置应用程序,而不有和担心IP的变化。

  2. 建立iptables规则进行通讯

在接收容器上设置了环境变量和更改了/etc/hosts文件之后,接收容器仅仅是午到了源容器的相关信息,并不代表源容器和接收容器在网络上可以互相通讯。Docker daemon为了保证两个容器间的通讯需要为连接的容器添加特定的iptables规则。

  1. 总结

Dockerc通过使用Linux网桥、端口映射、iptables规则和link等技术完成了Docker的网络功能,这些功能可以满足简单应用在单机环境上的基本需求。 但对于多主机通讯,多租户隔离、网络QoS、容器固定IP等问题的解决还比较棘手。为了解决这些总是,Docker将网络单独成一个库---libnetwork,目前这个库还在雏形阶段。