Docker link 实际上已经被标注为 过时 了,但是仍然有一些传统应用在使用它
最典型的是链接 web 应用和 数据库
例如要启动一个 WordPress 就可以
docker run --name wp_mysql -p 3306:3306 -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
docker run --name wp_web --link wp_mysql:mysql -v /data/wordpress:/var/www/html -p 80:80 -p 443:443 -d wordpress:5.6.0
使用了 –link 的 WordPress docker 部署,是不需要再配置 mysql 数据库连接就可以直接连上 数据库 的。
这里主要想讨论, link 到底 link 了什么
首先,这里需要明确两个概念,上面的 mysql 是 源容器,是被连接容器,WordPress 是目标容器,是接收容器
为了进行下面的测试,我们启动两个 busybox 容器,把它们连接在一起
docker run -i -t --name source -p 3001:3001 -p 3002:3002 -e source_env_1=123 -e source_env_2=456 busybox sleep infinity
docker run -i -t --name target -p 3003:3003 -p 3004:3004 -e target_env_1=123 -e target_env_2=456 --link source:mysource busybox sleep infinity
- 别名
–link wp_mysql:mysql
对于 WordPress 容器而言,wp_mysql 和 mysql 是一个容器,有着同样的 containerid
–link source:mysource
对于 target 容器而言,source 和 mysource 是一个容器
2. DNS
3. 环境变量
上面WordPress之所以直接可以连接数据库,实际上是使用了环境变量
WordPress的镜像默认会从 mysql 这个别名来读取 数据库 配置,所以这里如果写成 –link wp_mysql:test_mysql ,WordPress是无法识别到数据库的,可以理解成这是一个约定
Target 容器会得到 如下环境变量
4. 如果 source 容器的 ip 发生变化 的情况
删除source容器之后,我创建一个 Nginx容器,占用原来source容器的
172.17.0.2 ip 可以看到 新的ip 是 172.17.0.4
此时,在target容器中,没有任何信息被更新
启动一个target2 容器,就可以看到 dns 和 env 都换成新的了