工做多年,在項目部署方面,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
重啓服務便可
一、隔離性,安全性(無需擔憂外界對容器系統的影響,固然也有比較特殊的狀況,後面會說到)
那麼隔離性的優點在實際項目中體如今哪裏呢?
:在分佈式環境中,一個服務器中可能存在多個相同的服務(端口相同),或者多個不一樣環境的服務(好比jdk7,jdk8,php,python等)存在於同一個服務器中,隔離性使他們之間不會出現衝突!
:由於隔離,因此單個容器的崩潰不會影響其餘服務的運行,每一個容器可分配合適的系統資源(包括CPU、內存和磁盤空間)
二、移植性
windows、linux都能跑,其餘的環境還沒用到就不列出來了
三、版本控制和持續集成
結合其餘插件,能夠輕鬆作好整一個項目部署流程,包括編譯、打包、更新發布、回滾等等
四、成本低
正式由於上述的好處以及docker在資源分配上的優點,使用docker成本低,效果好
一、鏡像的大小問題:像springboot這種項目的運行須要基於jdk環境的linux或者windows系統,那麼這個基礎鏡像的大小就是一個大問題了
linux系統咱們使用alpine,帶jdk環境的我使用dockerhub上面處理好的 https://hub.docker.com/r/anapsix/alpine-java ,也能夠本身根據官網鏡像加工處理
二、編譯打包的問題:我直接在製做鏡像的時候給系統安裝maven,使用mvn完成編譯打包
三、最後最關鍵的是管理工具的問題:優秀的管理工具能減小咱們90%的工做量,我使用Rancher,默認自帶cattle,固然還有其餘編排工具 可以使用k8s
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
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/