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

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 Networks
    
    确保两个容器都在internal_networkexternal_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

火山引擎 最新活动