首页 > 解决方案 > 使多个 Node js dockerized 应用程序与 mongodb docker 通信

问题描述

我已经构建了两个共享公共数据库的 NEST 应用程序。我一直在想办法让这两个应用程序从 Mongo db 容器中获取数据。我被这个过程困住了。

带有应用程序 1 的 docker-compose.yml

version: '3'

services:  
  backend:
    image: 'example-image_1:1.0.0'
    working_dir: /app/example-app-1/backend/example-app-1-api
    environment:
      - DB_URL=mongodb://0.0.0.0:27017/example_app_1
      - BACKEND_PORT=3333
      - BACKEND_IP=0.0.0.0
    restart: always
    network_mode: "host"
    ports:
      - '3333:3333'
    command: ['node', 'main.js']
    depends_on:
      - mongodb

    expose:
      - 3333

  mongodb:
    image: 'mongo:latest'
    environment:
      - 'MONGODB_DATABASE="example_app_1"'
    ports:
      - '27017:27017'
    expose:
      - 27017

docker-compose.yml 与 app-2

version: '3'

services:   
  backend:
    image: 'example_app_2:1.0.0'
    working_dir: /app/example_app_2/backend/example-app-2-api
    environment:
      - DB_URL=mongodb://0.0.0.0:27017/example_app_2
      - BACKEND_PORT=8888
      - BACKEND_IP=0.0.0.0
    restart: always
    ports:
      - '8888:8888'
    command: ['node', 'main.js']
    expose:
      - 8888

  mongodb:
    image: 'mongo:latest'
    environment:
      - 'MONGODB_DATABASE="example_app_2"'
    ports:
      - '27017:27017'
    expose:
      - 27017

我需要帮助使这些应用程序与通用容器通信 - mongodb

点击链接进行架构设置

标签: node.jsdockerdocker-composenestjsdocker-container

解决方案


由于您使用的是 2 个不同docker-compose.yml的,您实际上在 2 个上运行 2 个后端和 2 个 mongodbdocker-networks

2个mongo之一不会启动,因为端口已经被占用。

选项1(更好):

services:   
  backend_1:
      ...
    ports:
      - '8888:8888'
  backend_2:
      ...
    ports:
      - '8899:8899'

  mongodb:
    ports:
      - '27017:27017'

此设置在同一网络上提供 3 个容器。现在您可以从两个后端访问 mongo<mongo_ip>:27017

选项2(丑陋):

services:   
  backend:
      ...
    ports:
      - '8888:8888'

  mongodb:
    ports:
      - '27017:27017'

在另一个 docker-compose

services:   
  backend:
      ...
    ports:
      - '8888:8888'

此设置在 2 个不同的网络上提供 3 个容器。在此设置中,每个docker-compose.yml都有自己的 docker 网络,因此您必须从第二个后端服务连接到另一个 docker 网络才能访问容器。


推荐阅读