Docker and Docker Compose
无论在开发还是生产中,使用Docker和Docker Compose都是一个很好的解决方案。
- 简介 Description
- 前提 Prerequisites
- 构建并运行应用程序的Docker映像 Building a Docker image of your application
- 为多个应用程序生成定制的Docker-Compose配置 Generating a custom Docker-Compose configuration for multiple applications
- 使用数据库 Working with databases
- 灵活检索 Elasticsearch
- Sonar Sonar
- 常用命令 Common commands
- 内存调整 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
如何在安装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
andspring.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
为了优化在容器中运行的应用程序的内存使用,可以在Dockerfile
或docker-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