【问题标题】:Mongo service with specific port exposed in a bridge network docker具有特定端口的 Mongo 服务暴露在桥接网络 docker 中
【发布时间】:2019-01-14 08:49:58
【问题描述】:

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

  • mongo 数据库
  • node 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

在服务器端,我正在运行主 app.js,它正在尝试使用此连接字符串连接到 mongodb:

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

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

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

并像这样更新 app.js 文件中的连接字符串:

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

它工作正常。

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

【问题讨论】:

    标签: node.js mongodb docker docker-compose


    【解决方案1】:

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

    风格方面,还请注意,您不需要手动声明一个带有默认选项的专用网络,该选项只能在这个 Docker Compose 文件中使用(Compose 会为您做一些非常相似的事情),并且您不需要' 不需要声明container_name: 只是为了容器间连接(Compose 将添加一个与服务名称匹配的网络别名)。

    【讨论】:

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