Docker+Rancher構建部署流水線

工做多年,在項目部署方面,php

1:之前用ftp或者rz上傳更新的,每次更新算上打包目錄切換更新遺漏備份出錯還原啓動等工做都得搞上一來小時甚至更長,要是多兩臺服務器那心都涼了;java

2:後來有用svn或者git的,服務器上拉取的是編譯後的包或目錄;python

3:再到如今用jenkins實施自動化構建部署的,配置好jenkins的流水線以後,之後每次代碼提交後只須要點擊一個按鈕便可;linux

 

方式3我的感受已經很不錯了,很方便,還有jenkins+docker的方式等等,這裏不作對比,記錄目前使用的部署方式:Dockerfile
git

流程介紹

一、準備alpine鏡像,製做帶jdk、mvn環境 以及項目lib包,mvn本地倉庫依賴、系統插件等,製做出基礎鏡像github

二、使用阿里雲容器鏡像服務,上傳基礎鏡像,設置構建規則redis

三、項目代碼中加入Dockerfile,邏輯是複製源碼到基礎鏡像生成的容器,執行mvn編譯打包,移動項目啓動包到指定路徑,此處可以使用多階段構建減小鏡像體積,最後設置容器啓動的腳本spring

 

準備工做

//安裝docker
yum -y install docker-io

//啓動
service docker start

//設置開機啓動
chkconfig docker on

{
"registry-mirrors": [""]
}docker

登陸阿里雲 容器鏡像服務->鏡像加速器-->加速器地址json

文件地址 /etc/docker/daemon.json

重啓服務便可

 

首先說一下docker部署項目的好處:

一、隔離性安全性(無需擔憂外界對容器系統的影響,固然也有比較特殊的狀況,後面會說到)
  那麼隔離性的優點在實際項目中體如今哪裏呢?

  :在分佈式環境中,一個服務器中可能存在多個相同的服務(端口相同),或者多個不一樣環境的服務(好比jdk7,jdk8,php,python等)存在於同一個服務器中,隔離性使他們之間不會出現衝突!

  :由於隔離,因此單個容器的崩潰不會影響其餘服務的運行,每一個容器可分配合適的系統資源(包括CPU、內存和磁盤空間)

二、移植性

  windows、linux都能跑,其餘的環境還沒用到就不列出來了

三、版本控制和持續集成

  結合其餘插件,能夠輕鬆作好整一個項目部署流程,包括編譯、打包、更新發布、回滾等等

四、成本低

  正式由於上述的好處以及docker在資源分配上的優點,使用docker成本低,效果好

 

那麼使用docker要提早考慮那些或者是注意那些方面的事情呢:

一、鏡像的大小問題:像springboot這種項目的運行須要基於jdk環境的linux或者windows系統,那麼這個基礎鏡像的大小就是一個大問題了

linux系統咱們使用alpine,帶jdk環境的我使用dockerhub上面處理好的 https://hub.docker.com/r/anapsix/alpine-java ,也能夠本身根據官網鏡像加工處理

二、編譯打包的問題:我直接在製做鏡像的時候給系統安裝maven,使用mvn完成編譯打包

三、最後最關鍵的是管理工具的問題:優秀的管理工具能減小咱們90%的工做量,我使用Rancher,默認自帶cattle,固然還有其餘編排工具 可以使用k8s

 

這裏介紹兩個管理工具Portainer和Rancher,單機版小項目或者測試能夠試一下前者,生產環境我用的是Rancher

Docker界面化管理Portainer(我這裏是在Win10系統上的操做)

docker pull portainer/portainer

//啓動
docker run -d -p 9000:9000 --restart=always --name prtainer-test portainer/portainer

 

注意:在win10上安裝的docker處於虛擬機的環境,因此須要選擇remote的方式進行鏈接,首先打開2375端口

輸入命令測試

Test-NetConnection -ComputerName localhost -Port 2375

測試經過

瀏覽器訪問http://127.0.0.1:9000

