
Docker Compose 默认通过服务名进行容器间 DNS 解析,Go 应用应使用 db(服务名)而非 dbpgsql(仅内部 hostname)作为数据库主机地址,否则将因 DNS 查找失败而报错 “no such host”。
docker compose 默认通过服务名进行容器间 dns 解析,go 应用应使用 `db`(服务名)而非 `dbpgsql`(仅内部 hostname)作为数据库主机地址,否则将因 dns 查找失败而报错 “no such host”。
在 Docker Compose 网络中,容器通信依赖于内置 DNS 服务自动解析服务名(即 docker-compose.yml 中 services 下的键名),而非容器自身的 hostname。你当前配置中:
services:
db: # ← 该名称才是其他容器可解析的服务名
hostname: dbpgsql # ← 此字段仅影响容器内 /proc/sys/kernel/hostname,不注册到 Docker DNS
image: postgres:latest
# ...
因此,Go 应用连接 PostgreSQL 时,dataSourceName 中的 host 必须设为 db,例如:
dataSourceName := "host=db port=5432 user=cldb password=cldb dbname=cldb sslmode=disable"
⚠️ 注意事项:
-
移除过时的
links和hostname:links在 Compose v2+ 中已弃用;hostname不参与跨容器 DNS 解析,可安全删除。 -
确保网络一致性:默认情况下,所有服务位于同一用户定义桥接网络(
default网络),无需额外配置即可通过服务名互通。 -
添加健康检查与重试逻辑:PostgreSQL 启动慢于 Go 应用,建议在
DB.Ping()前加入重试机制(如指数退避),避免因数据库未就绪导致启动失败。
✅ 推荐优化后的 docker-compose.yml 片段:
version: '3.8' # 升级至现代版本
services:
server:
image: golang:1.7.3-alpine
build: ./server/
container_name: server
command: go run server.go
volumes:
- ../src/:/go/src/
- ../server.go:/go/server.go
environment:
DB_HOST: db # 明确传入服务名
DB_PORT: "5432"
DB_USER: cldb
DB_PASSWORD: cldb
DB_NAME: cldb
depends_on:
db:
condition: service_healthy
ports:
- "8080:8080"
db:
image: postgres:15-alpine # 使用稳定小版本更可靠
container_name: db
environment:
POSTGRES_USER: cldb
POSTGRES_PASSWORD: cldb
POSTGRES_DB: cldb
healthcheck:
test: ["CMD-SHELL", "pg_isready -U cldb -d cldb"]
interval: 30s
timeout: 10s
retries: 5
ports:
- "5432:5432"
volumes:
- ./data:/docker-entrypoint-initdb.d
这样配置后,Go 应用即可通过 host=db 稳定连接 PostgreSQL,彻底解决 lookup dbpgsql on 127.0.0.11:53: no such host 错误。











