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

爲何使用Docker

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

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

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

hub.docker.com 裏面的鏡像也很方便 節約了不少本身生成鏡像的時間git

至關於提升了複用率github

  

安裝Docker

 我這裏使用 Ubuntu 14.04 系統上安裝 web

curl -s https://get.docker.com/ | sudo sh

Ubuntu 其餘版本可能須要先升級一下內核 redis

詳細可參考 這裏sql

 

構建持續集成環境(Java)

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

持續集成的目的tomcat

 讓咱們每次更新了代碼提交到git倉庫後就自動運行測試構建新版本 自動部署到測試或集羣 歷來提升生產效率 告別重複的勞動

持續集成和部署的原理

咱們用到的全部基礎設施咱們都將使用Docker 部署

1. 推送到git 倉庫   

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

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

4. 監控系統 

5  docker   log 集中管理  LEK

 

本文使用的是Java的構建方式 除了第三步之外 其餘工程也都是同樣的

 

  •  構建Gitlab

  

  Gitlab做爲代碼倉庫是咱們環節的第一步 (若是使用github 或osc git 能夠跳過這個步驟

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

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

 通常構建依賴關係比較複雜的容器均可以用docker-compose來配置

使用說明能夠看一下 這裏

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

 docker-compose.yml 文件以下

 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
#執行以下命令 就能夠構建gitlab了 
docker-compose up -d

運行 docker ps 查看一下 能夠看到已經啓動成功了  

訪問一下啓動主機的 你映射的端口便可訪問 我這裏是80

  • 構建Docker私有倉庫

一樣咱們還須要一個Docker倉庫來存放咱們發佈的鏡像版本(使用公有倉庫如 docker hub 能夠跳過此步驟

咱們採用 官方鏡像 registry 運行

運行以下命令便可

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

運行docker ps 便可查看 運行狀況

相應命令

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 鏡像

執行命令

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

參數說明:  

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

而後訪問8080 端口就能夠了

默認用戶密碼 admin admin 

  • Docker-Swarm 集羣

  咱們使用Docker-Swarm 來部署 docker 集羣  

  部署一樣十分簡單

#運行這個這個命令後會返回一個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>
#查看集羣的節點信息 

docker -H 管理節點的ip:2376 info

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

在集羣運行容器 

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

docker -H 管理節點的ip:2376 run  xxx   #運行容器
docker -H 管理節點的ip:2376 ps  xxx    #查看集羣容器運行狀況

 

 

問題

查看節點發現沒法鏈接  請在節點 docker配置文件  /etc/init/docker.conf 裏面 找到以下一行 添加啓動參數

 --insecure-registry 0.0.0.0/0 # 設置倉庫爲http訪問  -H unix:///var/run/docker.sock  -H 0.0.0.0:2375 #打開節點對外通訊接口 --label label_name=docker-1 # 設置一下label 方便區分

 

 

 

  • Hello World 

 基礎的設施咱們已經搭建好了 下面咱們就能夠開始測試一下

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

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

3) 編寫打包鏡像的Dockerfile     和部署到集羣的 腳本 (放在當前項目裏面就能夠了

Dockerfile  

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

這裏使用的是 官方 tomcat 鏡像

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

build.sh  部署使用的腳本

#!/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管理平臺、

 在管理節點 執行如下命令就能夠安裝了 管理程序

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容器了   具體查看文檔這裏就很少提了

 

  • 更多

日誌統一管理平臺 ELK

docker集羣動態伸縮

等等...

且聽咱們下回分解  

 

  • 其餘

注意 本文的docker swarm 安裝使用 方式已通過期了 請查看最新的

docker-hello-world 項目代碼

相關文章
相關標籤/搜索