使用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容器了   具體查看文檔這裏就不多提了

發佈了29 篇原創文章 · 獲贊 4 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章