Docker 网络别名

Docker 网络别名(Network Alias)简明指南

概述

Docker 网络别名允许在同一个自定义网络内,为多个容器分配相同的 DNS 名称。客户端通过该名称访问时,Docker 内置 DNS 会返回所有关联容器的 IP 列表,并以轮询方式分配请求,从而实现单机环境下的轻量级服务发现与负载均衡。

核心概念

名称类型 唯一性 作用域 主要用途
容器名 (--name) 全局唯一 整个 Docker 引擎 管理容器(日志、启停)
网络别名 (--network-alias) 同一网络内可重复 仅限所属自定义网络 服务发现、负载均衡

工作原理

  1. 容器加入自定义网络(如 my-net)时,Docker 为其注册 DNS 记录。
  2. 每个容器默认拥有自己的容器名作为 DNS 名称;此外可附加任意数量的别名。
  3. 当其他容器查询该别名时,Docker DNS(127.0.0.11)返回所有绑定该别名的容器 IP 列表,顺序随机(实际为 round-robin)。
  4. 客户端通常取第一个 IP 建立连接,后续查询顺序变化,实现请求分散。

使用场景

  • 水平扩展无状态服务:多个 API 实例共享别名 api,调用方只需写 http://api:8080
  • 灰度发布/滚动更新:新旧版本容器同时绑定同一别名,逐步下线旧版本。
  • 本地开发模拟多副本:配合 Docker Compose 的 aliases 字段快速搭建。

基本用法

命令行

# 创建自定义网络
docker network create my-net

# 启动三个容器,共享别名 "web"
docker run -d --name web-1 --network my-net --network-alias web nginx
docker run -d --name web-2 --network my-net --network-alias web nginx
docker run -d --name web-3 --network my-net --network-alias web nginx

# 其他容器可通过 "web" 访问
docker run --rm -it --network my-net alpine ping web

Docker Compose

version: '3.8'
services:
  web-1:
    image: nginx
    networks:
      my-net:
        aliases:
          - web
  web-2:
    image: nginx
    networks:
      my-net:
        aliases:
          - web
  consumer:
    image: alpine
    command: ["ping", "web"]
    networks:
      - my-net

networks:
  my-net:
    driver: bridge

启动并扩展实例:

docker-compose up -d --scale web-1=3 --scale web-2=2

验证方法

进入任意容器,使用 dignslookup 查询别名:

docker exec -it any-container sh
# 安装工具(Alpine)
apk add bind-tools
# 查询
dig web @127.0.0.11

返回示例:

web.  600  IN  A  172.18.0.2
web.  600  IN  A  172.18.0.3
web.  600  IN  A  172.18.0.4

重要限制与注意事项

  • 仅限自定义网络:默认 bridge 网络不支持别名,需先 docker network create 创建。
  • 无健康检查:容器进程挂掉但容器未退出时,DNS 仍会返回其 IP,可能导致请求失败。生产环境建议搭配反向代理(如 Nginx/Traefik)或使用 Swarm/K8s 的健康检查机制。
  • 长连接不均衡:客户端可能缓存 DNS 结果,导致后续请求集中到同一实例。适用于短连接场景(HTTP API、gRPC),WebSocket 等长连接需额外处理。
  • 别名仅在本网络可见:跨网络访问需通过服务名或端口映射。

与其他方案对比

方案 优势 劣势 推荐场景
共享别名 (DNS 轮询) 零配置、Docker 原生 无健康检查、长连接不均 开发/测试、小型无状态服务
反向代理 (Nginx/Traefik) 健康检查、高级路由 需额外部署维护 生产环境精细控制
Docker Swarm VIP 内置健康检查、跨主机 功能有限、非主流 中小集群
Kubernetes Service 功能完备、生态丰富 学习成本高 大型生产系统

最佳实践

  1. 开发/测试环境优先使用:快速模拟多副本,简化配置。
  2. 生产环境谨慎使用:建议叠加健康检查层,或直接采用 Swarm/K8s。
  3. 配合 Compose 的 --scale:灵活调整副本数,别名自动覆盖新容器。
  4. 避免依赖容器名:将别名作为稳定的访问入口,容器名仅作管理标识。

docker特殊ip

  • 172.17.0.1​ — Docker 默认 bridge 网络的网关(宿主机)
  • 172.18.0.1​ — 自定义网络的第一个可用 IP(通常是网关)
  • 172.72.0.1​ — 如果你自己创建的子网,比如 172.72.0.0/24,则网关为 172.72.0.1
posted @ 2026-08-03 13:30  Hey,Coder!  阅读(0)  评论(0)    收藏  举报