最可靠方式是创建容器时用--hostname参数指定,docker自动更新/etc/hostname和/etc/hosts;docker compose中通过hostname字段配置;dockerfile需显式写入文件;运行中修改仅临时生效。

一、启动容器时设置(永久生效,首选)
使用 --hostname(或简写 -h)参数,Docker 会自动写入 `/etc/hostname` 并在 `/etc/hosts` 中添加对应条目(如 127.0.0.1 myapp):
docker run -d --hostname myapp --name myapp-container nginx:alpine- 验证:
docker exec myapp-container hostname→ 输出myapp - 检查 hosts:
docker exec myapp-container cat /etc/hosts→ 可见新增行
二、Docker Compose 中配置
适用于编排多容器场景,在服务定义中直接声明 hostname:
在 Linux 上通过 Docker 运行 OpenClaw,并使用 Tailscale 实现远程访问。⚠️ 涉及 sudo、Docker、Tailscale和凭证挂载——请先查阅安全章节...
- 在
docker-compose.yml中写入:
services:
app:
image: nginx:alpine
hostname: web-server
container_name: web-container
- 启动后执行
docker-compose exec app hostname即可确认
三、Dockerfile 构建时预设(适合固定用途镜像)
若该主机名对所有基于此镜像的容器都适用,可在构建阶段固化:
- Dockerfile 示例:
FROM ubuntu:22.04
ENV HOSTNAME=backend-api
RUN echo "$HOSTNAME" > /etc/hostname && \
sed -i "s/127.0.1.1.*/127.0.1.1\t$HOSTNAME/g" /etc/hosts
CMD ["bash"]
- 注意:仅靠 ENV 不生效,必须显式写入文件;否则容器启动时仍用默认值
四、运行中修改(仅限临时调试,不推荐生产)
如果容器已运行且无法重建,可临时变更,但重启后丢失:
- 简单方式:
docker exec -u0 myapp-container hostname newname - 立即生效(无需重新 exec):
docker exec -u0 myapp-container nsenter -u -t 1 hostname newname - ⚠️ 此类操作不会更新 `/etc/hostname` 或 `/etc/hosts`,可能影响部分依赖主机名的服务
/var/lib/docker/containers/xxx/config.v2.json —— 那些属于高风险手动干预,容易破坏容器一致性。只要在启动阶段用好 --hostname,就能干净、稳定地完成主机名配置。










