【问题标题】:Can't access MongoDB container from NodeJS App无法从 NodeJS 应用程序访问 MongoDB 容器
【发布时间】:2021-12-07 12:49:47
【问题描述】:

我在我的 Docker 容器中运行一个 Web 应用程序的实例,同时也在运行一个 MongoDB 容器,因此当我启动 Web 应用程序时,我可以轻松地在应用程序的连接页面上连接到数据库。

问题是我不确定如何从我的网络应用程序访问 Mongo 容器,也不确定我的主机/端口连接信息是否正确。

我的 Docker 设置

如您所见,容器已启动并运行,mongo 和 Web 应用程序服务都在正常运行

我通过docker-compose.yml构建这两个

version: "3.3"

services:
  web:
    image: grafana-asw-v3
    container_name: grafana-asw-v3
    restart: always
    build: .
    ports:
      - "13000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
    stdin_open: true
    tty: true
  db:
    container_name: mongo
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - grafana-mongo-db:/var/lib/mongo
    ports:
      - "27018:27017"

volumes:
  grafana-mongo-db: {}
  grafana-storage: {}

问题

一切都启动并运行后,我尝试通过网络应用进行连接,但我似乎使用了错误的连接信息...

我假设使用“hostMachine:port”(roxane:27018),但它没有连接。这里有什么我忽略的吗?

【问题讨论】:

  • web 容器是您的应用程序吗?您应该能够使用数据库 Compose 服务名称 db 和标准 MongoDB 端口 27017(ports: 被完全忽略)。另请参阅 Docker 文档中的 Networking in Compose

标签: node.js mongodb docker docker-compose


【解决方案1】:

简答

  • db 服务与web 服务不在host 网络中。
  • 当您通过container_name 命名您的服务时,您应该能够使用连接字符串mongodb://mongo:27017

说明

  • 默认情况下,docker 容器在bridge network 下运行,允许它们在不查看主机网络的情况下进行通信。
  • 在撰写文件中使用ports 时,您定义要将容器的内部端口映射到主机端口
  • "27018:27017" => 我想将容器端口号 27017 暴露给主机端口号 27018。

因此,您可以在不暴露 mongo 服务的情况下暴露 Web 前端:

version: "3.3"

services:
  web:
    image: grafana-asw-v3
    container_name: grafana-asw-v3
    restart: always
    build: .
    ports:
      - "13000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
    stdin_open: true
    tty: true
  db:
    container_name: mongo
    image: mongo
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    volumes:
      - grafana-mongo-db:/var/lib/mongo

volumes:
  grafana-mongo-db: {}
  grafana-storage: {}

【讨论】:

    【解决方案2】:

    我必须进行两项更改才能解决此问题:

    1. 通过对我的 docker-compose 文件进行此更改来修改 mongod.conf 中的 bind_ip
    db:
        container_name: mongo
        image: mongo
        environment:
          MONGO_INITDB_ROOT_USERNAME: root
          MONGO_INITDB_ROOT_PASSWORD: example
        volumes:
          - grafana-mongo-db:/var/lib/mongo
        ports:
          - "27018:27017"
        command: mongod --bind_ip 0.0.0.0
    
    1. 我需要在我的应用程序的 cli 中引用 IP 地址而不是主机名。 (感谢this answer 对此的帮助)

    【讨论】:

      猜你喜欢
      • 2020-09-06
      • 2018-04-27
      • 2019-05-24
      • 1970-01-01
      • 2021-05-11
      • 2020-03-14
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      相关资源
      最近更新 更多