使用Docker構建持續集成與自動部署的Docker集群


為什么使用Docker

從我個人使用的角度講的話  部署來的更方便 

只要構建過一次環境 推送到鏡像倉庫 遷移起來也是分分鍾的事情 

虛擬化讓集群的管理和控制部署都更方便

hub.docker.com 里面的鏡像也很方便 節約了很多自己生成鏡像的時間

相當於提高了復用率

  

安裝Docker

 我這里使用 Ubuntu 14.04 系統上安裝 

?
1
curl -s https: //get .docker.io /ubuntu/  sudo  sh

Ubuntu 其他版本可能需要先升級一下內核 

詳細可參考 這里


構建持續集成環境(Java)

       下來開始我們今天的主題 構建持續集成與自動部署的Docker集群 

持續集成的目的

 讓我們每次更新了代碼提交到git倉庫后就自動運行測試構建新版本 自動部署到測試或集群 從來提高生產效率 告別重復的勞動

持續集成和部署的原理

我們用到的所有基礎設施我們都將使用Docker 部署

1. 推送到git 倉庫   

2. jenkine pull git代碼  運行 編譯鏡像 進行編譯  

3. 打包生成的代碼 生成一個新版本的鏡像 推送到倉庫  刪除當前容器  重新運行新版本鏡像   

4. 監控系統 

5  docker   log 集中管理  LEK


本文使用的是Java的構建方式 除了第三步以外 其他工程也都是一樣的


  •  構建Gitlab

  

  Gitlab作為代碼倉庫是我們環節的第一步 (如果使用github 或osc git 可以跳過這個步驟

 為了方便構建我們先安裝一下docker編配工具 Docker-compose 

?
1
2
3
#使用python 包管理工具pip安裝 
apt-get  install  python-pip python-dev
pip  install  -U docker-compose

 一般構建依賴關系比較復雜的容器都可以用docker-compose來配置

使用說明可以看一下 這里

我們使用hub.docker.com 的  sameersbn/gitlab 鏡像來快速構建 

 docker-compose.yml 文件如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  gitlab:
     image: sameersbn /gitlab
     ports:
       "22:22"
       "80:80"
     links: 
       - gitlab-redis:redisio
       - gitlab-postgresql:postgresql
     environment:
       - GITLAB_PORT=80 
       - GITLAB_SSH_PORT=22
       - GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-string
     restart: always
 
  gitlab-redis:
     image: sameersbn /redis
     restart: always
 
  gitlab-postgresql:
     image: sameersbn /postgresql :9.4-12
     environment:
         - DB_NAME=gitlabhq_production
         - DB_USER=gitlab
         - DB_PASS=password
     restart: always
?
1
2
#執行如下命令 就可以構建gitlab了 
docker-compose up -d

運行 docker ps 查看一下 可以看到已經啟動成功了  


訪問一下啟動主機的 你映射的端口即可訪問 我這里是80

  • 構建Docker私有倉庫

同樣我們還需要一個Docker倉庫來存放我們發布的鏡像版本(使用公有倉庫如 docker hub 可以跳過此步驟

我們采用 官方鏡像 registry 運行

運行如下命令即可

?
1
2
docker run -d  --restart=always --name registry \
  - v   /mnt/docker/registry : /tmp/registry   -p 5000:5000 registry

運行docker ps 即可查看 運行情況

相應命令

?
1
2
docker pull   倉庫ip:倉庫端口/項目名     拉取鏡像
docker push    倉庫ip:倉庫端口/項目名    推送鏡像

問題 

docker私有倉庫 拉取/推送 失敗 提示不能使用http 連接   

  •   方法1 設置倉庫https 證書即可  推薦 詳情可見

  •   方法2 在docker啟動參數里面添加 –-insecure-registry  0.0.0.0/0   然后重啟docker 

  • 構建Jenkins

我們使用jenkins 來持續集成 

構建同樣十分簡單 我們使用的是 hub.docker.com 的  jayqqaa12/jenkins 鏡像

執行命令

?
1
2
3
docker run  docker run  -d  -p 8080:8080 \
--name jenkins  --restart=always - v  /mnt/jenkins_home : /var/jenkins_home  \
- v  /var/run/docker .sock: /var/run/docker .sock   jayqqaa12 /jenkins

參數說明:  

?
1
2
  - v  /mnt/jenkins_home : /var/jenkins_home 
   # 映射到本地磁盤
?
1
2
- v  /var/run/docker .sock: /var/run/docker .sock  
#映射主機的docker到容器里面 這樣在容器里面就可以使用主機安裝的 docker 了

然后訪問8080 端口就可以了

默認用戶密碼 admin admin 

  • Docker-Swarm 集群

  我們使用Docker-Swarm 來部署 docker 集群  

  部署同樣十分簡單

?
1
2
3
4
5
6
7
8
9
10
#運行這個這個命令后會返回一個token來替換下面命令的<token>
  docker run -- rm  swarm create 
  
  # 運行節點 管理集群swarm  來管理所有節點 
  docker run -d --name swarm-manage --restart=always -p \
  2376:2375 swarm manage token: // <token>
  
  #在節點服務器上運行 添加節點到 集群中  
  docker run -d --restart=always --name swarm-agent swarm \
  join  --addr=當前服務器的ip:2375 token: // <token>
?
1
2
3
#查看集群的節點信息 
 
docker -H 管理節點的ip:2376 info

如圖可見 當前集群有一個節點 


在集群運行容器 

 同理只要在  添加 -H 管理節點的ip:2376 就可以在集群上運行容器了 

?
1
2
docker -H 管理節點的ip:2376 run  xxx    #運行容器
docker -H 管理節點的ip:2376  ps   xxx     #查看集群容器運行情況



  • Hello World 

 基礎的設施我們已經搭建好了 下面我們就可以開始測試一下

1)這里我新建了一個javaEE maven 項目 很簡單寫了一個 index.html 


2)在 gitlab新建一個docker-hello-world 項目倉庫


