修改 Docker 容器主机名

修改 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(重启失效)

若容器已运行,可通过 nsenterdocker 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

关键注意事项

  1. 容器网络模式影响 :若容器使用 --net=host(主机网络),容器 hostname 会和宿主机一致,修改容器 hostname 会同步修改宿主机(不建议);

  2. DNS/解析问题 :修改 hostname 后,建议同步修改 /etc/hosts(容器内),避免解析失败:

    Bash 复制代码
    docker exec test bash -c "echo '127.0.0.1 new-hostname-01' >> /etc/hosts"
  3. Podman 兼容 :Podman 修改 hostname 的命令和 Docker 完全一致(podman run --hostname/podman exec hostname),适配你之前的容器环境。

总结

  1. 推荐方式:创建容器时用 --hostname 指定,永久生效且无副作用;

  2. 临时修改:运行中容器用 docker exec hostname 新名称,重启失效;

  3. 永久修改:停止容器 → 修改 config.v2.json → 重启 Docker + 容器;

  4. 批量修改:通过 for 循环遍历容器名/ID,批量执行修改命令。

相关推荐
JZC_xiaozhong3 小时前
数据不互通、审批慢?企业多系统智能协同与流程自动化解决方案
运维·自动化·流程管理·流程自动化·数据集成与应用集成·流程监控·流程可视化设计
爱学习的小囧3 小时前
ESXi 8.0 原生支持 NVMe 固态硬盘吗?VMD 配置详解教程
linux·运维·服务器·esxi·esxi8.0
坚持就完事了3 小时前
Linux中的变量
linux·运维·服务器
hERS EOUS3 小时前
nginx 代理 redis
运维·redis·nginx
Cat_Rocky4 小时前
利用Packet Tracer网络实验
linux·运维·服务器
嵌入式×边缘AI:打怪升级日志4 小时前
Linux 驱动实战:SR501 人体红外传感器驱动开发与调试全记录
linux·运维·驱动开发
正点原子4 小时前
【正点原子Linux连载】第三章 U-Boot使用 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南
linux·运维·驱动开发
忍冬行者5 小时前
MongoDB 三节点副本集离线部署运维手册
运维·数据库·mongodb
爱学习的小囧5 小时前
ESXi VMkernel 端口 MTU 最佳设置详解
运维·服务器·网络·php·虚拟化
eRTE XFUN5 小时前
docker 安装 mysql
mysql·adb·docker