Docker Link原理解析
容器间的通讯由Docker daemon的启动参数-icc控制,但很多情交下为了保证容器及主机的安全,-icc通常设置为false来关闭容器间的通讯。这时候Docker Link系统可以在两个容器之间建立一个安全的通道,使得接收器(如web应用)可以通过通道得到源容器(如数据库服务)指定的相关信息。
- 使用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容器叫作源容器或子容器 。
- 设置接收容器的环境变量
当两个容器通过--link建立连接后,会在接收器中额外设置一些环境变量,以保存容器列表的一些信息。
更新接收容器的/etc/hosts文件
Docker容器的IP地址是不固定的,容器重启后地址可能就和之前不同了。link操作除了在将link信息保存在接收容器之外,还在/etc/hosts中添加了一项---源窗口的IP和别名(--link参数指定的别名),以用来解析源容器的IP地址。并且当源容器重启后,会自动更新接收器的/etc/hosts文件。因此可以用这个别名来配置应用程序,而不有和担心IP的变化。
建立iptables规则进行通讯
在接收容器上设置了环境变量和更改了/etc/hosts文件之后,接收容器仅仅是午到了源容器的相关信息,并不代表源容器和接收容器在网络上可以互相通讯。Docker daemon为了保证两个容器间的通讯需要为连接的容器添加特定的iptables规则。
- 总结
Dockerc通过使用Linux网桥、端口映射、iptables规则和link等技术完成了Docker的网络功能,这些功能可以满足简单应用在单机环境上的基本需求。 但对于多主机通讯,多租户隔离、网络QoS、容器固定IP等问题的解决还比较棘手。为了解决这些总是,Docker将网络单独成一个库---libnetwork,目前这个库还在雏形阶段。