docker自1.12起弃用--link,推荐用户自定义bridge网络实现容器通信;--link存在单向依赖、无dns解析、不兼容编排等缺陷,而自定义网络支持服务名自动解析、动态扩缩容及跨容器互通。

在现代容器化部署中,Docker容器间通信是基础能力。但需明确:Docker官方自1.12版本起已弃用 --link 参数,并推荐使用用户自定义网络(User-defined Network)替代。Link机制仅适用于旧版或特殊调试场景,且存在单向依赖、DNS缺失、扩展性差等缺陷。真正稳定、可维护的容器互联方式是基于自定义bridge网络的DNS自动发现。
为什么不再推荐使用 --link
--link 创建的是静态、单向的环境变量注入式连接,容器启动顺序强耦合,重启后链接可能失效;它不支持跨主机通信,也不兼容Swarm或Kubernetes编排体系。更重要的是,它无法提供容器名自动解析——你不能直接用 ping redis,而必须依赖生成的 REDIS_PORT 等环境变量,代码侵入性强。
用自定义bridge网络实现自然通信(推荐做法)
这是当前标准实践,容器启动后可通过服务名直接互通,无需额外配置,支持多容器、多子网、动态扩缩容:
- 创建网络:docker network create mynet
- 启动Redis容器并加入网络:docker run -d --name redis --network mynet -p 6379:6379 redis
- 启动应用容器并加入同一网络:docker run -it --network mynet --rm python:3.9 ping redis(会成功解析并连通)
此时,任意同网容器均可通过 redis 这个名字访问Redis服务,Docker内置DNS自动处理解析。
兼容旧项目:临时启用 --link(仅限测试)
若必须复现Link行为(如验证遗留脚本),可在单机、非编排环境下谨慎使用:
- 先运行被链接容器:docker run -d --name db postgres
- 再运行主容器并link:docker run -it --link db:database ubuntu bash
- 进入后执行 env | grep DATABASE 可看到 DATABASE_PORT、DATABASE_NAME 等变量
- 注意:该容器只能访问db,且db容器重启后,link不会自动更新;也不能反向访问主容器
进阶建议:配合docker-compose统一管理
生产环境中应避免手动敲命令。使用 docker-compose.yml 声明服务与网络,语义清晰、可复现:
version: '3.8'
services:
web:
image: nginx
depends_on: [redis]
networks: [mynet]
redis:
image: redis
networks: [mynet]
networks:
mynet:
driver: bridge
执行 docker-compose up 后,web服务可直接通过 http://redis:6379 访问Redis,无需IP或端口映射。










