Node.js 网桥网络docker中公开特定端口的Mongo服务

Node.js 网桥网络docker中公开特定端口的Mongo服务,node.js,mongodb,docker,docker-compose,Node.js,Mongodb,Docker,Docker Compose,我有一个示例应用程序,它由三部分组成: mongo数据库 节点api(服务器端) angular web应用程序(客户端) 目标是将这三个部分封装起来并运行应用程序。 为了达到这个目的,我创建了如下的docker compose.yml文件: # docker-compose -f docker-compose.prod.yml build # docker-compose -f docker-compose.prod.yml up -d # docker-compose -f docker

我有一个示例应用程序,它由三部分组成:

  • mongo数据库
  • 节点api(服务器端)
  • angular web应用程序(客户端)
目标是将这三个部分封装起来并运行应用程序。 为了达到这个目的,我创建了如下的
docker compose.yml
文件:

# docker-compose -f docker-compose.prod.yml build
# docker-compose -f docker-compose.prod.yml up -d
# docker-compose -f docker-compose.prod.yml down

    version: '3'

    services:

      mongodb:
        image: mongo
        container_name: mongodb-instance-microservices    
        ports: 
          - "27020:27017"
        networks:
          - microservices-network

      client:
        container_name: client-instance-microservices
        image: client-microservices
        build:
          context: ./client
          dockerfile: prod.dockerfile
        ports:
          - "8080:80"
          - "443:443"
        depends_on:
           - api
        networks:
          - microservices-network

      api:
        container_name: api-instance-microservices
        image: api-microservices
        build:
          context: ./server
          dockerfile: server.dockerfile
        environment:
          - NODE_ENV=production
        ports:
          - "3000:3000"
        depends_on:
           - mongodb
        networks:
          - microservices-network

    networks:
      microservices-network:
        driver: bridge
  mongodb:
        image: mongo
        container_name: mongodb-instance-microservices    
        ports: 
          - "27017:27017"
        networks:
          - microservices-network
在服务器端,我正在运行main
app.js
,它正试图使用以下连接字符串连接到mongodb:

mongodb://mongodb-instance-microservices:27020/TestDatabase

问题是服务器无法连接到mongo db容器。 我尝试公开mongo的默认端口,如下所示:

# docker-compose -f docker-compose.prod.yml build
# docker-compose -f docker-compose.prod.yml up -d
# docker-compose -f docker-compose.prod.yml down

    version: '3'

    services:

      mongodb:
        image: mongo
        container_name: mongodb-instance-microservices    
        ports: 
          - "27020:27017"
        networks:
          - microservices-network

      client:
        container_name: client-instance-microservices
        image: client-microservices
        build:
          context: ./client
          dockerfile: prod.dockerfile
        ports:
          - "8080:80"
          - "443:443"
        depends_on:
           - api
        networks:
          - microservices-network

      api:
        container_name: api-instance-microservices
        image: api-microservices
        build:
          context: ./server
          dockerfile: server.dockerfile
        environment:
          - NODE_ENV=production
        ports:
          - "3000:3000"
        depends_on:
           - mongodb
        networks:
          - microservices-network

    networks:
      microservices-network:
        driver: bridge
  mongodb:
        image: mongo
        container_name: mongodb-instance-microservices    
        ports: 
          - "27017:27017"
        networks:
          - microservices-network
并更新app.js文件中的连接字符串,如下所示:

mongodb://mongodb-instance-microservices:27017/TestDatabase

而且工作很好


问题是如何为mongo容器公开不同的端口并使其正常工作?

当您使用Docker内部网络在服务之间连接时,始终连接到服务的内部端口。您不需要显式地发布端口(在Compose中,使用
ports:
指令);如果这样做,您要连接的端口就是右边的端口

就样式而言,还需要注意的是,您不需要手动声明带有默认选项的专用网络,这些默认选项将仅在Docker Compose文件中使用(Compose将为您执行类似的操作),并且您不需要仅为容器间连接而声明
容器名称:
(Compose将添加与服务名称匹配的网络别名)