Docker and Docker Compose

无论在开发还是生产中,使用Docker和Docker Compose都是一个很好的解决方案。

  1. 简介 Description
  2. 前提 Prerequisites
  3. 构建并运行应用程序的Docker映像 Building a Docker image of your application
  4. 为多个应用程序生成定制的Docker-Compose配置 Generating a custom Docker-Compose configuration for multiple applications
  5. 使用数据库 Working with databases
  6. 灵活检索 Elasticsearch
  7. Sonar Sonar
  8. 常用命令 Common commands
  9. 内存调整 Memory Tweaking

1. 简介 Description

_注意:这个Docker配置用于在容器映像中运行生成的应用程序。它完全不同于Docker setup 中所介绍的,Docker setup 是用于在容器内运行JHipster生成器。

JHipster提供了完整的Docker支持是为了:

  • 促进JHipster发展:通过Docker可以轻松地启动一个完整的基础开发环境,即使使用复杂的微服务架构也是如此。
  • 统一配置:对于使用Docker Swarm的人员可以直接部署、生产,因为它使用相同的Docker Compose配置。

使用Docker Compose有可以轻松地扩展容器,通过docker-compose scale命令。使用JHipster 的微服务架构( a microservices architecture )是非常有趣的。

当生成应用程序时,JHipster为您生成:

  • 用于构建Docker映像并在应用程序中运行应用程序的Docker文件。
  • 几个 Docker Compose 配置文件以便于运行第三方服务,如数据库服务。

那些文件存放于 src/main/docker/文件夹里。

2. 前提 Prerequisites

你必须安装Docker 与 Docker Compose

提示: 在Windows和Mac OS X上,Kitematic是Docker Toolbox提供的易于使用的图形界面,这将使Docker更容易.
注意 : 如果您在Mac或Windows上使用Docker Machine,则Docker守护程序只能访问您的OS X或Windows文件系统。Docker Machine尝试自动共享您的/ Users(OS X)或C:\ Users< username>(Windows)目录。因此,您必须在此目录下创建项目文件夹,以避免任何问题,尤其是如果您使用JHipster Console 进行监视。

如何在安装JHipster UML(或任何未捆绑的包)的过程中遇到错误:npm ERR! Error: EACCES: permission denied,你的容器可能没有使用sudo的方式安装(例如:sudo不与 Ubuntu Xenial 进行绑定)。

解决办法 1

NPM文档建议不要以root身份安装任何NPM软件包,根据NPM官方文档 official documentation修复错误。

解决办法 2

  • docker container exec -u root -it jhipster bash,
  • npm install -g YOUR_PACKAGE,
  • then exit and log into the container normally: docker container exec -it jhipster bash

3. 构建并运行应用程序的Docker映像 Building and running a Docker image of your application

创建应用程序的Docker映像,并将其推入Docker registry:

  • With Maven, type: ./mvnw package -Pprod docker:build
  • With Gradle, type: ./gradlew bootRepackage -Pprod buildDocker

这将使用prod配置文件打包应用程序,并安装映像。 要运行此映像,请使用位于应用程序的src/main/docker文件夹中的Docker Compose配置:

  • docker-compose -f src/main/docker/app.yml up

该命令将启动您的应用程序及其所依赖的服务(数据库,搜索引擎,JHipster Registry ...)。

4. 为多个应用程序生成定制的Docker-Compose配置 Generating a custom Docker-Compose configuration for multiple applications

如果您的架构由几个JHipster应用程序组成,您可以使用特定的docker-compose sub-generator,它将为所有选定的应用程序生成全局Docker Compose配置。通过Docker Compose的一个命令可以部署和扩展整个系统。 使用docker-compose subgenerator:

  • 需要将所有的monolith(s), gateway(s)和微服务都放在同一个目录中。
  • 创建另外一个目录,例如 mkdir docker-compose.
  • 进入这个目录: cd docker-compose.
  • 运行 sub-generator: jhipster docker-compose.
  • 如果要使用ELK或Prometheus设置监视,那么sub-generator将询问您想要在架构中使用哪个应用程序。

这将生成一个全局Docker Compose配置,键入docker-compose up 来组合运行它,并让您的所有服务一次运行。

