『中級篇』docker之CI/CD持續整合-專案生成映象(76)
>原創文章,歡迎轉載。轉載請註明:轉載自IT人故事會,謝謝!
>原文連結地址:『中級篇』docker之CI/CD持續整合-專案生成映象(76)開始想用docker registry做私有映象庫,後來放棄了,知道的老鐵應該知道這個玩意沒有介面很不爽,後來選擇了Harbor,還是通過vagrant 建立一個虛擬伺服器,這樣下來一共建立3個了,也就在生產環境下估計需要3個以上才可以完成整個的CICD持續化整合。前期的3個要求都是4g雙核的,gitlab,gitlabci,Harbor 都是這樣要求的。我的電腦i7處理器,16g記憶體讓老鐵看看跑起來後的效果。原始碼:https://github.com/limingios/docker/tree/master/No.11
通過vagrant 安裝
vagrant reload
下載Harbor
- 選擇目前最新版本1.5.2
https://github.com/vmware/harbor/releases
我選擇的是online版本,兩種版本基本上差不多。sudo yum -y install lrzsz #在windows下載的1.5.2 online 上傳上去 rz
-
解壓harbor
tar xvf harbor-online-installer-v1.5.2.tgz
-
安裝
cd harbor sudo ./install.sh
-
需要換成另外一種安裝方法。
sudo ./prepare
- 真正的安裝
sudo docker-compose up -d
安裝成功
訪問機器:172.28.128.6 我是自動獲取的ip
正常訪問
使用者名稱:admin
密碼:Harbor12345
可以執行如下的命令進行停止和啟動
停止
sudo docker-compose stop
啟動
sudo docker-compose start
測試harbor
-
啟動服務
sudo serivce docker restart cd harbor sudo docker-compose start
- 修改引數
docker預設是從官方拉取映象的,並且從1.12版本之後,預設私有倉庫是使用https來進行連線,所以我們這裡需要進行一些相應的修改:
sudo vi /etc/docker/daemon.json
#寫入{"insecure-registries":["172.28.128.6"]}
sudo systemctl restart docker
目前很多文章都是通過修改docker的配置檔案“etc/systemconfig/docker",重啟docker來解決這個問題。但發現docker1.12.3版本並無此檔案,根據網上建立此檔案,並填入相應內容,重啟docker無效果,仍然報此錯誤。
解決方法:在”/etc/docker/“目錄下,建立”daemon.json“檔案。在檔案中寫入
harbor 就是使用的80埠,根本不就需要在docker-compose.yml 配置什麼5000埠。
#因為沒配置http的過濾, 某人是使用https,就拒絕了。
connect: connection refused
#配置了上邊的insecure-registries
server gave HTTP response to HTTPS client
最後登入,直接sudo docker login 私服地址不要加什麼埠號
使用者名稱:admin
密碼:Harbor12345
push 映象試試
- 新建使用者
- 新建專案
#這個錯誤,就是未建立專案。
f9d9e4e6e2f0: Preparing
denied: requested access to the resource is denied
- push專案
sudo docker pull busybox sudo docker tag busybox 172.28.128.6/idig8/busybox sudo docker login 172.28.128.6 -u idig8 -p 123456789 sudo docker push 172.28.128.6/idig8/busybox
![](https://upload-images.jianshu.io/upload_images/11223715-32e7643aa5456e78.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-ce7f8cda9277c2ac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-c64af22cd5f5b5fb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
![](https://upload-images.jianshu.io/upload_images/11223715-1dd1da248f4d736b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
>終於成功了,前前後後大概懟了3個多小時,從10點對到了凌晨1點。吸口煙,百度裡面太多坑爹了,很多人寫文章就是直接複製,轉載我不知道他到底實踐沒有,我這邊都是邊實踐幫告訴大家咋用。感覺harbor真的比docker 倉庫爽太多了,看到中文的那一刻我感覺我以後必須用這個放棄docker倉庫。
### 遠端連線harbor
* 查詢Docker的服務檔案:登入到已經安裝Docker的伺服器,輸入 systemctl status docker 檢視Docker的service檔案。
``` bash
sudo systemctl status docker
-
編輯docker.service檔案:在ExecStart處新增 –insecure-registry 引數。
sudo vi /usr/lib/systemd/system/docker.service
- 重新載入service檔案,重啟docker服務。
sudo systemctl daemon-reload sudo systemctl restart docker
- 嘗試遠端登入
sudo docker login http://172.28.128.6 -u admin -p Harbor12345
gitlab gitlab-ci harbor
通過gitlab-ci往harbor上打對應的映象包
- 修改 .gitlab-ci.yml
增加release,當打包的時候執行生成映象併發送到遠端harbor伺服器上。
另外說明下,雖然咱們在crt編輯器連線linux的時候需要前面加上sudo,但是在script指令碼的時候,不允許加入sudo,如果加了 就會報錯。
stages:
- style
- test
- deploy
- release
pep8:
stage: style
script:
- pip install tox
- tox -e pep8
tags:
- python2.7
unittest-py27:
stage: test
script:
- pip install tox
- tox -e py27
tags:
- python2.7
unittest-py34:
stage: test
script:
- pip install tox
- tox -e py34
tags:
- python3/4
docker-deploy:
stage: deploy
script:
- docker build -t flask-demo .
- if [ $( docker ps -aq --filter name=web) ]; then docker rm -f web;fi
- docker run -d -p 5000:5000 --name web flask-demo
tags:
- test1
only:
- master
docker-image-release:
stage: release
script:
- docker login 172.28.128.6 -u idig8 -p 123456789
- docker build -t 172.28.128.6/idig8/flask-demo:$CI_COMMIT_TAG .
- docker login 172.28.128.6 -u idig8 -p [email protected]
- docker push 172.28.128.6/idig8/flask-demo:$CI_COMMIT_TAG
tags:
- test1
only:
- tags
這個執行後,就會自動進行pipline操作,然後通過merge到master分支
.
pipline 執行通過後,可以進行merge到master分支
合併到master分支,會自動觸發pipline,多執行deploy操作
- 如果我們想已經到master分支了,就光執行tag打包生成映象怎麼搞呢
看來修改 .gitlab-ci.yml 增加except 在每個任務中。
stages:
- style
- test
- deploy
- release
pep8:
stage: style
script:
- pip install tox
- tox -e pep8
tags:
- python2.7
except:
- tags
unittest-py27:
stage: test
script:
- pip install tox
- tox -e py27
tags:
- python2.7
except:
- tags
unittest-py34:
stage: test
script:
- pip install tox
- tox -e py34
tags:
- python3/4
except:
- tags
docker-deploy:
stage: deploy
script:
- docker build -t flask-demo .
- if [ $( docker ps -aq --filter name=web) ]; then docker rm -f web;fi
- docker run -d -p 5000:5000 --name web flask-demo
tags:
- test1
only:
- master
docker-image-release:
stage: release
script:
- docker login 172.28.128.6 -u idig8 -p 123456789
- docker build -t 172.28.128.6/idig8/flask-demo:$CI_COMMIT_TAG .
- docker login 172.28.128.6 -u idig8 -p [email protected]
- docker push 172.28.128.6/idig8/flask-demo:$CI_COMMIT_TAG
tags:
- test1
only:
- tags
- 新建tag
New tag
- 進入harbor看看
PS:實際上這個例子,就是特定版本的docker image的產生。一個版本的釋出代表我們這個軟體的穩定的版本的問世,接下來就可以進行對穩定版本的部署,我們對穩定版本的部署,穩定版本的部署具體是docker swarm還是k8s,最重要的是我們已經有了一個docker image,我們可以通過手動,或者自動的升級。update docker image 實現服務的不中斷。
總體言之這幾次的流程是:開發程式碼提交到分支後,分支下進行校驗pipline,沒有問題,進行deploy的,在deploy測試沒有問題,打包tag,形成穩定的dockerimage版本。