為什么使用Docker
“從我個人使用的角度講的話 部署來的更方便
只要構建過一次環境 推送到鏡像倉庫 遷移起來也是分分鍾的事情
虛擬化讓集群的管理和控制部署都更方便
hub.docker.com 里面的鏡像也很方便 節約了很多自己生成鏡像的時間
相當於提高了復用率
”
安裝Docker
“我這里使用 Ubuntu 14.04 系統上安裝
1curl -s https://get.docker.io/ubuntu/|sudoshUbuntu 其他版本可能需要先升級一下內核
詳細可參考 這里
”
構建持續集成環境(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
123#使用python 包管理工具pip安裝apt-getinstallpython-pip python-devpipinstall-U docker-compose一般構建依賴關系比較復雜的容器都可以用docker-compose來配置
使用說明可以看一下 這里
我們使用hub.docker.com 的 sameersbn/gitlab 鏡像來快速構建
docker-compose.yml 文件如下
12345678910111213141516171819202122232425gitlab:image: sameersbn/gitlabports:-"22:22"-"80:80"links:- gitlab-redis:redisio- gitlab-postgresql:postgresqlenvironment:- GITLAB_PORT=80- GITLAB_SSH_PORT=22- GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alpha-numeric-stringrestart: alwaysgitlab-redis:image: sameersbn/redisrestart: alwaysgitlab-postgresql:image: sameersbn/postgresql:9.4-12environment:- DB_NAME=gitlabhq_production- DB_USER=gitlab- DB_PASS=passwordrestart: always
12#執行如下命令 就可以構建gitlab了docker-compose up -d運行 docker ps 查看一下 可以看到已經啟動成功了
訪問一下啟動主機的 你映射的端口即可訪問 我這里是80
”
-
構建Docker私有倉庫
“同樣我們還需要一個Docker倉庫來存放我們發布的鏡像版本(使用公有倉庫如 docker hub 可以跳過此步驟)
我們采用 官方鏡像 registry 運行
運行如下命令即可
12docker run -d --restart=always --name registry \-v/mnt/docker/registry:/tmp/registry-p 5000:5000 registry運行docker ps 即可查看 運行情況
相應命令
12docker 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 鏡像
執行命令
123docker 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參數說明:
12-v/mnt/jenkins_home:/var/jenkins_home# 映射到本地磁盤
12-v/var/run/docker.sock:/var/run/docker.sock#映射主機的docker到容器里面 這樣在容器里面就可以使用主機安裝的 docker 了然后訪問8080 端口就可以了
默認用戶密碼 admin admin
”
-
Docker-Swarm 集群
“我們使用Docker-Swarm 來部署 docker 集群
部署同樣十分簡單
12345678910#運行這個這個命令后會返回一個token來替換下面命令的<token>docker run --rmswarm 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>
123#查看集群的節點信息docker -H 管理節點的ip:2376 info如圖可見 當前集群有一個節點
在集群運行容器
同理只要在 添加 -H 管理節點的ip:2376 就可以在集群上運行容器了
12docker -H 管理節點的ip:2376 run xxx#運行容器docker -H 管理節點的ip:2376psxxx#查看集群容器運行情況”
-
Hello World
“基礎的設施我們已經搭建好了 下面我們就可以開始測試一下
1)這里我新建了一個javaEE maven 項目 很簡單寫了一個 index.html
2)在 gitlab新建一個docker-hello-world 項目倉庫
3) 編寫打包鏡像的Dockerfile 和部署到集群的 腳本 (放在當前項目里面就可以了)
Dockerfile
很簡單的步驟 把編譯好的war 放入鏡像就可以了
這里使用的是 官方 tomcat 鏡像
123FROM tomcat:8-jre8RUNrm-rf/usr/local/tomcat/webappsADD ./target/ROOT.war/usr/local/tomcat/webapps/ROOT.warbuild.sh 部署使用的腳本
12345678910111213141516171819202122232425262728293031#!/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 cleaninstall-Dmaven.test.skip=true#使用我們剛才寫好的 放在項目下面的Dockerfile 文件打包docker build -t $TAG $WORKSPACE/.docker push $TAGdocker rmi $TAG# 如果有以前運行的版本就刪了ifdocker -H $SWARM_MANAGE_URLps-a|grep-i $JOB_NAME;thendocker -H $SWARM_MANAGE_URLrm-f $JOB_NAMEfi#運行到集群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管理平台、
在管理節點 執行以下命令就可以安裝了 管理程序
12curl -SsL -o/tmp/csphere-install.sh https://csphere.cn/static/csphere-install-v2.shsudoenvROLE=controller CSPHERE_VERSION=1.0.1/bin/sh/tmp/csphere-install.sh在集群的節點安裝Agent
訪問controller A主機的1016端口 點擊左側的“主機”菜單,進入主機列表頁面,
點擊添加主機並復制腳本,在Agent主機安裝Agent程序
然后就可以查看和管理 docker容器了 具體查看文檔這里就不多提了










