Sunday面试指南

Docker Compose 容器之间怎样通信?为什么使用 localhost 连接不到另一个服务?

下面是一段教学模拟,不是真实面试记录。

🧑‍💻 面试官:web 容器连数据库,填 localhost:5433 为什么失败?

🙋‍♂️ 我:端口映射没生效?

🧑‍💻 面试官:5433 是宿主机映射端口。web 里的 localhost 指向谁?

🙋‍♂️ 我:指向 web 自己。

🧑‍💻 面试官:那么同网络里的 db,用服务名还是容器 IP,用容器端口还是宿主机端口?

先确认「你站在哪个网络空间里」。容器里的 localhost 是自己;同网络服务通常使用服务名与容器端口。

面试速答(60 秒版)

Compose 默认为项目建立网络,让服务通过服务名发现彼此。web 访问数据库,通常使用 db:5432,而不是 web 自己的 localhost。

端口映射用于从宿主机等外部入口访问容器。例如宿主机 5433 映射到数据库容器 5432,宿主机可以访问 localhost:5433,但同网络容器仍使用 db:5432。

还要确认双方加入可通信网络,目标服务监听正确地址,并且已经就绪。

服务名通常比写死容器 IP 稳定,但容器重建后已有连接仍可能断开,需要应用重新解析与连接。服务发现不会自动恢复所有数据库连接。

Compose:localhost 指向谁:服务名加容器端口

知识点详解:同一个 localhost,在不同地方指的是谁?

两个容器,各有自己的“本机”

假设 Compose 有 web 和 db。默认桥接模式下,它们有各自网络环境。

从 web 内连接 localhost,是访问 web 的回环接口,不会自动跳到 db,也不会因为在同一台电脑上就共享本机。

先确定代码运行于浏览器、宿主机还是容器,再判断地址。Compose 网络文档

端口映射连接外部入口与容器入口

假设 db 的映射是 5433:5432:

发起位置教学目标地址含义
同网络 webdb:5432经服务发现访问容器端口
本机宿主机localhost:5433经发布端口进入 db
web 中 localhost:5433web 自己不是数据库映射入口

特殊网络模式会改变规则。并且同网络通信不要求数据库端口发布到外部,不应为了互访随意增加公网入口。

能解析名称,还需要目标能接连接

不同 Compose 项目如果没有共享网络,不能默认互相发现。即使 DNS 正确,服务只监听自身 127.0.0.1,也可能拒绝其他容器连接。

服务监听地址与宿主机发布地址是不同设置。启动顺序也不等于就绪:depends_on 的健康条件应明确配置,应用还需要合理重试。

排查可以按网络成员、名称解析、目标端口、监听地址、服务健康、身份权限依次进行,不是先关闭防火墙。

名字不变,不代表旧连接会迁移

重建容器可能改变 IP,服务名仍可以发现新地址。旧连接却不会自动转移到新容器。

客户端需要识别失效,重新解析与连接,也要考虑连接池和 DNS 缓存。

容器访问宿主机是另一条路线。Docker Desktop 常提供 host.docker.internal;Linux 等环境应确认支持与配置,不能当成所有平台统一存在的名字。

面试官继续追问

为什么浏览器不能使用 db 这个名字?

浏览器不在 Compose 内部网络。通常应由后端提供适当接口,也不该让浏览器直接访问数据库。

可以写死容器 IP 吗?

临时诊断可以查看,长期配置通常用服务发现。重建后 IP 可能失效。

用 host 网络就能解决吗?

它改变隔离、端口与安全规则,不是通用修复。先解决实际地址与网络问题,再决定是否需要特殊模式。

面试速记卡

  • localhost:默认容器网络里指当前容器。
  • 服务互访:同网络通常使用服务名和容器端口。
  • 映射端口:宿主机发布端口不等于内部目标端口。
  • 连通条件:网络、DNS、监听、健康与权限分别检查。
  • 重建恢复:名字可以保持,连接仍需重新建立。

公司面试真题

这道题暂未收录可核验的公司真题来源。你可以先阅读本文解析,或浏览已收录的公司面试真题。

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历