在Docker Compose中实现内部网络与外部连接的容器通信

175次阅读
没有评论

问题描述

是Docker的新手,正在尝试运行一个包含多个容器的应用程序。用户希望实现以下目标:
1. Go-Service、PHP-Service、Consul和Mongo Db在一个内部网络中通信,不暴露给外部世界。这个内部网络被称为“backend”。
2. 希望在“backend”网络中的服务能够发送到外部网络的请求。
3. 只暴露特定的端口给外部网络,具体来说,用户希望仅暴露端口8825和8835,这样在主机上可以通过“localhost:8825”和“localhost:8835”访问这些服务。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

步骤1:调整网络配置

首先,你需要调整Docker Compose文件中的网络配置。在你的情况下,你需要移除“frontend”和“backend”网络的internal属性。这将允许这些容器与外部世界通信。

步骤2:发布端口

你可以通过在docker-compose.yml文件中的ports部分来发布端口,使容器可以从Docker主机外部访问。请注意,这些端口的映射将允许外部访问,而不是容器之间的通信。以下是如何为端口8825和8835进行映射的示例:

version: '3.3'
services:
  php-service:
    # 其他配置...
    ports:
      - '8666:8666'
  go-service:
    # 其他配置...
    ports:
      - '8825:8825'
      - '8835:8835'
  consul:
    # 其他配置...
    ports:
      - "8300:8300"
      - "8400:8400"
      - "8500:8500"
      - "8600:53/udp"
  mongo:
    # 其他配置...
    ports:
      - '27100:27017'

步骤3:容器间通信

对于容器之间的通信,你不需要暴露或发布端口。你需要使用Docker提供的内置DNS来解析服务名称和容器内部的应用程序端口。由于你在这些容器中使用了共同的用户定义网络,它们可以通过Docker的内置DNS进行通信。例如,你可以在容器内部使用服务名(如consul和mongo)以及容器内部的应用程序端口(如consul:8300)来进行通信。

步骤4:清理不必要配置

另外,根据回答1中的建议,你可能需要考虑移除docker-compose.yml文件中的container_namedepends_onbuild等配置,因为它们在转换为Swarm模式时可能无法正常工作。

请注意,以上方案基于目前提供的信息和最佳实践。在实际操作中,可能需要根据特定需求进行微调和调试。确保在操作之前备份重要数据,以防发生意外情况。

示例docker-compose.yml文件

version: '3.3'
services:
  php-service:
    build: './php-service'
    ports:
      - '8666:8666'
  go-service:
    build: './go-service'
    ports:
      - '8825:8825'
      - '8835:8835'
    volumes:
      - './go-service:/go/src/go-service'
    depends_on:
      - 'mongo'
      - 'consul'
  consul:
    image: 'consul:latest'
    ports:
      - "8300:8300"
      - "8400:8400"
      - "8500:8500"
      - "8600:53/udp"
  mongo:
    image: 'mongo:latest'
    ports:
      - '27100:27017'
networks:
  default:
    external:
      name: backend

以上是实现在Docker Compose中设置内部网络和外部连接的容器通信的一种方式。请根据实际需求进行适当调整和优化。

正文完