Docker 与 DevOps自动化部署实践
利用Docker 實現自動熱部署? ?
簡單的流程
實驗步驟
搭建GitLab CI集成服務器
? 不同的項目可能需要不同的測試環境,如果直接在CI服務器上面部署測試,多個項目可能會造成紊亂錯誤。
利用docker 容器,將項目build 成docker 容器,再進行測試,測試成功再push到docker registry 服務器。即使在一個CI服務器,也可以部署多個測試環境,以供使用。大大精簡測試和部署的流程。
# 安裝 gitlab ci runnercurl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh |sudo bashsudo yum install gitlab-ci-multi-runner -ysudo gitlab-ci-multi-runner statussudo usermod -aG docker gitlab-runnersudo service docker restartsudo gitlab-ci-multi-runner restart# 本地gitlab地址 http://gitlab.example.com/ 安裝 gitlab ci runner # 注冊runner sudo gitlab-ci-multi-runner register gitlab-ci 集成服務器注冊runner(即不同的集成環境供gitlab調用)token 在項目的CI選項里面,可以找到一般不要把runner 綁定到一個項目,這樣其他項目也可以調用。(除特殊項目需綁定以保護)[root@jenkins vagrant]# sudo gitlab-ci-multi-runner registerRunning in system-mode.Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):http://gitlab.example.comPlease enter the gitlab-ci token for this runner:gWCZZjwskFtS5n4XT6kVPlease enter the gitlab-ci description for this runner:[jenkins]: gitlab-ciPlease enter the gitlab-ci tags for this runner (comma separated):python3.4Whether to run untagged builds [true/false]:[false]:Whether to lock Runner to current project [true/false]:[false]:Registering runner... succeeded runner=gWCZZjwsPlease enter the executor: docker, shell, ssh, kubernetes, docker-ssh, parallels, virtualbox, docker+machine, docker-ssh+machine:dockerPlease enter the default Docker image (e.g. ruby:2.1):python:3.4Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded! 注冊runner 查看[root@jenkins vagrant]# sudo gitlab-ci-multi-runner listListing configured runners ConfigFile=/etc/gitlab-runner/config.tomljenkins Executor=shell Token=d790b6db10f7f7d3b8547519818948 URL=http://10.0.0.190/gitlab-ci Executor=shell Token=ad11a86454c6552424fbf0d6c8b029 URL=http://gitlab.example.comgitlab-ci Executor=docker Token=0304db778d4e040d25234594dbe363 URL=http://gitlab.example.comgitlab-ci Executor=docker Token=b57303fbaf1623a5d8c42723606aad URL=http://gitlab.example.com[root@jenkins vagrant]# sudo gitlab-ci-multi-runner verifyRunning in system-mode.Verifying runner... is alive runner=ad11a864Verifying runner... is alive runner=0304db77Verifying runner... is alive runner=b57303fb 查看?? projects 的導入,可以通過github,url等導入到gitlab
創建Pipeline
在項目根目錄下創建 .gitlab-ci.yml? 并配置。 Python 的 tox 測試
.gitlab-ci.ymlstages:- style- test- deploy- releasepep8:stage: stylescript:- pip install tox- tox -e pep8tags:- python2.7except:- tagsunittest-py27:stage: testscript:- pip install tox- tox -e py27tags:- python2.7except:- tagsunittest-py34:stage: testscript:- pip install tox- tox -e py34tags:- python3.4except:- tagsdocker-deploy:stage: deployscript:- 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-demotags:- demoonly:- masterdocker-image-release:stage: releasescript:- docker build -t registry.example.com:5000/flask-demo:$CI_COMMIT_TAG .- docker push registry.example.com:5000/flask-demo:$CI_COMMIT_TAGtags:- demoonly:- tags .gitlab-ci.yml 項目根目錄下的集成文件 .gitlab-ci.yml 配置集成和部署的步驟 (pipeline)tags: # 執行環境- runnerexcept: # 排除,tags不觸發- tagsonly: # 只有master更改才觸發- masterstages: # 流程,有哪些步驟- style- test- dploy- releasejob name: #job名稱 ,屬于某一個流程 .gitlab-ci.yml配置語法 具體看幫助信息??? gitlab 可以 實現代碼倉庫托管,直接拉取倉庫集成測試。這塊比較好,而且天生支持分布式。
CI的部署,但是runner公有的有限,還是得要有自己的測試runner,可以在本地自己搭建linux gitlab runner ,配置好環境,并注冊,供gitlab CI 測試調度。然后發布到正式服務器。
???? gitlab-ci 本身就支持分布式,可以再多臺機器上執行runner 供gitlab 調用測試
要注意保護 master 分支 ,不能被隨意修改,
???? 在 CI 設置里有 master protect 選項 和 parallel 檢查設置
???? 只有push-->merge request-->pipline 測試通過 --> commit
.travis.yml # travis集成環境的環境配置文件 https://travis-ci.org/ 一個CI網站 ,開源項目免費,私有項目要錢。
language: python env:- TOXENV=py27- TOXENV=py34- TOXENV=pep8- TOXENV=docsinstall:- pip install tox- pip install coveralls script:- toxafter_success:coveralls --verbose .travis.yml提交觸發后 pipeline 的執行流程,可以點不同job 進行查看執行情況
注意要給項目分配 runner
? 當runner 環境為shell等非docker 時,要拉取自己搭建的gitlab 倉庫,只需要配置hosts文件即可。
? 可當用runner 是 docker 時,每次拉取代碼時,docker并不知道宿主機上的host文件,又不可能手動加進去,那樣太麻煩。所以會出現無法訪問自己的gitlab倉庫。
這時候就需要,搭建DNS解析服務器,讓docker能夠解析到倉庫。?
搭建DNS 服務器
? 配置一個DNS服務器,以便能讓其他容器解析到集成服務器 gitlab.example.com
? 首先,在gitlab ci服務器上把 gitlab.example.com 從/etc/hosts里刪除
? 這時候在gitlab ci服務器上是 ping 不通 gitlab.example.com的。
?? 找一臺新的Linux host,裝好Docker,創建一個dnsmasq的容器,并運行。
?搭建完dns服務器后,要修改為gitlab ci 服務器DNS服務器的ip ---> nameserver 192.168.205.15
[vagrant@ci ~]$ more /etc/resolv.conf # Generated by NetworkManager #nameserver 10.0.2.3 nameserver 192.168.205.15 view這時候 docker 就能訪問到gitlab服務器。
搭建Docker registry 倉庫服務器
? docker hub 上傳的鏡像,屬于公開狀態,docker cloud 有要錢,還好可以搭建自己的docker registry服務器。這樣push pull就方便多了。
? 這里將docker registry 服務器安裝在dns同一臺機器上。
docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2
? 配置 dns-server
執行 docker exec-it dns-server/bin/sh 添加一條新的記錄 / # more /etc/dnsmasqhosts 192.168.205.160 gitlab.example.com 192.168.205.15 reqistry.example.com view? docker restart dns-server
ci 服務器 測試push 時 報錯[root@jenkins vagrant]# docker push registry.example.com:5000/flask-demo:V10The push refers to repository [registry.example.com:5000/flask-demo]Get https://registry.example.com:5000/v2/: http: server gave HTTP response to HTTPS client docker-registry 服務器為http協議客戶端設置默認是HTTPS 協議取push所以要特別更改/etc/docker/daemon.json"insecure-registries":["http://registry.example.com:5000"] [root@jenkins vagrant]# more /etc/docker/daemon.json{"registry-mirrors": ["https://6qcpzbml.mirror.aliyuncs.com"],"insecure-registries":["http://registry.example.com:5000"]}查看push到registry的鏡像版本
???? http://registry.example.com:5000/v2/flask-demo/tags/list
查看push的鏡像 registry
???? [root@docker-host ~]# ls /opt/registry/docker/registry/v2/repositories/
???? flask-demo
在測試通過需要將最新的image push 到倉庫
同時 部署容器時,要判斷是否有舊的版本容器需要刪除,然后再run新版本的容器
$CI_CONMMIT_TAG 是gitlab-ci 的環境變量。具體可以查看幫助文件
?? 一有版本發布或是提交時會自動測試,管理員檢查合并到master分支后,就會觸發pipeline執行集成構建,build的最新鏡像會被push 到倉庫。
?? 然后配置發布服務器從倉庫拉取鏡像,刪除舊的版本,重新run新的版本。就完成了一次自動集成部署。
總結
以上是生活随笔為你收集整理的Docker 与 DevOps自动化部署实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8-5 Navicat工具与pymysq
- 下一篇: 8.7 使用索引-notes