Docker 和 Docker Compose

weixin_34234823發表於2018-11-23

Summary

推薦在開發環境中使用 Docker 或 Docker Compose,即使在生產環境中,docker 也是個非常好的解決方案。

  1. 描述
  2. 準備工作
  3. 製作應用的 docker 映象
  4. 製作多個應用的 Docker-Compose 配置
  5. 使用資料庫
  6. Elasticsearch
  7. Sonar
  8. Keycloak
  9. 常用命令
  10. 記憶體調整

描述

請注意:這裡描述的 Docker 設定是為了容器化執行應用的。這和在 Docker 設定 章節描述的不是一個含義,那是指在容器中執行 JHipster 的 generator 環境

JHipster 提供了完整的 Docker 支援,為了:

  • 幫助開發,可以使你非常方便的構建起完整的基礎架構,即使在使用了複雜的微服務架構的場景下
  • 對於使用了 Docker Swarm 的場景,可以直接部署到生產環境,得益於其使用了相同的 Docker Compose 配置

使用 Docker Compose 的一個好處是你可以非常方便的擴充套件(scale)容器,使用命令 docker-compose scale。這在使用 JHipster 的 微服務架構 時非常有趣。

生成一個新專案時,JHipster 已經自動生成好了:

  • 一個 Dockerfile 用於編譯 Docker 以及在容器中啟動應用
  • 多個 Docker Compose 配置來幫助你啟動應用所需的第三方服務,比如資料庫

這些檔案在 src/main/docker/ 目錄下。

準備工作

先安裝 Docker 和 Docker Compose:

Docker now requires creating an account to the docker store to download Docker for Mac and Docker for Windows. To bypass this

小提示: 在 Windows 和 Mac OS X 環境下,Kitematic 是個非常方便的圖形化管理工具,整合在 Docker Toolbox 裡。

警告: 如果在 Mac 或 Windows 上使用 Docker Machine,Docker 的守護程式只有訪問 OS X 或 Windows 檔案系統的有限許可權。Docker Machine 嘗試自動共享 /Users 目錄 (OS X) 或 C:\Users<username> 目錄 (Windows)。所以必須將專案建立在該目錄下,才能避免一些問題,尤其是當你在使用 JHipster Console 監控。

如果在安裝 JHipster UML (或者其他 unbundled package)時碰到錯誤 npm ERR! Error: EACCES: permission denied,可能是你的容器沒有用 sudo 安裝(比如,sudo isn’t bundled with Ubuntu Xenial).

解決方案 1

NPM 的文件建議不要用 root 安裝任何包。參考 官方說明 來修復這個問題。

解決方案 2

  • docker container exec -u root -it jhipster bash,
  • npm install -g YOUR_PACKAGE,
  • 退出然後重新進入容器:docker container exec -it jhipster bash

製作應用的 docker 映象

製作應用的 Docker 映象,並且提交到 Docker registry:

  • 使用 Maven,執行:./mvnw package -Pprod jib:dockerBuild
  • 使用 Gradle,執行:./gradlew bootWar jibDockerBuild

這將使用 profile prod 打包你的應用,and build a docker image using Jib connecting to the local docker daemon.

在 Windows 上,由於 lack of named pipes,你需要調整設定,開啟 “Expose daemon on tcp://localhost:2375 without TLS”。

執行映象,可以使用 src/main/docker 目錄下的 Docker Compose 配置:

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

該命令將會啟動你的應用及所需的服務 (database, search engine, JHipster Registry…).

如果你選擇了 OAuth 2.0 作為認證方案,請參閱 Keycloak section on this documentation.

製作多個應用的 Docker-Compose 配置

如果你的架構由多個 JHipster 應用組成,你可以使用 JHipster 的 docker-compose 命令,它會為所有應用生成一個全域性的 Docker Compose 配置。這將讓你能夠只用一條命令就可以部署和擴充套件你的架構。 要使用 docker-compose 命令:

  • 將你所有的 monolith(s), 閘道器以及微服務專案,放在同一個目錄下。
  • 建立另一個目錄,比如 mkdir docker-compose
  • 進入:cd docker-compose
  • 執行命令:jhipster docker-compose
  • 該命令會詢問你的架構中的那些專案有哪些,以及是否需要設定 ELK 或 Prometheus。

建立好了全域性的 Docker Compose 配置,執行 docker-compose up 來啟動它,你的所有服務就會一起啟動了。

