Docker 网络问题:容器间通信失败
检查 容器归属网络。Docker 默认会为容器分配独立的网络命名空间,处于不同网络的容器默认无法直接互通。在终端输入以下命令查看目标容器的网络详情:
- 运行 网络检查命令。打开终端窗口,执行
docker inspect <容器名称或ID>,将<容器名称或ID>替换为实际容器标识。 - 定位 网络配置节点。在输出的 JSON 信息中,向下滚动查找
"NetworkSettings"字段。 - 核对 网络模式。在
"NetworkSettings"下找到"Networks"对象,确认两个容器是否连接至同一个网络名称。若显示bridge(默认网桥),则容器只能通过 IP 地址通信,且不具备自动域名解析能力。
若两容器网络不一致或处于默认 bridge 模式,按以下步骤隔离排查。
- 创建 自定义桥接网络。Docker 官方推荐为互相通信的容器建立专用网络。在终端执行
docker network create app-net,其中app-net可替换为自定义网络名。该网络会自动启用内置 DNS 服务,允许容器通过名称互相访问。 - 连接 目标容器。依次执行
docker network connect app-net <容器A>与docker network connect app-net <容器B>。执行后,两容器将共享该网络的 IP 段与域名解析表。 - 测试 双向连通性。进入任意一个容器终端,执行
docker exec -it <容器A> ping <容器B名称>。观察终端输出是否持续返回数据包响应。若返回Destination Host Unreachable或Connection refused,继续执行下一阶段排查。
| 网络类型 | 通信方式 | DNS 解析 | 适用场景 |
|---|---|---|---|
bridge (默认) |
仅 IP 互通 | 需手动注入 /etc/hosts |
临时测试或单机独立容器 |
自定义 bridge |
名称/IP 互通 | 自动启用 Docker DNS | 微服务架构、应用栈通信 |
host |
共享宿主机栈 | 依赖宿主机网络配置 | 高性能网络需求,需端口隔离 |
确认网络连通基础无误后,转向服务层与解析层排查。
容器虽处于同一网络,但若无法通过服务名访问,通常由内部 DNS 缓存或启动顺序导致。按以下流程强制刷新与对齐配置。
- 重启 Docker 内置 DNS 进程。部分 Docker 守护进程的 DNS 缓存会异常阻塞。在宿主机终端执行
sudo systemctl restart docker(Linux 系统),此操作会短暂中断所有容器网络并重建解析表。 - 清理 容器本地解析缓存。进入目标容器内部,执行
cat /etc/resolv.conf。检查文件末尾是否包含options ndots:5。该参数表示 DNS 查询优先尝试完整域名追加后缀,极易拖慢服务名解析速度。修改 容器启动参数,添加--dns-search .以重置搜索域,或在应用配置中直接使用完整容器名。 - 验证 端口监听状态。通信失败常因服务未正确绑定到
0.0.0.0。在容器内执行ss -tuln。检查目标端口对应的 Local Address 是否为0.0.0.0或::。若显示127.0.0.1,说明服务仅监听本地回环地址。调整 应用配置文件,将绑定地址更改为0.0.0.0,随后重启 容器内服务进程。
若同一宿主机内的容器通信正常,但跨网段或外部访问中断,需排查底层路由与安全策略拦截。
- 核对 IP 地址段冲突。Docker 默认分配的子网为
$172.17.0.0/16$。执行ip route查看宿主机现有路由表。若宿主机局域网也使用$172.x.x.x$网段,将导致路由覆盖。指定 创建网络时的子网,例如执行docker network create --subnet=10.0.99.0/24 custom-net以避开冲突。 - 检查 宿主机防火墙规则。
firewalld或ufw可能拦截 Docker 的FORWARD链流量。在终端输入iptables -nL FORWARD -v,观察规则链中是否存在DROP策略针对 Docker 子网。放行 网桥流量,对于ufw系统,编辑/etc/default/ufw文件,将DEFAULT_FORWARD_POLICY值修改为"ACCEPT",随后重载 配置。 - 验证
ip_forward内核参数。容器跨网通信依赖内核转发功能。执行sysctl net.ipv4.ip_forward。若输出结果为$0$,开启 转发权限:执行sudo sysctl -w net.ipv4.ip_forward=1。持久化 该配置,将net.ipv4.ip_forward=1写入/etc/sysctl.conf文件,并执行sudo sysctl -p生效。
完成底层网络与防火墙调优后,进入最终验证环节。
- 执行 全链路连通性测试。使用
docker exec进入客户端容器,使用curl -v <服务端容器名称>:<端口号>发起请求。观察 HTTP 状态码或 TCP 握手日志。若返回200 OK或业务响应数据,标记通信链路恢复。 - 固化 容器启动编排。手动执行
docker run易遗漏网络参数。编写docker-compose.yml文件,在顶层声明networks模块,为每个服务指定networks: [app-net]。 - 运行 一键部署。在项目目录执行
docker compose up -d --build。Docker 将自动创建依赖网络、分配 IP 并注入 DNS 映射。检查 容器状态显示healthy即代表环境就绪。后续新增服务时,仅需在docker-compose.yml中追加相同networks引用,即可免调试直接通信。

暂无评论,快来抢沙发吧!