多服务node.js Web应用程序后端在一个免费的docker库中

docker工人对我来说相当新颖,现在我没有为我准备好正确的工作stream程。

我的目标是:

  1. 用前端编写一个Web应用程序,一个GraphQL API和一个AuthServer。 其他微服务将遵循。
  2. 为了方便地将应用程序部署到我的根服务器,当我在Bitbucket中提交到我的主分支。 我想使用docker hub的自动构build。
  3. 留在docker中心的免费帐户,我只有一个免费的存储库。

如果我的项目结构如下所示,是否有可能达到这些要求:

- services - react frontend (I think it's okay to just put the built static files to the nginx html-folder) - graphqlapi Dockerfile - authservice Dockerfile - another service in the future Dockerfile docker-compose.yml 

我有根文件夹中的docker-compose.yml。 但docker中心的自动生成说,它需要一个Dockerfile来build立图像。

对于我来说,在一个图像/容器中运行所有的服务是可以的,因为目前我只想让它们在同一台机器上运行。

所以再次我的问题:是否有可能dockerize多服务的Web应用程序到一个docker的图像/容器的免费docker中心存储库?

TL; TR

可以在一个容器中运行多个服务,但我极力阻止你这样做。

无论如何,你可以在同一个映像中捆绑所有的服务,然后(1)使用多个服务运行一个容器,或者(2)使用一个主pipe运行它们。

如果你的约束只是单一的图像,你可以做的更好,(3)运行多个容器使用相同的图像,自定义服务运行在每个。

为什么要避免在容器中运行多个进程?

Docker文档说 (粗体是我的):

通常build议您通过每个容器使用一个服务来分隔关注的区域。 该服务可能会分成多个进程(例如,Apache Web服务器启动多个工作进程)。

然后继续:

可以有多个进程,但为了从Docker中获得最大的好处, 避免一个容器负责整个应用程序的多个方面

这是因为Docker容器连接到单个进程(通常由ENTRYPOINT / CMD定义),并且当此进程死亡时,整个容器都将停止。

容器的devise是为了隔离服务:如果你想要一个孤立的环境与许多非隔离的服务(如上述前两种方式),可能最好使用虚拟机。

基地

每种方法的共同思想是使用一个Dockerfile将每个应用程序打包到同一个最终映像中:

 FROM ubuntu // RUN install dependencies for every app you have // COPY all your binaries/apps (eg service 1, 2, 3) or build them 

包装脚本方式(1)

在Docker文档中的第一个示例之后,您可以使用在后台启动它们的包装脚本启动多个服务,如果所有这些脚本都在运行,则每分钟检查一次。 当一个服务崩溃时,整个容器停止。

在这种情况下,您的图像将以类似CMD ./my_wrapper_script.sh的命令行CMD ./my_wrapper_script.sh

主pipe的方式(2)

正如在上面的评论中所build议的那样,您可以使用容器内的主pipe来运行多个服务,以避免上述问题。 通过这种方式,您可以有多个由主pipepipe理的进程,如果主pipe崩溃,您的所有服务将被取消(您只有一个单点故障)。

在这种情况下,您的图像将以像CMD start-supervisor这样的一行结束。

自定义命令的方式(3)

如果你的约束只是单个图像,你可以有多个容器,这是最好的方法。 只需运行一个显式的command作为最后一个参数,启动多个容器:

 docker run your-image your-service-1 docker run your-image your-service-2 docker run your-image your-service-3 

你也可以使用docker-compose文件 。

采用这种方法,您不会“破坏” 每个容器规则中具有更具弹性的部署的一项服务