--link参数通过修改被链接容器的/etc/hosts文件并注入环境变量实现单向别名解析,使接收容器能用别名访问源容器,但反向不可达;该机制自docker 1.10起弃用,推荐改用自定义bridge网络。

使用 --link 参数为旧版 Docker 容器建立单向别名解析,本质是让一个容器能通过自定义主机名访问另一个容器的端口,而反向不可达。这在 Docker 1.10 之前是常用做法,虽已废弃(被 user-defined network 取代),但维护老项目或调试遗留环境时仍需掌握。
理解 --link 的作用机制
--link 并非网络层互通,而是通过修改目标容器的 /etc/hosts 文件,添加一条形如 172.17.0.x alias_name 的记录,并将源容器暴露的端口信息注入环境变量(如 ALIAS_NAME_PORT_80_TCP_ADDR)。它只影响被链接容器的 DNS 解析和环境变量,不改动源容器配置,因此天然单向。
基础用法:启动时链接两个容器
假设已有名为 db 的 MySQL 容器运行中,想让新启动的 app 容器通过 mydb 别名访问它:
- 确认
db容器已运行且暴露了端口(如-p 3306或EXPOSE 3306) - 启动
app容器时加上:docker run --link db:mydb -it ubuntu:18.04 - 进入容器后执行
ping mydb或nslookup mydb,应能解析到db的私有 IP - 环境变量中会出现
MYDB_PORT_3306_TCP_ADDR和MYDB_PORT_3306_TCP_PORT
关键限制与注意事项
--link 是静态绑定,依赖容器名称而非 ID;重启源容器后 IP 可能变化,但链接不会自动更新(Docker 会同步更新 /etc/hosts);多个链接可叠加,如 --link db:db --link cache:redis;被链接容器必须先启动,否则报错 “No such container”。
替代方案提醒
Docker 1.10+ 默认推荐使用自定义 bridge 网络:docker network create mynet,再用 --network mynet 启动容器,容器名自动成为 DNS 名(双向可达、动态更新、更安全)。仅当明确需单向隔离或兼容极老镜像时才用 --link。