在微服务体系结构的情况下,此配置还将预先配置JHipster注册表或领事,JHipster注册表将自动配置您的服务:

  • 这些服务将等到JHipster注册表(或领事)开始运行时才运行。这可以在 bootstrap-prod.yml 文件中用 spring.cloud[.consul].config.fail-fast and spring.cloud[.consul].config.retry 值进行配置.
  • 注册表将配置您的应用程序,例如它将在所有服务之间共享JWT秘密令牌。
  • 使用Docker Compose完成每个服务的扩展, 例如:键入 docker-compose scale test-app=4 就将有4个测试应用实例去运行。这些实例将由gateway实现负载均衡,并将自动加入相同的Hazelcast集群(如果Hazelcast是您的Hibernate二级缓存)。

5. 使用数据库 Working with databases

MySQL, MariaDB, PostgreSQL, Oracle, MongoDB or Cassandra

运行docker-compose -f src/main/docker/app.yml up命令后数据库就自动运行了。

如果你只想运行数据库,而不是其他服务,使用 Docker Compose配置你的数据库:

  • With MySQL: docker-compose -f src/main/docker/mysql.yml up
  • With MariaDB: docker-compose -f src/main/docker/mariadb.yml up
  • With PostgreSQL: docker-compose -f src/main/docker/postgresql.yml up
  • With Oracle: docker-compose -f src/main/docker/oracle.yml up
  • With MongoDB: docker-compose -f src/main/docker/mongodb.yml up
  • With Cassandra: docker-compose -f src/main/docker/cassandra.yml up

MongoDB 群集模式 MongoDB Cluster Mode

如果你想使用 MongoDB 复制集或分片集群并在他们之间共享配置的话,你需要根据以下步骤创建并设置MongoDB的镜像:

  • 创建镜像: docker-compose -f src/main/docker/mongodb-cluster.yml build
  • 运行数据库: docker-compose -f src/main/docker/mongodb-cluster.yml up -d
  • 扩展MongoDB节点服务(您必须选择奇数节点): docker-compose -f src/main/docker/mongodb-cluster.yml scale <name_of_your_app>-mongodb-node=<X>
  • 初始化复制集(参数X是您在上一步中输入的节点数,文件夹是YML文件所在的文件夹, 这都是 docker 默认的): docker container exec -it <yml_folder_name>_<name_of_your_app>-mongodb-node_1 mongo --eval 'var param=<X>, folder="<yml_folder_name>"' init_replicaset.js
  • 初始化分片: docker container exec -it <yml_folder_name>_<name_of_your_app>-mongodb_1 mongo --eval 'sh.addShard("rs1/<yml_folder_name>_<name_of_your_app>-mongodb-node_1:27017")'
  • 创建应用镜像 ./mvnw package -Pprod docker:build
  • 启动应用: docker-compose -f src/main/docker/app.yml up -d <name_of_your_app>-app

如果你想添加或移除MongoDB的节点,只要重复第三、第四步就好。

Cassandra

与其他数据库不同,应用程序本身执行模式迁移,Cassandra模式迁移由专用的Docker容器执行。

发展中的 Cassandra

如有要在Cassandra集群上运行本地项目,可以使用docker_compose文件启动: docker-compose -f src/main/docker/cassandra.yml up -d

Docker-compose 将启动2个服务:

  • <name_of_your_app>-cassandra: 具有Cassandra节点接触点的容器 a container with the Cassandra node contact point
  • <name_of_your_app>-cassandra-migration: 一个容器,用于自动应用所有CQL迁移脚本(创建Keyspace,创建表,所有数据迁移,...)a container to automatically apply all CQL migrations scripts (create the Keyspace, create the tables, all data migrations, ...)

有关如何添加新的CQL脚本而不重新启动本地集群的详细信息,请参阅Cassandra page页面。

Cassandra 在生产中:

app.yml docker-compose文件使用cassandra-cluster.yml配置集群。应用程序在几秒钟后启动(请参阅JHIPSTER_SLEEP变量),以便给集群启动的时间和要执行的迁移。

Cassandra和其他数据库之间的一大区别就在于您可以使用Docker Compose扩展集群。要在集群中具有X + 1个节点,请运行:

  • docker-compose -f src/main/docker/cassandra-cluster.yml scale <name_of_your_app>-cassandra-node=X

Microsoft SQL Server

