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创建的专属网络中:
- 先查看你的Compose项目对应的网络名称:
docker network ls
你会看到一个类似<你的项目文件夹名>_default的网络(比如你的项目在ruby-mongo-app文件夹,网络名就是ruby-mongo-app_default)。
- 启动容器时指定这个网络:
docker run -it --network <你的compose网络名> <你的镜像名> /bin/bash
这样新容器就和mongodb处于同一网络,脚本里的连接字符串就能正常工作了。
额外验证:连接字符串是没问题的
你尝试的几种连接字符串写法都是正确的:
Mongo::Client.new([ 'mongodb:27017' ], :database => 'test')mongodb://mongodb:27017
这些写法在同一网络里都能正确解析到mongodb服务,所以问题完全出在网络隔离上。
内容的提问来源于stack exchange,提问作者SuperM4n
相关产品推荐
相关产品推荐

