使多个 Node js docker 化的应用程序与 mongodb docker 通信

Make multiple Node js dockerized app communcate to mongodb docker

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

docker-compose.yml 应用程序 1

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

Click link for Architecture Setup

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

2 mongo 中的一个将无法启动,因为端口已被占用。

选项 1(更好):

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

  mongodb:
    ports:
      - '27017:27017'

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

的两个后端访问 mongo

选项2(丑):

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

  mongodb:
    ports:
      - '27017:27017'

并在另一个 docker-compose

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

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