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

Fel*_*iel 7 containers docker

我刚刚开始使用docker,我正在试图弄清楚如何部署我们的web应用程序.我们有:

  • ReactJS Webapplication&Workbench Frontend(非同构,Apache)
  • Java/Wildfly服务器后端
  • PostgreSQL数据库
  • 用于推送通知的NodeJS Websocket服务器

我的第一种方法是将它全部放在一个ubuntu容器中,然后部署它.这导致了一个非常长的dockerfile,所以我认为这不是正确的方法,我google了最佳实践,并且发现每个容器应该只有一个问题.

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

我现在看到的优点是:

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

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

  • 可能会复杂地将所有容器链接在一起
  • (小)由于4个容器而不是1个单独运行而导致的性能损失(以及排队,邮件服务器......)

ob1*_*ob1 11

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

Compose是一个用于定义和运行多容器Docker应用程序的工具.使用Compose,您可以使用Compose文件来配置应用程序的服务.然后,使用单个命令,您可以从配置中创建并启动所有服务.- Docker Compose概述

要使用此工具,您将:

  1. 为每个单独的容器创建包含文件夹的项目目录.

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

用于服务器API的Dockerfile(和Web App(角度):

# 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
Run Code Online (Sandbox Code Playgroud)
  1. 在项目文件夹中定义一个docker-compose.yml文件.此文件将定义应用程序中的服务,以便它们可以在隔离环境中一起运行.撰写文件版本3参考

docker compose文件遵循以下结构:

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: {}
Run Code Online (Sandbox Code Playgroud)
  1. 最后运行docker-compose up和Compose将开始运行整个应用程序!

  • @magnoz如果您尝试引用运行docker容器Web应用程序的主机的名称,则需要在构建命令中将主机名传递给环境变量(然后将其设置为docker中的环境变量)文件)或将其作为docker container run命令中的环境变量传递.然后,您应该像任何其他环境变量一样引用此环境变量!这是另一篇文章,涵盖了这个过程!/sf/ask/3181045731/ (2认同)
  • 我知道这是一篇旧文章(但我仍然可以通过搜索找到它,因此仍然很相关),但最好格式化Web应用程序的install / build部分,类似于https://vuejs.org/v2/cookbook /dockerize-vuejs-app.html,因为按原样,您每次在应用程序中进行某些更改时都会重新安装所有依赖项,因为无法使用缓存。最好引入package.json,进行安装,然后复制所有代码(不必担心再次复制package.json),然后进行构建。 (2认同)