无法连接运行在Docker容器中的MongoDB

31

按照以下示例:https://docs.docker.com/engine/examples/mongodb/

当尝试通过以下命令连接到mongoDB: mongo ip:27017 (其中ip是来自boot2docker ip的名称)+ docker ps中的端口号:

27017/tcp
或者使用 -P 选项
0.0.0.0:49155->27017/tcp

无论哪种方式,都会遇到以下错误:

  

警告:无法连接到ip:27017,原因:errno:61连接被拒绝

     

错误:无法连接到服务器ip:27017(ip),在src/mongo/shell/mongo.js:148处连接尝试失败异常:连接失败


1
使用 docker logs <container>ps 命令检查 MongoDB 是否正在运行并监听您暴露的端口。 - ZeissS
3
好的,更深入地检查一下教程:您能否发布 docker ps 命令输出的容器行?我认为您将内部端口和公共端口搞混了。 - ZeissS
谢谢,你让我重新思考了 :-) - Chris G.
1
我有相同的问题,docker ps 返回: mongo_1 /entrypoint.sh --smallfile ... Up 0.0.0.0:27017->27017/tcp - Wael Ben Zid El Guebsi
你找到解决方案了吗? - user3335999
转而使用图形数据库(dgraph)。 - Chris G.
5个回答

25
如果您指定了正确的端口,但仍无法连接到运行在docker中的mongodb(就像我一样),请确保在连接URL中使用服务名称(或容器名称),例如 mongodb://mongodb_service:27017/mydb ,这在您的 docker-compose.yml 中已定义:
services:
  mongodb_service:
    image: mongo

我曾经使用过hostname的值,但那不是正确的做法。你可以通过查看docker inspect mongodb_service中的Aliases部分来验证这一点。


2
这对我没有用。也许有一个稳定版本的Mongo Docker镜像吗?这里有很多bug。 - user3335999

18

我使用的是端口27017而不是49155(糟糕,端口转发)

0.0.0.0:49155->27017/tcp

感谢ZeissS。


4
那些(像我一样)被答案搞糊涂的人,请使用以下内容进行连接:**$mongo IP:49155**。 - Jardalu
如果您正在使用 Docker Machine 并且使用 Mac,请执行以下操作:
  1. 获取运行 docker 守护进程的 VM 名称 $ docker-machine ls
  2. 获取 VM 的 IP 信息 $ docker-machine env <your VM name>
  3. 使用 mongo 客户端连接到 VM IP 和 mongo 映射端口 $ mongo VM-IP:port
- trevorrobertsjr
@Jardalu 我还是很困惑。 - Aleksandrus
@Aleksandrus请使用您的Docker机器的IP地址替换“IP”。请参阅VMTrooper的回复。 - Jardalu

12

如果您使用的是Mac并且正在使用Docker Machine,请按照以下步骤操作:

1. 获取运行docker守护程序的虚拟机名称
$ docker-machine ls

2. 获取虚拟机的IP信息
$ docker-machine env 

3. 使用mongo客户端连接到虚拟机IP和mongo映射端口
$ mongo VM-IP:port

2
如果您正在使用VirtualBox/docker-machine(Windows/Mac)版本的Docker,则这是一个有效的答案。 - Flash

3
假设你的 MongoDB 在容器内,为了让其他容器连接上它,这些容器都需要在同一个网络中。
要让 MongoDB 和其他想连接它的容器之间建立连接,使用以下命令创建一个新的网络。
docker network create --driver bridge my_bridge

然后使用--net标志运行mongodb和其他容器

docker run --net=my_bridge --name mongodb -p 27017:27017 mongodb
docker run --net=my_bridge --name my-service -p 7002:7002 my-service

现在,您应该能够从这些容器中使用给定的别名连接到MongoDB

mongo --host "mongodb:27017"

2
DATABASE_URI=mongodb://mongo:27017/db_name

应该使用以下类似服务定义的数据库URI(而不是mongodb://localhostmongodb://IP)。使用服务名称或容器名称。
services  
  mongo:
    container_name: mongo
    image: mongo
    ports: 
      - '27017:27017'

只指定端口而不指定容器名称对我很有效。 - RetroCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接