Docker Compose跨容器Hostname无法解析问题求助
Docker Compose容器内Hostname解析失败的排查与解决方法
看起来你遇到了Docker Compose多容器服务里的DNS解析问题——明明两个容器配置了相同的网络,却没法通过服务名或links别名访问,只能用公网IP。我之前也碰到过类似的情况,给你整理几个排查和解决的步骤:
先做基础检查,排除低级错误
- 确认translate容器是否正常运行:先执行
docker-compose ps translate看看容器状态是不是Up。如果是Exited或者Restarting,先看容器日志找启动问题:docker-compose logs translate——服务都没起来,自然没法解析。 - 验证两个容器在同一网络:分别查看两个容器的网络归属:
确保两个容器都在# 查看app容器的网络 docker inspect $(docker-compose ps -q app) | grep -A5 Networks # 查看translate容器的网络 docker inspect $(docker-compose ps -q translate) | grep -A5 Networksinternal_network和external_network这两个网络里,要是有一个没加上,DNS肯定没法互通。
针对性解决DNS解析问题
1. 移除过时的links配置
在Docker Compose的自定义网络(比如你这里的internal_network)里,服务名(translate)默认就支持DNS解析,links是Docker旧版本的特性,现在不仅没必要,还可能干扰DNS解析逻辑。把app服务里的links字段删掉,然后重新部署:
docker-compose down && docker-compose up -d
2. 检查自定义网络的DNS支持
确认你的internal_network是默认的bridge驱动(Compose默认创建的网络都是bridge,支持DNS),执行:
docker network inspect internal_network | grep Driver
如果Driver是host或者none,那肯定没法做容器间DNS解析,得修改网络配置为bridge。
3. 手动指定容器DNS服务器
有些自定义镜像会修改/etc/resolv.conf,导致容器没法用Docker内置的DNS(127.0.0.11)。你可以在app服务里强制指定DNS:
app: image: app:dev networks: - external_network - internal_network depends_on: - translate dns: - 127.0.0.11 # Docker内置DNS,负责解析服务名 - 8.8.8.8 # 备用公共DNS
修改后重新启动,再进入app容器测试:
docker-compose exec app nslookup translate
如果能返回translate容器的IP,说明解析正常了。
4. 重启Docker服务(终极小妙招)
有时候Docker的内置DNS服务会抽风,重启一下Docker就能解决:
- Linux:
sudo systemctl restart docker - Windows/Mac:重启Docker Desktop
修改后的完整Compose示例
version: '3.7' services: translate: restart: always image: mashirozx/google-translate-server:latest ports: - "127.0.0.1:30031:30031" command: "npm start -- --domain ${DOMAIN:-cn}" networks: - external_network - internal_network app: image: app:dev networks: - external_network - internal_network depends_on: - translate dns: - 127.0.0.11 - 8.8.8.8
内容的提问来源于stack exchange,提问作者Mashiro




