Docker –link

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
  1. 别名

–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 都换成新的了

Send a Message