Skip to content

nginx 502:跨 Compose 專案的容器 DNS 解析踩坑

2026年3月16日 1 分鐘
TL;DR 跨 Compose 專案時 service name 不可解析,要加 network alias 才能讓 nginx 找到容器。

TL;DR

跨 Docker Compose 專案時,nginx 無法用 service name 解析容器。要在容器的 network 設定加上 alias,nginx 才能找到它。

情境

nginx 跑在 daodao-infra,AI 後端跑在 daodao-ai-backend,兩個獨立的 Compose 專案透過 external network dev-daodao-network 互通。

nginx upstream 設定:

upstream backend_dev {
    server backend-dev:8000 resolve;
}

問題

持續收到 502,nginx log 顯示無法解析 backend-dev

根本原因

ai-backend 的 docker-compose 當時長這樣:

services:
  backend-dev:
    container_name: daodao-ai-backend-dev
    networks:
      - dev-daodao-network

Service name backend-dev 的 DNS 只在同一個 Compose 專案內有效。nginx 在另一個專案,所以查不到 backend-dev

container_name 雖然跨專案可解析,但名稱是 daodao-ai-backend-dev,跟 nginx 期望的 backend-dev 對不上。

解法

移除 container_name,改用 network alias:

services:
  backend-dev:
    networks:
      dev-daodao-network:
        aliases:
          - backend-dev

Network alias 在同一個 network 上的所有容器都可見,不限 Compose 專案。nginx 查詢 backend-dev → 解析成功 → 502 消失。

學到的事

跨 Compose 專案的容器互通,別靠 service name,要明確設定 network alias。

參考資料