如何为基于polyglot微服务的应用程序设置Docker?

在我的一个比平时更大的项目上工作,我正在构build一个Web应用程序,它将与我的几个API进行对话,每个API都以自己的语言编写。 我使用两个数据库,一个是MariaDB,另一个是Dgraph(graphics数据库)。

这是我当地的导演架构:

  • 服务 – 所有我的服务
    • API – 包含我所有的API
      • auth – 包含我的用户authentication/注册API
        • v1 – 包含我当前(仅)的API版本
      • 审判 – 包含我的一个叫做审判的API
      • 等等…
    • 应用程序 – 包含用户将与之交互的应用程序
    • 守护进程 – 包含我的程序将作为守护进程运行
    • 工具 – 包含工具(导入数据,刮板等)
  • 数据库 – 包含我的两个configuration(MariaDB和Dgraph)

本地文件结构

由于某些组件是用PHP7-NGINX编写的,而其他组件是用PYTHON-FLASK-NGINX编写的,所以我怎么才能做到这一点呢? 每个服务,api,守护进程和工具都是独立的,它们都通过自己的REST端点进行通信。

每个人都有自己的私人github存储库,我希望能够采取每一个,并在需要时部署到自己的服务器。

我是Docker的新手,我所做的所有阅读都让我感到困惑:应该为每个服务创build一个docker-compose.yml,还是为整个项目创build一个docker-compose.yml? 但是每个服务都是分开部署的,那么docker-compose.yml是如何知道的呢?

任何指针干净的解决scheme? 我应该为每个服务创build一个容器,并在该容器中放入NGINX,PHP或PYTHON等?

通常的做法是将每个独立的组件放入一个单独的容器中。 一般Docker的想法是1个容器= 1个逻辑任务。 1任务不完全是1个过程,它只是最小的独立单位。

所以你需要find4个基本的图像(可能来自Dockerregistry的现有的图像):

  • PHP7,NGINX
  • PYTHON瓶,NGINX
  • MariaDB的
  • DGraph组件

您可以使用https://hub.docker.com/search/search适当的图像。

然后为每个组件创build自定义的Docker文件(以PHP7-NGINX或PYTHON-FLASK-NGINX作为父映像)。

您可能不需要为数据库定制Docker文件。 通常,数据库映像只需要使用--volume选项将configuration文件挂载到映像中,或者传递环境参数(有关详细信息,请参阅基本映像的描述)。

之后,你可以写docker-compose.yml,并在这里定义你的图像如何链接和其他参数。 这将看起来像https://github.com/wodby/docker4drupal/blob/master/docker-compose.yml 。 顺便说一句,github中充满了docker-compose.yml的好例子

如果您要在不同的服务器上运行服务,那么您可以创build一个Swarm集群,然后运行docker-compose.yml: https ://docs.docker.com/compose/swarm/。 之后,您可以通过根据需要部署每个微服务的多个实例来轻松扩展(这就是为什么每个微服务都有独立的图像更为有用)的原因。