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.04
和my-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部署
- 配置中心:默認一套jar包配置實現一個項目不同環境固定部署,基於這個條件在通過-e、或者-v修改配置文件實現配置修改,項目暫時不引入配置中心
- 日志中心:引入elk服務,后續入口集成redis或者kafka進行緩存
- 工程化流程:
- 使用maven插件進行鏡像的打包和推送,通過命令進行服務的啟動
- 優化內部jar包名稱,在dockerfile進行處理的時候,統一化外部端口映射,保證啟動腳本的統一抽象。
遇到的問題
- jenkins使用docker部署的使用,出現既需要node環境,🈶需要docker環境的情況,使用容器部署無法解決
- 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>
推送和拉取每次都會更新最新的鏡像,只要私服有更新本地就會更新