如果要使用JHipster的MSSQL Docker映像,则需要执行以下几个步骤:

  • 将Docker可用的RAM增加到至少3.25GB
  • 运行数据库: docker-compose -f src/main/docker/mssql.yml up -d
  • 使用您选择的MSSQL客户端创建数据库
  • 启动应用程序: docker-compose -f src/main/docker/app.yml up -d <name_of_your_app>-app

6. Elasticsearch

运行 docker-compose -f src/main/docker/app.yml up 命令将自动启动搜索引擎。

如果您只想启动您的Elasticsearch节点,而不是其他服务,请使用其特定的Docker Compose配置:

  • docker-compose -f src/main/docker/elasticsearch.yml up

7. Sonar

生成Docker Compose配置以运行Sonar:

  • docker-compose -f src/main/docker/sonar.yml up

根据您的代码,请在您的项目上运行Sonar:

  • With Maven: ./mvnw sonar:sonar
  • With Gradle: ./gradlew sonar

The Sonar reports will be available at: http://localhost:9000

8. 常用命令 Common commands

列出所有容器 List the containers

You can use docker container ps -a to list all the containers

$ docker container ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
fc35e1090021        mysql               "/entrypoint.sh mysql"   4 seconds ago       Up 4 seconds        0.0.0.0:3306->3306/tcp   sampleApplication-mysql

容器的状态 Docker stats for containers

docker container stats or docker container stats $(docker container ps --format={{.Names}}) to list all running containers with CPU, Memory, Networking I/O and Block I/O stats.

$ docker container stats {% raw %}$(docker container ps --format={{.Names}}){% endraw %}
CONTAINER                 CPU %               MEM USAGE / LIMIT     MEM %               NET I/O               BLOCK I/O             PIDS
jhuaa-mysql               0.04%               221 MB / 7.966 GB     2.77%               66.69 kB / 36.78 kB   8.802 MB / 302.5 MB   37
00compose_msmongo-app_1   0.09%               965.6 MB / 7.966 GB   12.12%              121.3 kB / 54.64 kB   89.84 MB / 14.88 MB   35
00compose_gateway-app_1   0.39%               1.106 GB / 7.966 GB   13.89%              227.5 kB / 484 kB     117 MB / 28.84 MB     92
jhipster-registry         0.74%               1.018 GB / 7.966 GB   12.78%              120.2 kB / 126.4 kB   91.12 MB / 139.3 kB   63
gateway-elasticsearch     0.27%               249.1 MB / 7.966 GB   3.13%               42.57 kB / 21.33 kB   48.16 MB / 4.096 kB   58
00compose_jhuaa-app_1     0.29%               1.042 GB / 7.966 GB   13.08%              101.8 kB / 78.84 kB   70.08 MB / 13.5 MB    68
msmongo-mongodb           0.34%               44.8 MB / 7.966 GB    0.56%               49.72 kB / 48.08 kB   33.97 MB / 811 kB     18
gateway-mysql             0.03%               202.7 MB / 7.966 GB   2.54%               60.84 kB / 31.22 kB   27.03 MB / 297 MB     37

缩放容器 Scale a container

Run docker-compose scale test-app=4 to have 4 instances of application "test" running.

停止容器 Stop containers

docker-compose -f src/main/docker/app.yml stop

You can also use directly Docker:

docker container stop <container_id>

停止容器时,除非您删除容器,否则数据不会被删除。

删除容器 Delete a container

小心! 所有的数据将被删除:

docker container rm <container_id>

9. 内存调整 Memory Tweaking

为了优化在容器中运行的应用程序的内存使用,可以在Dockerfiledocker-compose.yml上设置Java内存参数

将内存参数添加到Dockerfile Adding memory parameters to Dockerfile

Set the environment variable.

ENV JAVA_OPTS=-Xmx512m -Xms256m

将内存参数添加到docker-compose.yml Adding memory parameters to docker-compose.yml

Dockerfile需要一种方式,通过这种方式,可以在一个控制点上为所有的容器配置内存大小。

JAVA_OPTS 添加到 environment 部分。

    environment:
      - (...)
      - JAVA_OPTS=-Xmx512m -Xms256m

根据Docker基本映像,JAVA_OPTS将无法正常工作。在这种情况下,请尝试使用_JAVA_OPTIONS 代替:

    environment:
      - (...)
      - _JAVA_OPTIONS=-Xmx512m -Xms256m

results matching ""

    No results matching ""