Docker是一個開源的應用容器引擎,將應用以及依賴打包到一個可移植的鏡像中,部署到服務器並運行在container容器實例中。
java
資源編排Docker-compose定義和運行多個容器組成的應用系統,經過docker-compose.yml文件聲明各個服務,做爲一個總體來完成應用的建立和啓動。node
Swarm是Docker官方提供的集羣管理工具,將Docker節點統一管理組織,以service服務爲調度單元,支持動態擴容等特性。mysql
阿里雲容器鏡像服務提供Docker鏡像倉庫託管,配置項目代碼Git倉庫和構建規則,輕鬆實現Docker鏡像自動構建系統。git
Jext技術社區開源Web服務腳手架,從實際項目中整理昇華,針對多種業務場景擴展開發。系統部署流程和自動構建系統以下圖:github
內容目錄:web
1. 系統架構redis
2. docker-compose一鍵部署開發環境sql
3. Dockerfile配置docker
4. 阿里雲+Git+Docker鏡像自動構建系統數據庫
5. docker-comose一鍵部署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-comose一鍵部署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日。
容器服務(資源編排) |
鏡像服務 |
代碼託管 |
|
阿里雲 |
收取使用的計算資源費用 |
每一個用戶可創建50個代碼庫,單庫容量2G |
|
華爲雲 |
收費,購買套餐。 |
免費, |
0.11元/用戶/小時,0.000442元/GB/小時 https://console.huaweicloud.com/devcloud/?region=cn-east-3#/codehub/list |
騰訊雲 |
收取使用的計算資源費用 |
內測,需申請, |
官網:預計20年1月開始收費,1元/人/天 |