Docker网络DNS解析修复

解决Docker Desktop在自定义桥接网络中服务名称DNS解析失败的问题,适用于容器化开发环境。

  • by NelCapeTown
  • 本地部署
  • 更新于
在 GitHub 查看 NelCapeTown/Docker-Compose-DNS-Bug-Case

使用说明

Docker桌面DNS解析错误-复制案例

解决方案

我卸载了Docker Desktop,现在只需在我的Ubuntu 24.04 WSL2中直接运行Docker,一切正常。

问题摘要

Docker Desktop(2024年12月更新的版本)无法解析自定义网桥网络上的服务主机名,尽管服务位于同一网络上,但仍返回“地址错误”错误。

预期行为

同一Docker网络上的容器应该能够通过服务名称相互解析:

# From n8n container
ping postgres  # Should resolve and respond

实际行为

DNS解析完全失败:

# From n8n container
ping postgres
# Returns: "ping: bad address 'postgres'"

环境

  • 操作系统:Linux(基于Ubuntu/Debian)
  • Docker 桌面版:2024年12月更新的版本
  • Docker Compose:v2.x

繁殖步骤

  1. 克隆此存储库
  2. 跑 docker compose up -d
  3. 等待所有服务都健康
  4. 执行到n8n容器中: docker compose exec dns-test-n8n sh
  5. 尝试ping postgres: ping dns-test-postgres
  6. 观察DNS故障

什么有效

  • 容器可以通过IP地址相互ping
  • 容器可以通过硬编码的IP进行通信
  • Docker内置的网桥网络运行良好
  • 使用静态IP+extra_hosts的自定义网络解决方法有效

什么不起作用

  • 标准服务名称解析(例如“postgres”、“mcp”)
  • 具有自动DNS的自定义网桥网络
  • Docker Compose应该提供的服务发现

建筑

这是一个最小的n8n+PostgreSQL设置,演示了这个问题:

┌─────────────┐
│  dns-test-  │  Tries to connect to "dns-test-postgres"
│    n8n      │  ❌ DNS resolution fails
└──────┬──────┘
       │
       ▼ (should connect here)
┌─────────────┐
│  dns-test-  │  IP: Assigned by Docker
│  postgres   │  Hostname: Should resolve but doesn't
└─────────────┘

此回购中的文件

  • docker-compose.yml -最小复制设置(无变通方法)
  • .env.example -所需的环境变量
  • README.md -此文件
  • WORKAROUND.md -我们不得不实施的黑客解决方案

Docker桌面团队

这是一个干净的复制箱。我们已经确认这适用于静态IP extra_hosts 条目,但这不是一个合适的解决方案。我们需要正常的DNS解析才能按照记录工作。

我们的生产解决方法(在单独的私有仓库中)使用:

  • 自定义网络上的静态IP
  • 手册 extra_hosts docker-compose.yml中的条目
  • 这很脆弱,违背了服务发现的目的

联系

如果您需要更多信息或有疑问,请在此存储库中打开问题。

相关问题

这似乎与2024年12月中旬的Docker Desktop更新有关,该更新影响了自定义网桥网络上的DNS解析。