深浅主题
Docker 网络与容器 DNS
问题现象
容器内解析不到服务名,宿主机能访问后端但代理容器无法访问,重建后固定 IP 失效。
适用环境
Docker Engine、Compose、自定义 bridge 网络。
本文是可复用的排障示例,不代表某次个人生产事故。命令中的名称、账号和数据均为示例,执行前请替换为已确认的目标。
复现或诊断步骤
- docker inspect 查看通信双方的 NetworkSettings.Networks,确认至少共享一个正确网络。
- docker network inspect 检查服务别名和网络成员;输出可能包含内网地址,应脱敏交付。
- 从调用方容器或同网络诊断容器解析服务名并测试目标端口,检查后端监听。
原因分析
Compose 默认服务名只在共享网络内可解析,两个项目的默认网络互不相通。容器 IP 会变化,固定写 IP 易失效;EXPOSE 只是元数据,不是宿主机端口发布。
修复示例
yaml
services:
web:
image: example/web:1.0
networks: [app_internal]
api:
image: example/api:1.0
networks: [app_internal]
expose: ['8080']
networks:
app_internal:
external: true
name: app_internal
# external 网络需提前建立或复用已确认的现有网络使用服务名与容器端口通信,明确共享网络边界。需要跨项目复用网络时采用 external,不随意连接所有容器。修改 Compose 前备份并 render config;变更后可恢复旧网络声明和容器,避免删除仍被其他项目使用的网络。
验证方法
从调用方按服务名访问健康端点,重建后端后再测,确认不依赖旧 IP。检查 docker ps 确认只暴露预期宿主机端口,内部数据库没有意外发布。
常见误区
宿主机端口与容器端口不能混用。host.docker.internal 的可用性依平台与配置而异,不能默认 Linux Engine 与 Docker Desktop 完全一致。