Docker:前端,后端,数据库,推送服务器的4个容器?

我刚刚开始与docker,我想弄清楚如何部署我们的Web应用程序。 我们有:

  • ReactJS Web应用程序和工作台前端(Non-isomorph,Apache)
  • Java / Wildfly服务器后端
  • PostgreSQL数据库
  • NodeJS Websocket服务器进行推送通知

我的第一个方法是把它放在一个Ubuntu的容器里,然后部署它。 这导致了一个很长的docker文件,所以我认为这是不正确的方法, 我search了最佳实践,并指出,每个容器应该只有一个问题。

这是否意味着我应该为每个上述过程使用一个容器并将它们连接起来,这将导致4个正在运行的容器(数据库中有一个容器)?

我现在看到的优点是:

  • 可扩展性
  • 可维护性
  • 将应用程序的部分移动到不同的服务器/主机上更容易

我能想到的唯一的两个缺点是

  • 可能会把所有的容器连接在一起
  • (小)性能损失,由于4个容器运行,而不是一个单一的(更多的来排队,邮件服务器,…)

你可以使用4个不同的容器! 对于Docker,你通常希望尽量保持每个容器相对简单,但这并不意味着你必须将每个组件分离到不同的容器中,例如从你的服务器API中的Web应用程序(我发现将它们组合在同一个容器中是有用的因为它使沟通更容易)但是,将您的数据库放在一个单独的容器中是一个好习惯。 Docker有一个名为Docker Compose的工具来启动容器应用程序:

Compose是定义和运行多容器Docker应用程序的工具。 通过撰写,您可以使用撰写文件来configuration您的应用程序的服务。 然后,使用单个命令创build并启动configuration中的所有服务。 – Docker撰写概述

为了使用这个工具,你将会:

  1. 使用每个单独容器的文件夹创build一个项目目录。

  2. 通过在子文件夹中为每个容器(Web App / Server API)(数据库)创build一个Dockerfile来定义您的应用程序环境。

Server API的Dockerfile(和Web应用程序(angular色)):

 # Create image based on the official Node 6 image from dockerhub FROM node:6 # Create a directory where our app will be placed RUN mkdir -p /usr/src/app/ # Change directory so that our commands run inside this new directory WORKDIR /usr/src/app # Get all the code needed to run the app COPY . /usr/src/app # Move into AngularApp directory WORKDIR /usr/src/app/public # Install dependencies for AngularApp RUN npm install # Changed to updated angular dependency RUN ./node_modules/@angular/cli/bin/ng build # Move into server directory WORKDIR /usr/src/app/server # Install dependencies for server RUN npm install # Return to top level directory of project WORKDIR /usr/src/app # Add API environment variables ENV USERNAME="username" ENV PASSWORD="password" # Expose the port the app runs in EXPOSE 4200 EXPOSE 80 WORKDIR /usr/src/app 
  1. 在项目文件夹中定义一个docker-compose.yml文件。 该文件将定义您的应用程序中的服务,以便它们可以在隔离的环境中一起运行。 撰写文件版本3参考

一个docker撰写文件遵循这个结构:

 version: '3' services: web: build: <directory with Dockerfile for service> ports: - "5000:5000" volumes: - .:/code - logvolume01:/var/log links: - redis database: image: mongo volumes: logvolume01: {} 
  1. 最后运行docker-compose up ,Compose将开始运行你的整个应用程序!