從我我的使用的角度講的話 部署來的更方便 html
只要構建過一次環境 推送到鏡像倉庫 遷移起來也是分分鐘的事情 java
虛擬化讓集羣的管理和控制部署都更方便python
hub.docker.com 裏面的鏡像也很方便 節約了不少本身生成鏡像的時間git
至關於提升了複用率github
我這裏使用 Ubuntu 14.04 系統上安裝 web
curl -s https://get.docker.com/ | sudo shUbuntu 其餘版本可能須要先升級一下內核 redis
詳細可參考 這裏sql
下來開始咱們今天的主題 構建持續集成與自動部署的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.warbuild.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 安裝使用 方式已通過期了 請查看最新的