Docker是一個開源的應用容器引擎,將應用以及依賴打包到一個可移植的鏡像中,部署到服務器并運行在container容器實例中。
資源編排Docker-compose定義和運行多個容器組成的應用系統,通過docker-compose.yml文件聲明各個服務,作為一個整體來完成應用的創建和啟動。
Swarm是Docker官方提供的集群管理工具,將Docker節點統一管理組織,以service服務為調度單元,支持動態擴容等特性。
阿里云容器鏡像服務提供Docker鏡像倉庫托管,配置項目代碼Git倉庫和構建規則,輕松實現Docker鏡像自動構建系統。
Jext技術社區開源Web服務腳手架,從實際項目中整理升華,針對多種業務場景擴展開發。系統部署流程和自動構建系統如下圖:

內容目錄:
1.?系統架構
2.?docker-compose一鍵部署開發環境
3.?Dockerfile配置
4.?阿里云+Git+Docker鏡像自動構建系統
5.?docker-compose一鍵部署Web服務
6.?Swarm集群部署Web服務
7.?Docker容器編排、鏡像服務和Git代碼托管云服務的選擇
一,系統架構
l?代碼下載
https://github.com/jextop/StarterDeploy
https://github.com/jextop/StarterApi/
Https://github.com/jextop/StarterAdmin
l?功能模塊
Web服務腳手架基于SpringBoot開發,前后端動靜分離架構,提供REST接口和WebAdmin管理后臺,分布式異步任務調度,集成緩存、消息隊列、ELK日志處理和服務監控系統,采用Docker容器部署,支持集群擴展,可滿足多種業務場景的擴展定制開發。

n?WebAdmin管理后臺
技術棧:JavaScript, Umi, React, AntDesign Pro
n?API接口服務
技術棧:Java, SpringBoot, Flyway, MySQL, MyBatis, Redis, ActiveMQ, Quartz
n?業務處理服務
從中臺接收業務請求,異步處理業務邏輯,處理結束后發送通知消息。
技術棧:Python,Django,Celery, Redis, ActiveMQ
l?時序圖

二,docker-compose一鍵部署開發環境
l?開發運行環境


l?配置文件和輔助腳本:StarterApi
├── docker-compose.yml
├── pull.sh
├── up.sh
├── logs.sh
├── down.sh
l?docker-compose.yml配置開發環境的容器實例:數據庫、緩存、消息隊列、ELK日志和服務監控系統。
db_admin需要連接MySQL,logstash和kibana需要連接elasticsearch,所以設置了depends_on屬性。
logstash和kibana在基礎鏡像上增加配置文件,生成鏡像托管在阿里云:
https://github.com/rickding/HelloDocker/tree/master/logstash
https://github.com/rickding/HelloDocker/tree/master/kibana
version: '3'
services:
????db:
????????hostname: db
????????image: mysql:5
????????command: --default-authentication-plugin=mysql_native_password
????????ports:
????????????- 3306:3306
????????environment:
????????????MYSQL_DATABASE: starter
????????????MYSQL_ROOT_PASSWORD: root
????db_admin:
????????image: adminer:latest
????????ports:
????????????- 3006:8080
????????depends_on:
????????????- db
????cache:
????????hostname: cache
????????image: redis:4
????????command: redis-server --appendonly yes
????????ports:
????????????- 6379:6379
????mq:
????????hostname: mq
????????image: webcenter/activemq:latest
????????ports:
????????????- 61616:61616
????????????- 8161:8161
????elasticsearch:
????????hostname: elasticsearch
????????image: elasticsearch:latest
????????ports:
????????????- 9200:9200
????????????- 9300:9300
????log:
????????hostname: log
????????image: registry.cn-shanghai.aliyuncs.com/hellodock/logstash:latest
????????ports:
????????????- 9600:9600
????????????- 9601:9601
????????depends_on:
????????????- elasticsearch
????kibana:
????????image: registry.cn-shanghai.aliyuncs.com/hellodock/kibana:latest
????????ports:
????????????- 5601:5601
????????depends_on:
????????????- elasticsearch
l?運行./pull.sh拉取鏡像
可直接運行docker pull mysql:5拉取鏡像,運行docker images查看已下載鏡像:

l?運行./up.sh啟動容器
腳本中封裝了docker-compose up -d命令,啟動后運行docker ps查看容器實例:

l?運行./logs.sh查看日志
定制命令突出顯示重要信息:
docker-compose logs -ft?| grep --color -i -e error -e warn -e version -e exception

l?運行./down.sh停止服務
docker-compose down --remove-orphans停止并刪除容器:

l?查看服務
使用docker-compose一鍵部署開發環境MySQL+Redis+ActiveMQ+ELK,就是這么簡單任性。
db_admin |
| ||
ActiveMQ |
| elasticsearch |
|
logstsh |
| kibana |
|
三,Dockerfile配置是構建Docker鏡像的核心
Dockerfile鏡像描述文件,包含了一條條的指令,每一條指令構建一層,因此每一條指令的內容,就是描述該層應當如何構建。Dockerfile基本結構:
- 基礎鏡像
- 維護者信息
- 鏡像構建指令
- 容器啟動時執行指令
FROM openjdk:8
LABEL maintainer="Jext Community, https://github.com/jextop"
# copy files
COPY ./deploy/ /deploy
WORKDIR /deploy
# do sth
CMD ["sh", "launch.sh"]
EXPOSE 8011
構建API服務Docker鏡像:StarterApi
├── Dockerfile
├── Dockerfile_ce

