我正在尝试在一个Docker容器中部署一个API,这个API需要与另一个Docker容器(mongo)和一些其他服务进行通信。
我使用一个docker-compose文件启动这些容器,这两个容器都在一个用户定义的桥接网络中。它们可以通过自动DNS解析相互通信,但是为了使用Mongo Compass,我想从我的本地机器访问Mongo容器。
我尝试使用Docker容器的IP地址:docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mongo1
,但我尝试ping时总是超时。
根据文档,此行为似乎是正常的:
使用用户定义的网络提供了一个范围网络,其中只有连接到该网络的容器能够进行通信。
但是我想我错过了一些东西,有没有办法做到这一点?
编辑:
仅供参考,这里是我的docker-compose.yaml文件的摘录(如您所见,我正在配置mongo以拥有一个replicaSet示例):
mongo1:
container_name: mongo1
image: mongo:5
command: ["--replSet", "rs0", "--bind_ip_all"]
volumes:
- mongodb-volume:/data/db
networks:
- api-network
ports:
- 27017:27017
restart: always
healthcheck:
test: test $$(echo "rs.initiate({_id:'rs0',members:[{_id:0,host:\"mongo1:27017\"}]}).ok || rs.status().ok" | mongo --port 27017 --quiet) -eq 1
interval: 10s
start_period: 30s
api:
container_name: api
build:
context: .
target: development
volumes:
- .:/usr/src/app
- /usr/src/app/node_modules
command: npm run start:dev
depends_on:
- mongo1
ports:
- 4000:4000
networks:
- api-network
这里是我尝试使用指南针连接时mongo的日志:
mongo1 | {"t":{"$date":"2022-12-07T13:27:57.556+00:00"},"s":"I", "c":"NETWORK", "id":22943, "ctx":"listener","msg":"Connection accepted","attr":{"remote":"192.168.176.1:58274","uuid":"48afaca9-6ad6-4f15-95fe-239935822907","connectionId":158,"connectionCount":12}}
mongo1 | {"t":{"$date":"2022-12-07T13:27:57.560+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn158","msg":"client metadata","attr":{"remote":"192.168.176.1:58274","client":"conn158","doc":{"driver":{"name":"nodejs","version":"4.10.0"},"os":{"type":"Darwin","name":"darwin","architecture":"x64","version":"21.5.0"},"platform":"Node.js v16.5.0, LE (unified)|Node.js v16.5.0, LE (unified)","application":{"name":"MongoDB Compass"}}}}
mongo1 | {"t":{"$date":"2022-12-07T13:27:57.567+00:00"},"s":"I", "c":"NETWORK", "id":22944, "ctx":"conn158","msg":"Connection ended","attr":{"remote":"192.168.176.1:58274","uuid":"48afaca9-6ad6-4f15-95fe-239935822907","connectionId":158,"connectionCount":11}}
编辑2
看起来我可以使用mongo shell访问我的数据库,但仍然不能使用Compass访问它,即使连接URI是相同的。
2条答案
按热度按时间kupeojn61#
在docker-compose.yaml中添加端口Map
喜欢
现在,您可以使用mongodb:27017访问Docker网络内部的MongoDb,也可以从本地计算机的端口27018访问MongoDb。您可以将27018替换为本地计算机上的一个空闲端口,并在Compass配置中使用localhost。
lqfhib0f2#
经过一些研究和测试,我可以从我的本地机器上用Compass访问我的dockerized mongo示例,但是我必须在连接uri中设置
directConnection=true
,否则它不能工作。mongodb://localhost:27017/<my-db>?directConnection=true
==〉作品
mongodb://localhost:27017/<my-db>?replicaSet=rs0&directConnection=true
==〉工作,但根据文件,directConnection不支持replicaSet。
mongodb://localhost:27017/<my-db>
==〉不起作用
mongodb://localhost:27017/<my-db>?replicaSet=rs0
==〉不起作用
有人能给予我解释一下这是怎么回事吗?