You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动