网络别名是什么
网络别名给容器在自己所属的网络里再登记一个可解析的名字:容器名是唯一标识,别名可以多个容器共用,也可以随时挂接与摘除。它最实用的场景是滚动替换——新容器带上与旧容器相同的别名上线,调用方不用改配置就能切到新实例;多个容器共用同一别名时,解析会返回多个地址,起到粗粒度的分流效果。注意别名只在所属网络内有效,默认桥接网络不支持这项能力。
基本信息
| 写法 | docker run --network-alias 别名,可重复传参或逗号分隔多个 |
|---|---|
| 作用域 | 仅在容器所属的自定义网络内可解析,跨网络不可见 |
| 多容器同别名 | 解析返回多个地址,由客户端自行选择,属于粗粒度轮询 |
| 补挂别名 | docker network connect --alias 别名 网络 容器,运行中也能执行 |
| 默认桥接限制 | 默认桥接网络不提供别名解析,必须自建网络 |
| 查看 | docker inspect 的 Networks 段可看到该容器在各网络里的别名 |
典型使用场景
- 滚动升级:新实例带上旧别名上线,调用方零改动切换
- 多个只读副本共用同一别名,实现简单的读流量分摊
- 把服务名与容器名解耦,换容器时不必改调用方配置
- 给运行中的容器临时补挂别名,接入另一个网络做联调
- 多租户环境里用别名表达业务语义,隔离底层命名细节
使用示例
使用示例
docker run -d --name db-v2 --network mynet --network-alias db mysql:8.0 # 新实例顶替旧别名
docker exec web getent hosts db # 在客户端容器里验证解析结果
docker network connect --alias cache mynet redis-c # 给已运行容器补挂别名
docker run --rm --network mynet alpine nslookup db # 手工验证解析是否生效
docker inspect --format '{{json .NetworkSettings.Networks}}' db-v2 # 查看别名记录
docker run --rm --network mynet --network-alias db alpine nslookup db # 多容器同别名的效果行为要点
| 项 | 说明 | 注意 |
|---|---|---|
| 作用域 | 仅所属网络内可解析 | 跨网络调用解析不到 |
| 多容器同别名 | 解析返回多个地址 | 客户端轮询粒度粗,不是负载均衡 |
| 默认桥接网络 | 不支持别名 | 需要先创建自定义网络 |
| 长连接客户端 | 可能长期只连一个实例 | 分流效果取决于连接复用策略 |
轮询效果取决于客户端的解析缓存与连接复用方式:长连接客户端可能长时间只打一个实例,不要把它当负载均衡器使用。
切换实例时建议保留旧容器一段时间再下线:客户端解析缓存尚未过期,立刻删除旧实例会造成短暂访问失败。