我正在尝试运行包含多个容器的应用程序
这是我的docker-compose.yml文件
version: '3.3'
services:
php-service:
container_name: 'php-service'
build: './php-service'
networks:
- backend
ports:
- '8666:8666'
go-service:
container_name: 'go-service'
build: './go-service'
ports:
- '8825:8825'
- '8835:8835'
volumes:
- './go-service:/go/src/go-service'
networks:
- frontend
- backend
depends_on:
- 'mongo'
- 'consul'
consul:
image: 'consul:latest'
networks:
- backend
ports:
- "8300:8300"
- "8400:8400"
- "8500:8500"
- "8600:53/udp"
mongo:
image: 'mongo:latest'
container_name: 'mongo'
networks:
- backend
ports:
- '27100:27017'
networks:
frontend:
internal: false
backend:
internal: true
什么我想实现。
外部环境-是运行Docker守护程序的主机的网络空间。
Go-Service,PHP-服务,领事和Mongo Db通过内部网络进行通信,而这些网络不暴露于外部环境。我们将此称为网络后端。
我希望后端网络内部的服务能够将传出请求发送到外部世界
另一个网络用于外部世界,我只需要公开特定的端口。就我而言,我只想公开8825和8835。这样,端口将在主机上显示为localhost:8825和localhost:8835
是否可以获得所需的配置?
或者我做错了什么,请提出任何其他好的方法来实现这一目标。
非常感谢您
#1 楼
内部Docker网络意味着没有配置可访问外部Internet的网关,您只能从该网络访问其他容器。在您的方案中,您的网络都不应该具有此定义。如果不设置内部网络标志,则容器可以从Docker主机伸出,如果主机具有该访问权限,则有可能到达Internet。这是一种单向访问,容器可以访问外部网络,但是该外部网络无法访问容器。
要从Docker主机外部访问容器,您需要在端口上发布端口主机映射到所需的容器(或服务)。仅需要在
ports
文件中使用docker-compose.yml
部分发布端口来提供外部访问,而不需要在容器之间进行访问。容器内的应用程序需要在所有接口(0.0.0.0)上侦听主机上的发布端口以及容器到容器的通信。但是,可以在主机上的特定接口上发布端口,例如:ports:
- '127.0.0.1:8825:8825'
- '127.0.0.1:8835:8835'
对于容器到容器的通信,没有必要公开或发布端口。所需的是容器之间共有的用户定义网络(您拥有的网络)。然后,容器可以使用Docker的内置DNS进行通信,以解析服务名称(例如consul和mongo)以及该容器内的应用程序端口(例如consul:8300)。为避免外部网络访问这些容器,请不要从中发布任何端口。
侧面说明:从
docker-compose.yml
中,还应考虑删除container_name
,depends_on
和build
,因为它们将不起作用如果您尝试过渡到群体模式。