什么是 --link
--link 是 Docker 早期为默认 bridge 网络提供的容器互联手段:它在目标容器的 /etc/hosts 里写入别名记录,并注入一批环境变量。自定义网络出现后,容器之间可以直接用服务名解析,--link 已不再推荐,新部署应避免继续使用。
基本信息
| 语法 | --link 目标容器:别名(别名可省略) |
|---|---|
| 现状 | 遗留特性,只在默认 bridge 下有意义 |
| 推荐替代 | 自定义网络(docker network create) |
| 副作用 | 注入环境变量、隐式建立启动依赖 |
典型使用场景
- 阅读与迁移历史脚本:理解老项目如何表达容器间依赖
- 维护无法改造的遗留部署,短期维持现状
- 对比学习:了解自定义网络出现前容器互联的通行做法
- 排查老项目启动顺序问题:--link 的隐式依赖常是重启死锁来源
旧写法与推荐替代
旧写法与推荐替代
docker network create app-net # 推荐:先建自定义网络
docker run -d --name db --network app-net postgres:16-alpine
# 老写法:靠 --link 建立别名与环境变量,仅作演示
docker run -d --name web-old --link db:db app/web:1.0
# 新写法:同网络内直接按服务名访问
docker run -d --name web --network app-net app/web:1.0
docker exec web getent hosts db # 自定义网络自带名称解析两种互联方式对照
| 维度 | --link | 自定义网络 |
|---|---|---|
| 名称解析 | 写入 /etc/hosts | 内建解析服务 |
| 依赖顺序 | 隐式、易死锁 | 由编排层显式管理 |
| 环境变量 | 会注入一批变量 | 不注入 |
| 适用性 | 仅默认 bridge | 当前推荐方式 |
自定义网络自带名称解析与网络隔离,既不需要 --link 也不需要维护容器启动顺序;迁移时注意老脚本可能读取 --link 注入的环境变量,切换后这些变量会消失。
自定义网络里容器互相访问用的是服务名或别名,与容器名并不总是同一个字符串;迁移脚本时把老别名映射关系先列清楚,避免改完互相连不上。
--link 建立的是单向可见关系:A 链接 B 之后 A 能解析 B,反过来不成立;这一点与自定义网络的双向解析差别很大,排障时容易判断错方向。
在容器重建或改名后,--link 记录会随容器一起消失,而自定义网络的名称解析按当前在线的服务动态维护,稳定性明显更好。