爲何使用Dockerhtml
「從我我的使用的角度講的話 部署來的更方便 java
只要構建過一次環境 推送到鏡像倉庫 遷移起來也是分分鐘的事情 python
虛擬化讓集羣的管理和控制部署都更方便git
hub.docker.com 裏面的鏡像也很方便 節約了不少本身生成鏡像的時間github
至關於提升了複用率web
」
安裝Dockerredis
「我這裏使用 Ubuntu 14.04 系統上安裝 sql
1curl -s https:
//get
.docker.io
/ubuntu/
|
sudo
sh
Ubuntu 其餘版本可能須要先升級一下內核 docker
詳細可參考 這裏
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容器了 具體查看文檔這裏就很少提了