问题描述
是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_name
、depends_on
和build
等配置,因为它们在转换为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中设置内部网络和外部连接的容器通信的一种方式。请根据实际需求进行适当调整和优化。