Docker 和 Docker Compose
Summary
推薦在開發環境中使用 Docker 或 Docker Compose,即使在生產環境中,docker 也是個非常好的解決方案。
描述
請注意:這裡描述的 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-fast
和spring.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 stats
或 docker 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 的記憶體引數,在 Dockerfile
或 docker-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>
相關文章
- Docker, Dockerfile, 和Docker Compose區別 | BaeldungDocker
- Linux CentOS 安裝 docker 和 docker-composeLinuxCentOSDocker
- Centos7.9安裝Docker和Docker composeCentOSDocker
- docker composeDocker
- Docker:Docker Compose 詳解Docker
- kali簡單安裝docker和docker-composeDocker
- docker compose 用法Docker
- Docker Compose fileDocker
- Docker Compose 案例Docker
- docker compose 指令Docker
- Docker(四):Docker 三劍客之 Docker ComposeDocker
- Docker 容器編排利器 Docker ComposeDocker
- docker-compose vs docker-stackDocker
- docker和docker compose安裝使用、入門進階案例Docker
- 自用 docker-composeDocker
- Docker compose的使用Docker
- Docker學習—ComposeDocker
- Docker Compose簡介Docker
- docker-compose教程Docker
- Docker Compose 安裝Docker
- Docker Compose部署GitLabDockerGitlab
- docker compose 語法Docker
- Docker & ASP.NET Core (5):Docker ComposeDockerASP.NET
- mac搭建docker、docker-compose環境MacDocker
- Docker之Docker Compose技術詳解。Docker
- docker、docker-compose 常用命令Docker
- Ubuntu 安裝最新 docker docker-composeUbuntuDocker
- Centos 7 安裝 Docker 與 Docker ComposeCentOSDocker
- Ubuntu安裝Docker及Docker-composeUbuntuDocker
- 如何使用RubyMine中的Docker / Docker Compose?Docker
- docker-compose安裝pgsql和pgvectorDockerSQL
- 一行命令安裝docker和docker-compose(CentOS7)DockerCentOS
- 使用Docker安裝Odoo 17(非Docker Compose)DockerOdoo
- Docker從入門到精通(八)——Docker ComposeDocker
- Docker-compose 常用命令和模板Docker
- docker-compose部署ELKDocker
- 46_docker-compose_nginxDockerNginx
- docker-compose 安裝Docker