如何在Docker容器和主机之间进行通信

qmelpv7a  于 2022-12-11  发布在  Docker
关注(0)|答案(2)|浏览(175)

我正在尝试在一个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是相同的。

kupeojn6

kupeojn61#

在docker-compose.yaml中添加端口Map
喜欢

version: '3.7'
services:
  mongodb:
    image: mongo:latest
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: mypassword
    ports:
      - 27018:27017
    volumes:
      - mongodb_data_container:/data/db

现在,您可以使用mongodb:27017访问Docker网络内部的MongoDb,也可以从本地计算机的端口27018访问MongoDb。您可以将27018替换为本地计算机上的一个空闲端口,并在Compass配置中使用localhost。

lqfhib0f

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
==〉不起作用
有人能给予我解释一下这是怎么回事吗?

相关问题