修改 Docker 容器主机名
你需要修改 Docker 容器的主机名(hostname),分为创建容器时指定 hostname 、运行中容器临时修改 、运行中容器永久修改三种场景,我会给出每种场景的直接可用命令,适配不同需求:
一、创建容器时指定 hostname(推荐,永久生效)
这是最规范的方式,创建容器时直接通过 --hostname(简写 -h)参数指定,容器启动后 hostname 永久生效:
Bash
# 示例:创建容器时指定 hostname 为 "docker-node-01"
docker run -d --name test --hostname docker-node-01 镜像名
# 结合你之前的网络配置(指定IP+网关+hostname)
docker run -d --name test --hostname docker-node-01 --privileged \
--add-host=host.docker.internal:host-gateway \
镜像名
-
--hostname docker-node-01:将容器 hostname 设置为docker-node-01; -
验证:
docker exec test hostname→ 输出docker-node-01。
二、运行中容器临时修改 hostname(重启失效)
若容器已运行,可通过 nsenter 或 docker exec 临时修改(容器重启后恢复原 hostname):
Bash
# 方法1:docker exec 临时修改(最简单)
docker exec -it test hostname new-hostname-01
# 验证(需重新进入容器终端才生效)
docker exec -it test bash
hostname # 输出 new-hostname-01
# 方法2:nsenter 强制修改(立即生效,无需重新进入)
# 1. 获取容器 PID
PID=$(docker inspect -f '{{.State.Pid}}' test)
# 2. 修改 hostname
sudo nsenter -u --target $PID hostname new-hostname-01
# 验证
docker exec test hostname # 直接输出 new-hostname-01
三、运行中容器永久修改 hostname(重启不失效)
临时修改重启后会丢失,需修改容器配置文件 + 重启容器:
步骤1:停止容器
Bash
docker stop test
步骤2:修改容器配置文件
容器的 hostname 配置存储在 /var/lib/docker/containers/容器ID/config.v2.json(不同 Docker 版本路径可能略有差异):
Bash
# 1. 查找容器ID
CONTAINER_ID=$(docker inspect -f '{{.Id}}' test)
# 2. 编辑配置文件(替换 old-hostname 为新 hostname)
sudo sed -i 's/"Hostname":"old-hostname"/"Hostname":"new-hostname-01"/g' /var/lib/docker/containers/${CONTAINER_ID}/config.v2.json
# 3. (可选)修改 hosts 文件(避免 hostname 解析问题)
sudo sed -i 's/old-hostname/new-hostname-01/g' /var/lib/docker/containers/${CONTAINER_ID}/hosts
步骤3:重启 Docker 服务 + 启动容器
Bash
sudo systemctl restart docker
docker start test
步骤4:验证
Bash
docker exec test hostname # 输出 new-hostname-01
四、批量修改多个容器 hostname(单行命令)
若需批量修改 docker ps 中的所有容器 hostname(按容器名规则命名,如 test-01/test-02):
Bash
# 批量创建时指定 hostname
for i in {1..5}; do docker run -d --name test-$i --hostname docker-node-$i 镜像名; done
# 批量修改运行中容器(临时)
for CONTAINER in $(docker ps --format '{{.Names}}'); do docker exec -it $CONTAINER hostname ${CONTAINER}-new; done
关键注意事项
-
容器网络模式影响 :若容器使用
--net=host(主机网络),容器 hostname 会和宿主机一致,修改容器 hostname 会同步修改宿主机(不建议); -
DNS/解析问题 :修改 hostname 后,建议同步修改
/etc/hosts(容器内),避免解析失败:Bashdocker exec test bash -c "echo '127.0.0.1 new-hostname-01' >> /etc/hosts" -
Podman 兼容 :Podman 修改 hostname 的命令和 Docker 完全一致(
podman run --hostname/podman exec hostname),适配你之前的容器环境。
总结
-
推荐方式:创建容器时用
--hostname指定,永久生效且无副作用; -
临时修改:运行中容器用
docker exec hostname 新名称,重启失效; -
永久修改:停止容器 → 修改
config.v2.json→ 重启 Docker + 容器; -
批量修改:通过 for 循环遍历容器名/ID,批量执行修改命令。