You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose环境下Ruby应用如何连接Mongo容器?

问题根源:容器不在同一Docker网络中

你遇到的核心问题是:你用docker run单独启动的容器,和docker-compose创建的容器不在同一个Docker网络里。Docker Compose默认会为你的项目创建一个专属的隔离网络,而直接用docker run启动的容器会使用默认的bridge网络,这两个网络是相互隔离的,所以你的脚本根本无法访问到mongodb服务。

快速解决方案:用docker-compose exec进入已有容器

不要单独启动新容器,直接进入docker-compose已经创建好的web容器(它已经在正确的网络里,并且已经配置了和mongodb的连接):

docker-compose exec web /bin/bash

进入之后再运行你的脚本,应该就能正常连接到MongoDB了。

为什么之前的操作不行?

  • Docker Compose启动的所有服务(mongodb、web、mongo-seed)都在同一个专属网络里,所以它们之间可以通过服务名(比如mongodb)互相访问。
  • 你用docker run启动的新容器,默认处于Docker的公共bridge网络,这个网络和Compose的专属网络没有关联,自然无法解析mongodb这个主机名,也无法建立连接。

如果一定要单独启动容器怎么办?

如果你确实需要单独启动一个容器来运行脚本,需要把它加入到Compose创建的专属网络中:

  1. 先查看你的Compose项目对应的网络名称:
docker network ls

你会看到一个类似<你的项目文件夹名>_default的网络(比如你的项目在ruby-mongo-app文件夹,网络名就是ruby-mongo-app_default)。

  1. 启动容器时指定这个网络:
docker run -it --network <你的compose网络名> <你的镜像名> /bin/bash

这样新容器就和mongodb处于同一网络,脚本里的连接字符串就能正常工作了。

额外验证:连接字符串是没问题的

你尝试的几种连接字符串写法都是正确的:

  • Mongo::Client.new([ 'mongodb:27017' ], :database => 'test')
  • mongodb://mongodb:27017

这些写法在同一网络里都能正确解析到mongodb服务,所以问题完全出在网络隔离上。

内容的提问来源于stack exchange,提问作者SuperM4n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:45:37