在使用微服務架構的場景中,該配置還會設定個 JHipster Registry 或者 Consul, that will configure your services automatically:

  • 所有的服務都會等待直到 JHipster Registry (或 Consul) 啟動好。可以通過配置檔案 bootstrap-prod.yml 中的 spring.cloud[.consul].config.fail-fastspring.cloud[.consul].config.retry 配置項設定。
  • Registry 會設定你的應用,例如它會在所有服務中共享 JWT 祕鑰令牌。
  • 使用 Docker Compose 來擴充套件服務,例如執行 docker-compose scale test-app=4 來配置名為 “test” 的應用執行 4 個例項。這些例項自動由閘道器負載平衡,並且會加入同一個 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
  • 使用 Cassandra: docker-compose -f src/main/docker/cassandra.yml up
  • 使用 Couchbase: docker-compose -f src/main/docker/couchbase.yml up

MongoDB 叢集節點

如果你希望使用 MongoDB with a replica set or shards 及一個共享的配置,你需要手動編輯編譯 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>
  • 初始化 replica set (parameter X is the number of nodes you input in the previous step, folder is the folder where the YML file is located, it’s docker by default): 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
  • Init the shard: 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 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>
  • 編譯應用的映象:./mvnw package -Pprod jib:dockerBuild
  • 啟動應用:docker-compose -f src/main/docker/app.yml up -d <name_of_your_app>-app

Cassandra

不像其他資料庫,schema migrations 是由應用執行的;Cassandra 的 schema migrations 需要由一個專用的 Docker 容器來執行。

Cassandra 開發環境

要本地啟動 Cassandra 叢集,可以使用 docker_compose 檔案: docker-compose -f src/main/docker/cassandra.yml up -d

Docker-compose 會啟動 2 個服務:

  • <name_of_your_app>-cassandra: Cassandra node contact point 容器
  • <name_of_your_app>-cassandra-migration: 自動應用所有 CQL 遷移指令碼的容器 (建立 Keyspace, 建立表, 所有的資料遷移, …)

參考 使用 Cassandra 來了解更多關於如何不重啟直接新增新的 CQL 的方式。

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

如果要使用 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

Elasticsearch

執行 docker-compose -f src/main/docker/app.yml up 就已經啟動了該搜尋引擎了。

如果你希望啟動自己的 Elasticsearch 節點,而不啟動其他服務,使用該 Docker Compose 配置:

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

Sonar

啟動 Sonar 的 Docker Compose 配置:

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

檢查程式碼,在專案目錄裡執行:

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

Sonar 的報告會生成在:http://localhost:9000

Keycloak

如果你選擇了 OAuth 2.0 作為認證方案,將 Keycloak 作為預設的身份提供。執行 docker-compose -f src/main/docker/app.yml up 來啟動 Keycloak。

另外還需要設定 hosts ( Mac/Linux 的 /etc/hosts,或者 Windows 的 c:\Windows\System32\Drivers\etc\hosts)。

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 來列出所有容器(譯註:不加 -a 是列出所有執行中容器)

$ 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 container statsdocker container stats $(docker container ps --format={{.Names}}) 來列出所有容器以及它們的 CPU,記憶體,網路 I/O ,及 Block I/O 的狀態。

$ docker container stats $(docker container ps --format={{.Names}})
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

擴充套件容器

執行 docker-compose scale test-app=4 將 “test” 應用擴充套件到 4 個例項。

停止容器

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

也可以用 Docker 的命令:

docker container stop <container_id>

停止容器後,資料不會被刪除,除非你刪了容器。

刪除容器

小心!所有的資料都會被刪除:

docker container rm <container_id>

記憶體調整

為了調整優化記憶體使用,可以設定 Java 的記憶體引數,在 Dockerfiledocker-compose.yml 內配置

新增記憶體引數到 Dockerfile 配置

設定環境變數:

ENV JAVA_OPTS=-Xmx512m -Xms256m

新增記憶體引數到 docker-compose.yml 配置

This solution is desired over Dockerfile. In this way, you have a single control point for your memory configuration on all containers that compose you application.

新增 JAVA_OPTS 配置到 environment 段落下:

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

根據 Docker 的基礎映象,JAVA_OPTS 可能不工作。如果這樣的話,嘗試使用 _JAVA_OPTIONS 配置:

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

<footer class="text-center" style="box-sizing: border-box; outline: none; display: block; color: rgb(255, 255, 255); background-color: rgb(255, 255, 255); text-align: center; margin-left: -30px; margin-right: -30px;">


</footer>

相關文章