hostname是容器内部逻辑名称,影响日志和进程标识;网络别名是Docker DNS在自定义网络中为容器注册的额外访问名,供同网容器通过http://alias调用。

创建容器时设置 hostname 和网络别名,是让服务可识别、可发现的关键操作。两者作用不同:hostname 是容器自身的逻辑名称,影响内部日志、进程标识和部分应用行为;网络别名(network alias)则是 Docker 内置 DNS 为该容器在**特定自定义网络中**注册的额外访问名,供同网其他容器通过 `http://alias` 这类方式调用。
一、用 --hostname 设置容器主机名
该参数在容器启动时写入 /etc/hostname 和 /etc/hosts,对容器内进程可见:
- 启动时指定:
docker run -d --name myapp --hostname api-server nginx - 此时容器内执行
hostname返回api-server,cat /etc/hosts也会包含127.0.1.1 api-server - 注意:
--hostname不影响外部容器通过网络访问它——除非配合自定义网络 + 别名,否则其他容器仍需用容器名或 IP
二、用 --network-alias 设置网络别名
网络别名只在用户自定义网络(非默认 bridge)中生效,由 Docker 内置 DNS 自动解析:
- 先创建网络:
docker network create app-net - 启动容器并加别名:
docker run -d --name web --network app-net --network-alias frontend --network-alias www nginx - 同一网络中的另一容器(如 busybox)就能直接访问:
curl http://frontend或ping www - 一个容器可配置多个别名,但每个别名仅在其加入的网络内有效
三、Docker Compose 中的等效写法
在 docker-compose.yml 中更清晰直观:
services:
web:
image: nginx
networks:
app-network:
aliases:
- frontend
- api.example.com
networks:
app-network:
driver: bridge
这样启动后,web 服务在 app-network 中同时响应 frontend 和 api.example.com 两个域名请求。
四、常见误区提醒
避免把几件事混为一谈:
-
--name是容器在 Docker 主机上的唯一标识,用于docker ps和docker exec,不是网络名 -
--hostname改的是容器内部的主机名,不自动注册到 Docker DNS;不加自定义网络,其他容器无法靠它通信 -
--network-alias必须搭配--network使用,且目标网络必须是用户创建的(docker network create),不能用于默认bridge网络 - 别名不会出现在容器的
/etc/hosts里,它是 Docker DNS 动态解析的,所以nslookup frontend能查到,但cat /etc/hosts看不到


















