--link参数用于老旧Docker环境实现容器间单向通信,通过修改/etc/hosts和注入环境变量使源容器能以别名访问目标容器IP与端口,但不支持反向解析、跨主机及IP变更自动更新,官方自1.10起已标记为legacy。
使用 --link 参数可在老旧 docker 环境(如 docker 1.12 以前)中实现容器间单向 dns 解析,即让一个容器能通过别名访问另一个容器的 ip 和端口,而反向不可达。它本质是通过修改目标容器的 /etc/hosts 文件并注入环境变量来实现,不依赖外部 dns 服务。
一、--link 的基本用法与限制
--link 是早期 Docker 提供的容器互联机制,语法为:docker run --link <源容器名>:<别名> ...
- 源容器必须已运行,且不能是已停止或重启中的状态
- 别名仅在当前容器内生效,不会影响源容器或其他容器
- 解析是单向的:A --link B 后,A 能用
B或<别名>访问 B,但 B 无法解析 A - 不支持跨主机,仅适用于同一 Docker daemon 下的容器
二、确保解析生效的关键细节
单纯加 --link 不一定立即可用,需注意以下几点:
- 目标容器必须监听
0.0.0.0(而非127.0.0.1),否则链接后仍无法连通 - Docker 会自动在新容器的
/etc/hosts中添加类似172.17.0.3 db db.local的条目 - 同时注入形如
DB_PORT_5432_TCP=tcp://172.17.0.3:5432的环境变量,应用可直接读取 - 若源容器重启,IP 可能变化,但
--link不会自动更新 —— 这是其主要缺陷,需避免用于生产长期运行场景
三、典型使用示例(MySQL + 应用容器)
假设已有运行中的 MySQL 容器:
docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 mysql:5.7
启动应用容器并链接它:
docker run -it --link mysql-db:db ubuntu:18.04 bash
进入容器后可验证:
-
ping db应返回 MySQL 容器 IP -
env | grep DB_可看到DB_PORT_3306_TCP_ADDR和DB_PORT_3306_TCP_PORT - 应用代码中可用
db:3306作为数据库地址,无需硬编码 IP
四、替代建议与注意事项
虽然 --link 在老旧系统中仍可用,但应清楚其局限性:
- 自 Docker 1.10 起官方已标记为 legacy,推荐改用自定义 bridge 网络 + 容器名解析(
docker network create mynet && docker run --network mynet --name app ...) - 若无法升级 Docker,又需多容器互访,可手动维护
/etc/hosts或用nsenter注入解析规则 -
--link无法配合--network=host使用,二者互斥


















