容器组成
来源: |
时间:2018-11-14
|
|

摘要

在开发中强烈建议使用Docker和Docker Compose,这也是生产中的一个很好的解决方案。

  1. 描述

  2. 先决条件

  3. 构建应用程序的Docker镜像

  4. 为多个应用程序生成自定义Docker-Compose配置

  5. 使用数据库

  6. Elasticsearch

  7. 声纳

  8. Keycloak

  9. 常用命令

  10. 记忆调整

描述

请注意:此Docker配置用于在容器映像中运行生成的应用程序。与JHipster还提供Docker设置完全不同,后者用于在容器内运行JHipster生成器

JHipster提供完整的Docker支持,以便:

  • 促进开发,因为即使使用复杂的微服务架构,您也可以非常轻松地启动完整的基础架构

  • 对于使用Docker Swarm的人来说,直接部署到生产环境,因为它使用相同的Docker Compose配置

使用Docker Compose的一个很棒的功能是,您可以使用该docker-compose scale命令轻松扩展容器如果您将JHipster与微服务架构一起使用,这将非常有趣

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

  • 一个Dockerfile用于容器内建立一个泊坞窗图像和运行应用程序

  • 多个Docker Compose配置可帮助您使用第三方服务(例如数据库)运行应用程序

这些文件位于文件夹中src/main/docker/

先决条件

你必须安装Docker和Docker Compose:

Docker现在需要创建一个帐户到docker商店来下载适用于Mac的Docker和适用于Windows的Docker。绕过这个

提示: 在Windows和Mac OS X上,Kitematic是一个易于使用的图形界面,随Docker Toolbox提供,这将使Docker的使用变得更加容易。

警告: 如果您在Mac或Windows上使用Docker Machine,则Docker守护程序只能访问您的OS X或Windows文件系统。Docker Machine尝试自动共享您的/ Users(OS X)或C:/ Users / <用户名>(Windows)目录。因此,您必须在此目录下创建项目文件夹以避免任何问题,尤其是在使用JHipster控制台进行监视时。

如果npm ERR! Error: EACCES: permission denied在安装JHipster UML(或任何非捆绑软件包)时遇到错误,则可能未sudo安装容器(例如,sudo未与Ubuntu Xenial捆绑)。

解决方案1

NPM文档建议不要以root用户身份安装任何NPM软件包。按照官方文档解决此问题。

解决方案2

  • docker container exec -u root -it jhipster bash

  • npm install -g YOUR_PACKAGE

  • 然后退出并正常登录容器: docker container exec -it jhipster bash

构建并运行应用程序的Docker镜像

要创建应用程序的Docker镜像,并将其推送到Docker注册表中:

  • 使用Maven,键入: ./mvnw package -Pprod jib:dockerBuild

  • 使用Gradle,键入: ./gradlew -Pprod bootWar jibDockerBuild

这将使用prod配置文件打包您的应用程序,并使用连接到本地docker守护程序的Jib构建docker镜像

在Windows上,由于缺少命名管道,您可能必须调整Docker的设置并打开“在tcp上显示守护程序://本地主机:2375而不使用TLS”。

要运行此映像,请使用位于src/main/docker应用程序文件夹中的Docker Compose配置

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

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

如果您选择OAuth 2.0进行身份验证,请务必阅读本文档中的Keycloak部分

为多个应用程序生成自定义Docker-Compose配置

如果您的体系结构由多个JHipster应用程序组成,则可以使用特定的docker-compose子生成器,该子生成器将为所有选定的应用程序生成全局Docker Compose配置。这将允许您使用一个命令部署和扩展完整的体系结构。要使用docker-compose子生成器:

  • 您需要在同一目录中拥有所有monolith(s),gateway(s)和microservices。

  • 例如,创建另一个目录mkdir docker-compose

  • 进入那个目录:cd docker-compose

  • 运行子生成器:jhipster docker-compose

  • 子生成器将询问您希望在架构中使用哪个应用程序,以及是否要使用ELK或Prometheus设置监视。

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

对于微服务架构,此配置还将预先配置JHipster注册表或Consul,它将自动配置您的服务:

  • 这些服务将等到JHipster Registry(或Consul)运行开始。可以bootstrap-prod.yml使用spring.cloud[.consul].config.fail-fastspring.cloud[.consul].config.retry文件中配置

  • 注册表将配置您的应用程序,例如它将在所有服务之间共享JWT秘密令牌。

  • 使用Docker Compose扩展每个服务,例如类型,docker-compose scale test-app=4以便运行4个应用程序“test”实例。这些实例将由网关自动进行负载平衡,并自动加入相同的Hazelcast集群(如果Hazelcast是您的Hibernate二级缓存)。

