Docker Desktop 中设置容器主机名需通过 CLI 的 --hostname 参数或 docker-compose.yml 的 hostname 字段实现,不可通过 GUI 或手动修改 config.v2.json;--hostname 影响容器内 hostname 命令及网络标识,与 --add-host 无关;Windows 下 WSL2 环境中 /etc/hostname 为只读,运行时修改无效。

直接在 Docker Desktop 中设置容器主机名,和命令行或 Compose 本质一致——Docker Desktop 本身不提供图形界面字段来填 hostname,它只是调用底层 docker 引擎。所以你得通过 CLI 或 docker-compose.yml 配置,Desktop 只负责执行和展示。
docker run 时用 --hostname 指定(最常用、最稳)
这是所有平台(包括 Windows 上的 Docker Desktop)最可靠的方式:启动容器那一刻就固化主机名,Docker 自动同步更新 /etc/hostname 和 /etc/hosts 里的条目。
- 命令示例:
docker run -d --name myapp --hostname api-prod nginx:alpine - 验证:
docker exec myapp hostname→ 输出api-prod - 注意:Windows 用户若用 PowerShell,别漏掉引号;CMD 中空格需转义,建议统一用 PowerShell 或 Git Bash
- 这个方式对单次调试、CI 临时环境、本地快速验证都够用,且重启不失效
docker-compose.yml 里配 hostname 字段(适合多容器协作)
Docker Desktop 的 Dashboard 能直接识别并管理 docker-compose.yml 启动的服务,hostname 就写在服务定义里,比手动敲命令更易复现和共享。
- 示例片段:
services:
backend:
image: python:3.11-slim
hostname: backend-api
container_name: backend-container
- 启动后执行:
docker-compose exec backend hostname→ 确认输出 - 注意:
hostname和container_name是两个独立字段,前者影响容器内hostname命令和网络解析,后者只用于dockerCLI 标识,别混用 - 如果你用 Docker Desktop 的「Add new context」或「Open in IDE」功能,确保 compose 文件路径没嵌套太深,否则可能加载失败
别碰 config.v2.json 手动改(Windows 上尤其危险)
有文章教你在 Windows 上进 C:\Program Files\Docker\Docker\resources\ 或 WSL2 文件系统里硬改 config.v2.json,这在 Docker Desktop 下极易出问题:
- Desktop 后台会定期刷新容器状态,手动改配置可能被覆盖或校验失败
- WSL2 路径映射不稳定,
/var/lib/docker/containers/xxx/config.v2.json在 Windows 文件资源管理器里不可见,强行用wsl -u root进去改,容易因权限或挂载延迟导致容器无法启动 - 改完必须
docker stop && docker start,但 Desktop 的 GUI 可能卡在 “Starting” 状态,得进 PowerShell 强制 kill 进程 - 真正需要“运行中永久改”的场景极少,绝大多数情况重跑容器成本远低于排查配置损坏
hostname 和 --add-host 不是一回事(常被混淆)
有人以为加 --add-host mydb.local:10.0.1.5 就等于设了主机名,其实完全无关:
-
--hostname设置的是容器自己的身份(gethostname()返回值),影响hostname、uname -n、日志前缀、部分 Java/Python 库的默认行为 -
--add-host只是往/etc/hosts插一条记录,纯为 DNS 替代,不影响容器自身 hostname - 比如你设了
--hostname worker-01,又加了--add-host master.local:192.168.1.10,那容器内hostname是worker-01,但能ping master.local—— 两者可共存,但不能互相替代
真正容易被忽略的是:Windows 上 Docker Desktop 默认启用 WSL2 后端,而 WSL2 的 /etc/hostname 是只读挂载,任何运行中对它的写入(比如 echo xxx > /etc/hostname)都会失败,报 Read-only file system。所以别信“进容器改文件再重启就行”这类方案——它在 Desktop 环境下根本走不通。











