Docker容器设置完整主机名后出现双值,应用获短名异常求助
解决Docker容器中主机名同时出现FQDN和短名的问题
我之前也碰到过这个情况——Docker用--hostname设置完整域名(比如pmy.test.com)后,容器的/etc/hosts里会同时出现全名和短名(pmy),像ejabberd这类对主机名敏感的应用就会拿到短名,和我们在Ubuntu系统里的单主机名体验不一致。
为什么会出现这个问题?
Docker的默认逻辑是:当你给容器设置FQDN格式的主机名时,它会自动把FQDN的第一部分(也就是短名称)也添加到/etc/hosts里,对应容器的内网IP。这么做是为了兼容一些只认短主机名的老应用,但恰恰会影响到像ejabberd这种依赖完整域名的服务。
解决办法
1. 推荐:使用自定义Docker网络
自定义网络下,Docker的DNS解析规则更合理,不会自动给FQDN添加短名条目,而且还能避免很多网络解析的小问题。操作步骤很简单:
- 先创建一个自定义网络:
docker network create my-app-network - 然后在这个网络下启动容器,指定完整主机名:
docker run --rm --name alpine -dit --network my-app-network --hostname "pmy.test.com" alpine
进入容器查看/etc/hosts,你会发现只有pmy.test.com对应容器的内网IP,短名pmy完全不会出现,完美匹配你想要的Ubuntu系统主机名效果。
2. 用--add-host覆盖默认hosts条目
如果不想创建自定义网络,也可以在启动容器时用--add-host参数手动指定主机名映射,覆盖Docker自动生成的条目。不过因为容器IP每次启动可能变化,需要灵活处理:
# 先启动容器(后台运行) docker run --rm --name alpine -d --hostname "pmy.test.com" alpine # 获取容器IP并添加host映射(重新启动容器) docker run --rm --name alpine -dit --hostname "pmy.test.com" --add-host "pmy.test.com:$(docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' alpine)" alpine
这种方式需要先启动容器获取IP,再重新启动,稍显繁琐,适合临时场景。
3. 临时修改容器hosts(重启失效)
如果只是临时测试,直接进入容器手动编辑/etc/hosts就行:
- 进入容器终端:
docker exec -it alpine sh - 编辑
/etc/hosts文件,找到类似下面的行:172.17.0.3 pmy.test.com pmy - 删除短名
pmy,改成:172.17.0.3 pmy.test.com
保存退出后就生效了,但容器重启后会恢复默认设置,所以只适合临时调试用。
内容的提问来源于stack exchange,提问作者Adiii




