惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
博客园 - 聂微东
人人都是产品经理
人人都是产品经理
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园_首页
量子位
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hackread – Cybersecurity News, Data Breaches, AI and More
云风的 BLOG
云风的 BLOG
D
DataBreaches.Net
B
Blog
L
LangChain Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
博客园 - 三生石上(FineUI控件)
爱范儿
爱范儿
Microsoft Azure Blog
Microsoft Azure Blog
IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
B
Blog RSS Feed
H
Help Net Security
The Cloudflare Blog
U
Unit 42

博客园 - Hey,Coder!

微信小程序 web方案实现调音器功能 systemctl slice配置docker最大占用cpu 内存 pipenv环境变量配置 .net8验证码 数据库差异对比工具 docker部署prometheus grafana pgexporter Alertmanager ubuntu24 换源 ssh配置 ubuntu24 Harbor部署 ubuntu24 kvm部署 cockpit web管理界面 .net api代理 Ubuntu 24.04 DMAR IOMMU 报错修复 uniapp iOS App 上架 vs文件软链接 .net8通用中间件处理公共返回值结构 .net环境下OpenTelemetry Body 读取注意事项 jaeger界面显示异常 .net opentelemetry collector jaeger c# opentelemetry 自定义export c# opentelemetry 自定义export c# 生成对象的初始化代码 Elasticsearch ILM 与 Data Stream 概念及实例说明文档 portainer httphelper封装 Ocelot + Consul + SignalR 粘性会话 正交软件架构 docker postgresql17 主从复制 rabbitmq总结与c#示例 docker rabbitmq quartz dashboard docker consul registrator 服务自动注册consul 微服务动态扩容
Docker 网络别名
Hey,Coder! · 2026-08-03 · via 博客园 - Hey,Coder!

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