建立用戶後,選擇remote環境,填寫Endpoint URL docker.for.win.localhost:2375

 

 以下所示就是正常的

 對容器或鏡像的操注意別把portainer相關的刪了

 

 因爲我在使用自建帶密碼的Registries時沒法經過驗證,只能放棄Portainer,Shipyard網上評價比較高,可是中止維護了,在做者的github的首頁有推薦Rancher、dockerui和Portainer

那下面我就切換到Rancher

docker pull rancher/server 

docker run -d --restart=always -p 8089:8080 rancher/server

 容器已啓動,大概要等幾十秒才能訪問http://localhost:8089

第一步配置用戶

而後改一下主機註冊地址,不要用localhost或者127.0.0.1 改爲內網ip,保存

 

接着添加主機

 

第4步 我填的是內網IP,目前生產環境用宿主機內網IP一切正常, (或許用公網IP能有其餘用處,好比跨外網的容器鏈接,我還沒試)

第5步按提示操做便可,

 

從阿里雲拉取鏡像,首先在鏡像庫配置帳號信息,而後新建容器,注意「選擇鏡像」填的是阿里雲鏡像服務中「公網地址:鏡像版本號」,若是是同地域的能夠用專用網絡或者經典網絡地址

大項目用Rancher,功能很是強大,服務編排、升級、回滾、擴容、調度,如同神器

 附上文檔地址:https://rancher.com/docs/rancher/v1.6/zh/

 

 

我遇到須要注意的問題

一、若是Dockerfile中RUN mvn編譯項目出現如下錯誤:

unmappable character (0xE4) for encoding US-ASCII 

解決辦法:

在Dockerfile中加上

ENV LANG en_US.utf8

 

 二、Dockerfile 作的鏡像帶CMD啓動腳本的狀況   一啓動就關閉

CMD執行腳本 本質上是用了 /bin/sh -c,由於這是容器的主進程,因此當腳本執行完以後容器就會退出。那麼能夠在腳本的最後加上tail -f /dev/null

 

三、Alpine安裝配置jdk沒法成功

網友表示Alpine缺乏glibc,我沒有去深刻研究,而是直接用dockerhub上面已經處理好的鏡像,後來在處理其它容器環境的時候也遇到這個問題

#alpine 安裝gcc
apk add --no-cache gcc g++
#其餘經常使用庫
apk add jpeg-dev zlib-dev

 

四、鏡像體積優化

使用多階段構建方法

 

五、注意看Rancher的文檔

好比網絡模式注意要選擇「託管」 才能使用到大部分的功能,標籤的合理使用,負載均衡的擴展數量限制問題,默認網段10.42.0.0/16 等等

 

六、容器之間通訊失敗

看 healthcheck那幾個系統服務是否有正常運行,通常正常的話就不會有問題。

另外有幾點要注意:

    阿里雲文檔表示同一個安全組內網互通;

    同一安全組內網、不一樣主機之間的訪問,rancher負載均衡的端口不須要在防火牆上打開,而宿主機上的應用(好比redis)卻須要在防火牆上打開;

 

七、這是一個神坑,當防火牆改動後,容器與容器之間、宿主機與容器之間沒法通訊(正式環境千萬別在白天使用期間嘗試),不知道是Rancher的問題仍是docker的問題(後面還發現有臺服務器中了挖礦病毒,,)

解決辦法:重啓docker服務,反正有一些奇怪的錯誤出現時能夠試試重啓docker服務,另外檢查下是否是主機的問題!

 

八、屢次測試感受,在rancher的負載均衡下,配置高的主機優先級會很高,重啓低配置主機的時候系統幾乎感受不到卡頓,反過來就不同了

 

九、rancher代理衝突問題:若是你用包含rancher代理的鏡像安裝到另外一臺主機上,那麼本來的主機 '執行命令行' 會一直在 '鏈接中' 的狀態,須要從新走代理註冊的命令

 

 最後再記錄一下測試通訊問題的命令

//alpine安裝telnet
//加速
sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
//安裝
apk add busybox-extras

telnet xxx 
//什麼都沒顯示通常都是通的

apk add curl

//查看外網IP
curl ipinfo.io/ip

 

 

 

 轉載請註明博客出處:http://www.cnblogs.com/cjh-notes/

相關文章
相關標籤/搜索