使用数据库

MySQL,MariaDB,PostgreSQL,Oracle,MongoDB或Cassandra

正在运行docker-compose -f src/main/docker/app.yml up已自动启动数据库。

如果您只想启动数据库而不是其他服务,请使用数据库的Docker Compose配置:

  • 使用MySQL: docker-compose -f src/main/docker/mysql.yml up

  • 使用MariaDB: docker-compose -f src/main/docker/mariadb.yml up

  • 使用PostgreSQL: docker-compose -f src/main/docker/postgresql.yml up

  • 使用Oracle: docker-compose -f src/main/docker/oracle.yml up

  • 使用MongoDB: docker-compose -f src/main/docker/mongodb.yml up

  • 与卡桑德拉: docker-compose -f src/main/docker/cassandra.yml up

  • 使用Couchbase: docker-compose -f src/main/docker/couchbase.yml up

MongoDB集群模式

如果要将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")'

  • 构建应用程序的Docker镜像: ./mvnw package -Pprod jib:dockerBuild

  • 开始申请: docker-compose -f src/main/docker/app.yml up -d <name_of_your_app>-app

如果要添加或删除一些MongoDB节点,只需重复步骤3和4。

Couchbase群集模式

如果要将Couchbase与多个节点一起使用,则需要手动构建和设置Couchbase映像。请按照以下步骤操作:

  • 构建图像: docker-compose -f src/main/docker/couchbase-cluster.yml build

  • 运行数据库: docker-compose -f src/main/docker/couchbase-cluster.yml up -d

  • 扩展Couchbase节点服务(您必须选择奇数个节点): docker-compose -f src/main/docker/couchbase-cluster.yml scale <name_of_your_app>-couchbase-node=<X>

  • 构建应用程序的Docker镜像: ./mvnw package -Pprod jib:dockerBuild

  • 开始申请: docker-compose -f src/main/docker/app.yml up -d <name_of_your_app>-app

卡桑德拉

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

卡桑德拉在发展中

要启动Cassandra集群以在本地运行应用程序,可以使用docker_compose文件进行开发: docker-compose -f src/main/docker/cassandra.yml up -d

Docker-compose将启动2项服务:

  • <name_of_your_app>-cassandra:具有Cassandra节点联系点的容器

  • <name_of_your_app>-cassandra-migration:一个自动应用所有CQL迁移脚本的容器(创建Keyspace,创建表,所有数据迁移,......)

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

生产中的卡桑德拉:

app.yml泊坞窗,撰写文件使用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

如果您想将MSSQL Docker镜像与JHipster一起使用,则需要执行以下几个步骤:

  • 将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

Elasticsearch

正在运行docker-compose -f src/main/docker/app.yml up已自动启动您的搜索引擎。

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

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

声纳

为运行Sonar生成Docker Compose配置:

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

要分析代码,请在项目上运行Sonar:

  • 使用Maven: ./mvnw sonar:sonar

  • 使用Gradle: ./gradlew sonar

Sonar报告将在以下网址获得:http:// localhost:9000

Keycloak

如果您选择OAuth 2.0作为身份验证,则Keycloak将用作默认身份提供程序。运行docker-compose -f src/main/docker/app.yml up会自动启动Keycloak。

要使Keycloak正常工作,您需要将以下行添加到hosts文件中(/etc/hosts在Mac / Linux上,c:/Windows/System32/Drivers/etc/hosts在Windows上)。

127.0.0.1	keycloak

这是因为您将使用计算机上的浏览器访问您的应用程序(名称为localhost,或127.0.0.1),但在Docker中,它将在其自己的容器中运行,该容器名称为keycloak

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

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

常用命令

列出容器

您可以使用docker container ps -a列出所有容器

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


缩放容器

运行docker-compose scale test-app=4运行4个应用程序“test”实例。

停止容器

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

您也可以直接使用Docker:

docker container stop <container_id>

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

删除容器

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

docker container rm <container_id>

记忆调整

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

将内存参数添加到Dockerfile

设置环境变量。

ENV JAVA_OPTS=-Xmx512m -Xms256m

将内存参数添加到docker-compose.yml

这个解决方案比Dockerfile更合适。通过这种方式,您可以在构成应用程序的所有容器上为您的内存配置提供单个控制点。

添加JAVA_OPTSenvironment部分。

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

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

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







提交
查看更多评论
没有更多评论