工作多年,在項目部署方面,
1:以前用ftp或者rz上傳更新的,每次更新算上打包、目錄切換、更新遺漏、備份、出錯還原、啟動等工作都得搞上一來小時甚至更長,要是多兩台服務器那心都涼了;
2:后來有用svn或者git的,服務器上拉取的是編譯后的包或目錄;
3:再到現在用jenkins實施自動化構建部署的,配置好jenkins的流水線之后,以后每次代碼提交后只需要點擊一個按鈕即可;
方式3個人感覺已經很不錯了,很方便,還有jenkins+docker的方式等等,這里不做對比,記錄目前使用的部署方式:Dockerfile
流程介紹
1、准備alpine鏡像,制作帶jdk、mvn環境 以及項目lib包,mvn本地倉庫依賴、系統插件等,制作出基礎鏡像
2、使用阿里雲容器鏡像服務,上傳基礎鏡像,設置構建規則
3、項目代碼中加入Dockerfile,邏輯是復制源碼到基礎鏡像生成的容器,執行mvn編譯打包,移動項目啟動包到指定路徑,此處可使用多階段構建減少鏡像體積,最后設置容器啟動的腳本
准備工作
//安裝docker yum -y install docker-io //啟動 service docker start //設置開機啟動 chkconfig docker on
{
"registry-mirrors": [""]
}登錄阿里雲 容器鏡像服務->鏡像加速器-->加速器地址
文件地址 /etc/docker/daemon.json
重啟服務即可
首先說一下docker部署項目的好處:
1、隔離性,安全性(無需擔心外界對容器系統的影響,當然也有比較特殊的情況,后面會說到)
那么隔離性的優勢在實際項目中體現在哪里呢?
:在分布式環境中,一個服務器中可能存在多個相同的服務(端口相同),或者多個不同環境的服務(比如jdk7,jdk8,php,python等)存在於同一個服務器中,隔離性使他們之間不會出現沖突!
:因為隔離,所以單個容器的崩潰不會影響其他服務的運行,每個容器可分配合適的系統資源(包括CPU、內存和磁盤空間)
2、移植性
windows、linux都能跑,其他的環境還沒用到就不列出來了
3、版本控制和持續集成
結合其他插件,可以輕松做好整一個項目部署流程,包括編譯、打包、更新發布、回滾等等
4、成本低
正式因為上述的好處以及docker在資源分配上的優勢,使用docker成本低,效果好
那么使用docker要提前考慮那些或者是注意那些方面的事情呢:
1、鏡像的大小問題:像springboot這種項目的運行需要基於jdk環境的linux或者windows系統,那么這個基礎鏡像的大小就是一個大問題了
linux系統我們使用alpine,帶jdk環境的我使用dockerhub上面處理好的 https://hub.docker.com/r/anapsix/alpine-java ,也可以自己根據官網鏡像加工處理
2、編譯打包的問題:我直接在制作鏡像的時候給系統安裝maven,使用mvn完成編譯打包
3、最后最關鍵的是管理工具的問題:優秀的管理工具能減少我們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/
我遇到需要注意的問題
1、如果Dockerfile中RUN mvn編譯項目出現以下錯誤:
unmappable character (0xE4) for encoding US-ASCII
解決辦法:
在Dockerfile中加上
ENV LANG en_US.utf8
2、Dockerfile 做的鏡像帶CMD啟動腳本的情況 一啟動就關閉
CMD執行腳本 本質上是用了 /bin/sh -c,因為這是容器的主進程,所以當腳本執行完之后容器就會退出。那么可以在腳本的最后加上tail -f /dev/null
3、Alpine安裝配置jdk無法成功
網友表示Alpine缺少glibc,我沒有去深入研究,而是直接用dockerhub上面已經處理好的鏡像,后來在處理其它容器環境的時候也遇到這個問題
#alpine 安裝gcc apk add --no-cache gcc g++ #其他常用庫 apk add jpeg-dev zlib-dev
4、鏡像體積優化
使用多階段構建方法
5、注意看Rancher的文檔
比如網絡模式注意要選擇“托管” 才能使用到大部分的功能,標簽的合理使用,負載均衡的擴展數量限制問題,默認網段10.42.0.0/16 等等
6、容器之間通信失敗
看 healthcheck那幾個系統服務是否有正常運行,一般正常的話就不會有問題。
另外有幾點要注意:
阿里雲文檔表示同一個安全組內網互通;
同一安全組內網、不同主機之間的訪問,rancher負載均衡的端口不需要在防火牆上打開,而宿主機上的應用(比如redis)卻需要在防火牆上打開;
7、這是一個神坑,當防火牆改動后,容器與容器之間、宿主機與容器之間無法通信(正式環境千萬別在白天使用期間嘗試),不知道是Rancher的問題還是docker的問題(后面還發現有台服務器中了挖礦病毒,,)
解決辦法:重啟docker服務,反正有一些奇怪的錯誤出現時可以試試重啟docker服務,另外檢查下是不是主機的問題!
8、多次測試感覺,在rancher的負載均衡下,配置高的主機優先級會很高,重啟低配置主機的時候系統幾乎感覺不到卡頓,反過來就不一樣了
9、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/