爲什麼使用Docker
“從我個人使用的角度講的話 部署來的更方便
只要構建過一次環境 推送到鏡像倉庫 遷移起來也是分分鐘的事情
虛擬化讓集羣的管理和控制部署都更方便
hub.docker.com 裏面的鏡像也很方便 節約了很多自己生成鏡像的時間
相當於提高了複用率
”
安裝Docker
“我這裏使用 Ubuntu 14.04 系統上安裝
1curl -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
123#使用python 包管理工具pip安裝
apt-get
install
python-pip python-dev
pip
install
-U docker-compose
一般構建依賴關係比較複雜的容器都可以用docker-compose來配置
使用說明可以看一下 這裏
我們使用hub.docker.com 的 sameersbn/gitlab 鏡像來快速構建
docker-compose.yml 文件如下
12345678910111213141516171819202122232425
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
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 --
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>
123#查看集羣的節點信息
docker -H 管理節點的ip:2376 info
如圖可見 當前集羣有一個節點
在集羣運行容器
同理只要在 添加 -H 管理節點的ip:2376 就可以在集羣上運行容器了
12docker -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 鏡像
123FROM tomcat:8-jre8
RUN
rm
-rf
/usr/local/tomcat/webapps
ADD .
/target/ROOT
.war
/usr/local/tomcat/webapps/ROOT
.war
build.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 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管理平臺、
在管理節點 執行以下命令就可以安裝了 管理程序
12curl -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容器了 具體查看文檔這裏就不多提了