- Dockerfile_ce,稱為社區版,依賴本地開發環境,將編譯好的項目運行文件打包進Docker鏡像,多用于本地開發測試。
- Dockerfile,從拉取源代碼開始,編譯生成項目運行文件,打包進Docker鏡像,然后發布部署。Docker鏡像自動構建系統基于Dockerfile全量構建。
問答:
l?Dockerfile_ce和Dockerfile有什么區別?
構建鏡像使用的項目運行文件來源不同。Dockerfile_ce多用于開發測試,打包使用本地開發環境編譯生成的運行文件。Dockerfile從源代碼編譯出項目運行文件,不依賴本地環境,往往構建速度較慢,用于發布部署。
l?Dockerfile中為什么使用RUN sh mvnw package?mvnw和mvn的區別是什么?
解決Maven版本和插件兼容性問題。mvnw全名MavenWrapper,是一個第三方提供的Maven插件,為SpringBoot項目提供一個獨立的且指定版本的Maven,不影響全局版本和其他項目,在生成SpringBoot項目時已經自動安裝。
SpringBoot項目下有兩個文件mvnw和mvnw.cmd,還有一個.mvn目錄下面有三個文件。
Spring-boot-project
├── .mvn
│ ??└── wrapper
│ ??????├── maven-wrapper.jar
│ ??????└── maven-wrapper.properties
│ ??????├── MavenWrapperDownloader.java
├── mvnw
├── mvnw.cmd
四,阿里云+Git+Docker鏡像自動構建系統
阿里云容器鏡像服務提供Docker鏡像倉庫托管,配置項目代碼Git倉庫和構建規則,結合Dockerfile實現云端編譯打包,不再需要常用的Jenkins構建服務器。
為master分支增加一個latest構建規則,依次配置選項:
- 類型:選擇Branch
- 分支:選擇master
- Dockerfile目錄:/
- Dockerfile文件名:Dockerfile
- 鏡像版本:latest
配置完成后,當有代碼提交到Git倉庫時,將自動觸發構建。點擊規則的”立即構建“可以手動觸發,點擊構建列表的”日志“查看過程信息。

五,docker-compose一鍵部署Web服務
API接口服務Docker鏡像成功成功后,配置信息到docker-compose.yml中:
代碼庫StarterDeploy
├── docker-compose.yml
├── up.sh
├── logs.sh
# 省略文件中運行環境的容器配置,以下是自動構建系統生成的API服務Docker鏡像
api:
????hostname: api
????image: registry.cn-shanghai.aliyuncs.com/jext/starter_api:latest
????ports:
????????- 8011:8011
????depends_on:
????????- db
????????- cache
????????- mq
????????- log
運行./up.sh部署任務,然后運行./logs.sh可看到SpringBoot開發的接口服務啟動信息:

訪問http://localhost:8011/chk看到服務自檢信息:
?
六,Swarm集群部署Web服務
代碼庫:StarterDeploy
├── docker-compose.yml
├── deploy.sh
├── rm.sh
l?docker-compose.yml增加deploy屬性,replicas指定副本數量,placement指定docker節點:
deploy:
????replicas: 1
? ? ?placement:
? ? ? ? ?constraints: [node.labels.group == api]
l?啟動Swarm加入節點構建集群,首個節點自動成為管理員:docker swarm init
l?部署Web服務:執行腳本./deploy.sh或命令:docker stack deploy -c docker-compose.yml starter

l?查看Stack和服務:docker stack ls && docker service ls

l?停止刪除服務:執行腳本./rm.sh或命令:docker stack rm starter
?
七,Docker容器編排、鏡像服務和Git代碼托管云服務的選擇
搭建系統選擇云服務時,重點關注系統部署運維、自動構建以及代碼管理的集成效率和穩定性,比較了幾大云服務商,信息整理出來分享,排名不分先后。信息更新日期2020年1月16日。
容器服務(資源編排) | 鏡像服務 | 代碼托管 | |
阿里云 | 收取使用的計算資源費用 | 公測,免費,http://cr.console.aliyun.com/ | 每個用戶可建立50個代碼庫,單庫容量2G https://code.aliyun.com/ |
華為云 | 收費,購買套餐。 | 免費, https://cn-east-3-console.huaweicloud.com/swr | 0.11元/用戶/小時,0.000442元/GB/小時 https://console.huaweicloud.com/devcloud/?region=cn-east-3#/codehub/list |
騰訊云 | 收取使用的計算資源費用 | 內測,需申請, https://cloud.tencent.com/product/tcr/ | 官網:預計20年1月開始收費,1元/人/天 https://console.cloud.tencent.com/coding |
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。