容器别名仅在自定义桥接网络中生效,Docker默认bridge网络不支持;需创建自定义网络(如app-net),容器加入该网络后,通过--network-alias(命令行)或networks.aliases(Compose)配置别名,同网容器可直接用别名通信。

容器创建时用别名机制,核心是绕开硬编码IP和容器名,让服务之间靠语义化名称通信。关键不在“怎么起名”,而在于“在哪生效、谁认得它”。
别名只在自定义桥接网络里管用
Docker默认的bridge网络不支持别名解析——哪怕你加了--network-alias或aliases,DNS也不会认。必须先建一个用户自定义网络:
docker network create app-net- 或者 Compose 里显式声明:
networks: {app-net: {driver: bridge}} - 所有要互通的容器,都得连到这个网络上,别名才被 Docker 内置 DNS 知道
启动时直接指定别名(命令行)
用docker run时,别名通过--network-alias传入,且必须搭配--network:
docker run -d --name db --network app-net --network-alias mysql-server --network-alias database mysql:8- 同一个容器可以有多个别名,用空格或多次
--network-alias都行 - 别名里只能用小写字母、数字、连字符(
-),不能带下划线或点号(除非是完整域名格式,如api.v1)
Compose 中为服务配别名(推荐方式)
在docker-compose.yml里,别名写在服务的networks子配置中,不是平级字段:
- 错误写法:
aliases: [db](没指定网络,无效) - 正确写法:
networks: {app-net: {aliases: [database, mysql]}} - 一个服务可跨多个网络,每个网络里能设不同别名,比如在
frontend网里叫web,在monitoring网里叫nginx-exporter
别名怎么被其他容器访问
只要在同一个自定义网络里,任何容器都能直接用别名当主机名:
-
curl http://database:3306(访问 MySQL) -
ping frontend(测试 Web 服务连通性) - 应用配置里写
host: api,比写host: backend-service-1更稳定——服务名改了,别名还能照用 - 注意:别名不会出现在
/etc/hosts里,它是纯 DNS 解析,靠 Docker 的嵌入式 DNS(127.0.0.11)动态响应


















