docker官方自1.12起已弃用--link,推荐使用自定义bridge网络;--link仅通过/etc/hosts静态映射和环境变量实现单向通信,不支持dns解析、动态更新或编排。

Link 是怎么让容器认出名字的
当你运行 docker run --link db:database app 时,Docker 会做两件事:
- 在 app 容器的
/etc/hosts中添加一行:172.17.0.x database db(x 是 db 容器当前 IP) - 把 db 容器的端口、地址等信息作为环境变量注入 app 容器,例如:
DATABASE_PORT=tcp://172.17.0.x:5432
因此你在 app 容器里执行 ping database 或 curl http://database:5432 才能成功——这看起来像“域名访问”,实则是 hosts 映射生效。
实际操作步骤(以 MySQL + Python 应用为例)
确保两个容器都在运行状态,且顺序正确(被链接容器需先启动):
- 启动数据库容器:
docker run -d --name mysql-db -e MYSQL_ROOT_PASSWORD=123 -p 3306:3306 mysql:8 - 启动应用容器并 link:
docker run -it --link mysql-db:mysql --rm python:3.9 bash - 进入后验证:
cat /etc/hosts | grep mysql应看到 mysql-db 的 IP 和别名mysql - 测试连通:
apt update && apt install -y iputils-ping && ping mysql(应通)
Link 的硬性限制和风险
这些不是“小问题”,而是设计缺陷,直接影响可用性:
- 被链接容器必须已运行,否则启动失败;重启 db 后,app 容器里的 hosts 不会自动更新
- 只能单向:app 可以访问 mysql,但 mysql 容器无法通过
app名称反向访问 - 不支持多个别名指向同一容器,也不能动态增删链接
- 环境变量命名固定(如
MYSQL_PORT),若 link 别名是db,变量就变成DB_PORT,容易和代码逻辑冲突
替代方案:为什么你应该改用自定义网络
真正稳定、可扩展的做法是弃用 `--link`,改用用户自定义 bridge 网络:
- 创建网络:
docker network create mynet - 启动容器并加入:
docker run -d --name mysql-db --network mynet mysql:8 - 再启应用:
docker run -it --network mynet --rm python:3.9 ping mysql-db(直接用容器名,无需 link) - 优势:自动 DNS 解析、重启不中断、支持多容器互访、兼容 compose 和 swarm
现代 Docker 已完全移除对 `--link` 的推荐支持,它只适合临时验证脚本或学习原理,不建议用于任何需要维护的项目。











