1. 程式人生 > >通過Jenkins + Docker實現antdPro自動化推送私服、自動容器化部署功能

通過Jenkins + Docker實現antdPro自動化推送私服、自動容器化部署功能

ash let agen 體系 pig 優化 war包 自動 情況

Docker與Docker私服

1. 安裝docker

https://docs.docker.com/install/

2. 配置docker鏡像加速

https://www.daocloud.io/mirror

3. 安裝啟動docker私服

https://docs.docker.com/registry/deploying/

# 啟動docker私服
docker run -d -p 5000:5000 --restart=always --name registry registry:2

4. docker配置私服地址,並且加入http訪問私服名單

# 方案1
vim /etc/docker/daemon.json
# 添加配置`"insecure-registries":["172.18.123.72:5000"],`到json對象中
systemctl reload-daemon
systemctl restart docker

# 方案2
# 修改docker啟動命令,註入配置參數 
vim /usr/lib/systemd/system/docker.service
# ExecStart=/usr/bin/dockerd後添加配置:” --insecure-registry 172.16.48.129:5000“
systemctl reload-daemon
systemctl restart docker

5. docker施一公ubuntu鏡像驗證私服功能

拉取鏡像發送到私服,使用ubuntu:16.04鏡像,並且重新打tagmy-ubuntu, 然後推送到私人倉庫. 最後鏡像
ubuntu:16.04my-ubuntu鏡像從本地刪除my-ubuntu鏡像從私服中拉取。

$ docker pull ubuntu:16.04
$ docker tag ubuntu:16.04 localhost:5000/my-ubuntu
$ docker push localhost:5000/my-ubuntu
$ docker image remove ubuntu:16.04
$ docker image remove localhost:5000/my-ubuntu
$ docker pull localhost:5000/my-ubuntu

6. docker私服api操作參考文檔

https://docs.docker.com/registry/spec/api/#detail

配置自動化集成環境

1. 安裝jenkins

# 先安裝java環境:參考百度
# 獲取官方jar包
wget http://ftp-nyc.osuosl.org/pub/jenkins/war-stable/2.164.2/jenkins.war
# 使用命令行直接啟動,配置文件生成在home目錄中的.jenkins目錄中
java -jar jenkins.war --httpPort=8080 &
# 日誌中含有啟動驗證秘鑰,或者在文件中
cat /var/jenkins_home/secrets/initialAdminPassword
# 默認配置安裝,設定管理員賬號,進入jenkins

2. fork antd-design-pro項目到自己的github倉庫

git clone https://github.com/fly-piglet/ant-design-pro.git

3. 添加編譯腳本

docker-publish.sh記得賦予可執行權限

# 設定私服地址
registryhosts="localhost:5000"
# 設定項目名稱
imageName="project"
# 設定容器啟動名稱
containerName="project"
# 設定tag,默認使用latest、實際按照生產版本進行使用
tag="latest"
# 拼接鏡像的名字
allImageNmae="${registryhosts}/${imageName}:${tag}"
echo "1. 安裝依賴 + 編譯項目"
npm install && npm run build
echo "2. 編譯鏡像 + 標簽鏡像"
docker build  -f Dockerfile.hub -t ${allImageNmae} ./
echo "3. 推送鏡像"
docker push ${allImageNmae}

4. 添加啟動腳本

docker-start.sh啟動鏡像腳本,可以在部署目標機器執行

# 設定私服地址
registryhosts="localhost:5000"
# 設定項目名稱
imageName="project"
# 設定容器啟動名稱
containerName="project"
# 設定tag,默認使用latest、實際按照生產版本進行使用
tag="latest"
# 拼接鏡像的名字
allImageNmae="${registryhosts}/${imageName}:${tag}"
# 啟動的端口地址
port="8060"
echo "1. 停止容器 + 刪除容器 + 刪除鏡像"
docker stop ${containerName} && docker rm ${containerName} && docker rmi ${allImageNmae}
echo "2. 拉取鏡像"
docker pull ${allImageNmae}
echo "3. 啟動鏡像"
docker run -d -p ${port}:80 --name=${containerName} --restart=always ${allImageNmae}
echo "4. 部署完畢: http://localhost:${port}/"

最佳實踐

Ci流程:通過git的webhook + jenkins自動化編譯 + 自動化ssh遠端機器 + 自動化部署。
環境區分:默認的配置文件為開發環境的配置,生產環境通過-v外掛配置文件實現環境切換
使用配置文件進行區分,方便保證鏡像經過開發環境的測試,只是配置不同,保證一致性。
版本區分:tag:無或者默認為latest,需要管理版本按照1.0.0的順序遞增修改版本號即可
前端docker鏡像,暫時沒喲版本管理的需求,使用最新版,需要則啟用。

後續優化

使用Jenkinsfile以及管道的形式配置,內置docker容器進行打包編譯

引入docker-compose.yml配置環境啟動,通過配置文件進行環境配置

npm中引入命令體系,直接進行打包和發布

後端引入docker部署

  1. 配置中心:默認一套jar包配置實現一個項目不同環境固定部署,基於這個條件在通過-e、或者-v修改配置文件實現配置修改,項目暫時不引入配置中心
  2. 日誌中心:引入elk服務,後續入口集成redis或者kafka進行緩存
  3. 工程化流程:
    1. 使用maven插件進行鏡像的打包和推送,通過命令進行服務的啟動
    2. 優化內部jar包名稱,在dockerfile進行處理的時候,統一化外部端口映射,保證啟動腳本的統一抽象。

遇到的問題

  1. jenkins使用docker部署的使用,出現既需要node環境,??需要docker環境的情況,使用容器部署無法解決
  2. jenkins改用war包部署,含有node和docker環境,但是使用容器中進行publish的時候,無法推送到本地端口,容器網絡的問題

參考命令

查看鏡像

curl http:/localhost:5000/v2/_catalog

查看鏡像版本

curl http:/localhost:5000/v2/project/tags/list

清理鏡像
刪除所有鏡像,-f "dangling=true"過濾沒有打標簽的:默認是有打標簽,-q:只顯示ids編號

docker rmi $(docker images -f "dangling=true" -q)

停止容器 刪除容器

docker stop <contrinerId> && docker rm <contrinerId>

推送和拉取每次都會更新最新的鏡像,只要私服有更新本地就會更新

通過Jenkins + Docker實現antdPro自動化推送私服、自動容器化部署功能