DEBUG.WIKI
V.PS:让项目靠近用户,亚太、欧洲、北美 KVM VPS
IPPeak:从目标地区访问网页,住宅代理、SEO 监测、广告验证
ZgoCloud:多地区部署,按需选节点;日本、美国、香港、德国

Docker Desktop 的 MongoDB 容器无法从宿主机连接:EXPOSE 没有发布端口

Docker Desktop 上 MongoDB 容器运行却无法从宿主机连接,区分 EXPOSE 和发布端口,保留数据与认证后修改原部署映射。

MongoDB 容器在运行,镜像声明了 27017/tcp,但 macOS 上的数据库客户端仍连接超时。若启动时没有发布端口,应先检查宿主机入口。镜像里的 EXPOSE 只记录预期端口,不会自动创建宿主机到容器的端口映射。

本文针对 Docker Desktop 中的 Linux 容器,以及从同一台宿主机访问容器服务。容器间通信、远程服务器和自定义路由环境需要分别判断,不能套用同一个地址。

不要把容器内部 IP 当作宿主机入口

Docker Desktop 的 Linux 容器运行在虚拟机网络中。容器检查结果里的内部 IP 通常不能从 macOS 或 Windows 宿主机直接访问;无法 ping 通这个 IP,也不能证明数据库已停止。

先检查容器状态、应用日志和发布端口:

docker ps -a
docker port mongo-app
docker inspect mongo-app

mongo-app 是示例容器名。在 docker ps 中,只有 27017/tcp 与显示 127.0.0.1:27017->27017/tcp 是不同信息。前者不是宿主机端口映射,后者才给出发布入口。docker port 没有相应映射时,应回到启动配置检查。

如果容器已经退出,先检查退出原因。发布端口不会使已停止的应用重新监听,也不能替代数据库启动检查。

在原部署配置中增加端口映射

本机开发只需要宿主机连接时,可在现有启动参数中增加下面这一段:

-p 127.0.0.1:27017:27017

它表示宿主机的 127.0.0.1:27017 转发到容器内 27017。宿主机客户端随后连接 127.0.0.1:27017,而不是容器内部 IP。宿主机端口已被占用时,可选择其他空闲端口,例如 127.0.0.1:27018:27017,客户端同步改用 27018。

使用 Compose 时,把等价的 ports 放进现有数据库服务,保留原来的镜像、数据卷、认证与其他配置:

ports:
  - "127.0.0.1:27017:27017"

已有容器通常需要根据修改后的配置重新创建才能应用新的映射。操作前确认数据库数据持久化位置和备份,保留原启动参数并安排停机窗口。不要为了新增端口删卷、换成未初始化的新目录,或直接另起一个空数据库后误认为原数据丢失。

省略绑定 IP 的 -p 27017:27017 通常会发布到宿主机所有接口,可能扩大数据库可访问范围。本机开发优先限制回环地址;旧 Docker Engine 版本对回环发布存在同网段访问边界差异,不能仅靠映射替代认证和必要的网络访问控制。

端口有了,继续核对数据库本身

映射出现后仍连接失败,应检查容器内数据库是否监听正确端口和可接受连接的地址。连上后出现认证失败,则核对账号和认证数据库,不能为了解决密码错误关闭网络保护。

同一用户自定义网络上的另一个容器,应使用数据库服务名和容器端口。它自己的 127.0.0.1 指向自身,不是宿主机;发布端口也不是容器间访问的必经路径。

成功标准是宿主机客户端通过预期的本机端口完成认证,并能看到原数据库数据。需要回退时恢复原部署配置和数据挂载,重新创建容器;不要把移除端口映射与删除持久数据混为一项操作。