Docker使用--net:container网络模式时如何设置容器主机名
问题原因
当你使用--net=container:<目标容器ID/名称>网络模式时,Docker默认会让新容器共享目标容器的网络命名空间+UTS命名空间,其中UTS命名空间负责存储主机名、NIS域名等系统标识。由于主机名属于UTS命名空间的管辖资源,Docker默认不允许在共享UTS的场景下单独给新容器设置主机名,因此传入--hostname时会直接返回错误:
conflicting options: hostname and the network mode
解决方法
在启动命令中显式添加--uts private参数,声明新容器使用独立的UTS命名空间,即可正常搭配--hostname参数设置自定义主机名。
启动命令示例
比如你需要共享名为nginx-base的容器的网络栈,同时将新容器的主机名设置为app-node-01,执行以下命令即可:
docker run -d \ --net=container:nginx-base \ --uts private \ --hostname app-node-01 \ 你的业务镜像名
Docker Compose 配置示例
如果使用Compose编排,在服务配置中新增uts: private字段即可正常设置hostname:
services: app-node: image: 你的业务镜像名 network_mode: "container:nginx-base" uts: private hostname: app-node-01
注意事项
- 如果不加
--uts private参数,即便你进入容器后手动执行hostname 自定义名称修改主机名,也会同步修改被共享网络的目标容器的主机名——因为二者共用同一个UTS命名空间,配置会互相干扰。 - 设置
--uts private后,新容器仅共享目标容器的网络栈,主机名、域名等系统标识完全独立,所有主机名相关的修改都不会对被共享的目标容器产生任何影响。
内容的提问来源于stack exchange,提问作者IMTheNachoMan
相关产品推荐
相关产品推荐

