我是Docker的新手。
我正在尝试运行包含多个容器的应用程序

这是我的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_namedepends_onbuild,因为它们将不起作用如果您尝试过渡到群体模式。