3) 編寫打包鏡像的Dockerfile     和部署到集群的 腳本 (放在當前項目里面就可以了

Dockerfile  

  很簡單的步驟 把編譯好的war 放入鏡像就可以了 

這里使用的是 官方 tomcat 鏡像

?
1
2
3
FROM tomcat:8-jre8
RUN  rm  -rf  /usr/local/tomcat/webapps
ADD . /target/ROOT .war  /usr/local/tomcat/webapps/ROOT .war

build.sh  部署使用的腳本

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/bin/bash
 
#build in jenkins 
 
# 你的docker 倉庫的地址 
REG_URL=XXX
 
#你的swarm manage 節點的地址
SWARM_MANAGE_URL=xx:2376
 
#根據時間生成版本號
TAG=$REG_URL/$JOB_NAME:` date  +%y%m%d-%H-%M`
 
#使用maven 鏡像進行編譯 打包出 war 文件 (其他語言這里換成其他編譯鏡像)
docker run -- rm  --name mvn  - v  /mnt/maven : /root/ .m2   \
  - v  /mnt/jenkins_home/workspace/ $JOB_NAME: /usr/src/mvn  -w  /usr/src/mvn/ \
  maven:3.3.3-jdk-8 mvn clean  install  -Dmaven. test .skip= true
  
#使用我們剛才寫好的 放在項目下面的Dockerfile 文件打包 
docker build -t  $TAG  $WORKSPACE/.
docker push   $TAG
docker rmi $TAG
 
 
# 如果有以前運行的版本就刪了 
if  docker -H $SWARM_MANAGE_URL  ps  -a|  grep  -i $JOB_NAME;  then
         docker -H $SWARM_MANAGE_URL  rm  -f  $JOB_NAME
fi
 
#運行到集群
docker -H $SWARM_MANAGE_URL run  -d  -p 80:8080  --name $JOB_NAME  $TAG

 

4)在jenkins 上新建一個docker-hello-world 項目  

選擇自由風格即可



設置一下git倉庫地址



設置一下觸發器 為了方便起見這里設置 每分鍾拉取一下  也可以設置一下  gitlab hook 

同時設置一下 構建要執行的腳本 就執行我們剛才寫好的腳本即可



5) 那么開始 推送到我們的倉庫 

 然后查看jenkins console 就可以看到執行的過程了 已經看到 已經執行成功了 

 

訪問一下 已經部署到集群了  (關於集群的負載均衡 部署這里就不講了

 


6)更新版本

 修改一下index.html 然后 再次推送 


等待2~3分鍾后我們就可以看到已經重新部署成功了 就是怎么簡單 




問題1  為什么要把war包打包進容器 而不是掛載新的war包 

解答:docker的理念是一個整體 一個整體的運行環境而不是單純的war包 更適合整體遷移 


問題2:這樣鏡像不會很大么 下載會不會很不方便

解答:因為docker的鏡像是多層依賴的所以 除了第一次下載慢一點以后都會復用之前相同的層 

          所以下載的是不同的 部分 在本實例中只是war包的部分



  • Docker管理監控系統

如何管理容器 查看容器運行情況 日志等都不太方便 我們需要搭建一個監控平台

這里我們采用csphere 的docker管理平台、

 在管理節點 執行以下命令就可以安裝了 管理程序

?
1
2
curl -SsL -o  /tmp/csphere-install .sh https: //csphere .cn /static/csphere-install-v2 .sh
sudo  env  ROLE=controller CSPHERE_VERSION=1.0.1  /bin/sh  /tmp/csphere-install .sh

在集群的節點安裝Agent

訪問controller A主機的1016端口 點擊左側的“主機”菜單,進入主機列表頁面,

點擊添加主機並復制腳本,在Agent主機安裝Agent程序  

然后就可以查看和管理 docker容器了   具體查看文檔這里就不多提了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM