天天看點

想用好 Docker ,你不能錯過這些

docker 引起了傳遞方式的變革,從傳遞代碼和文檔變成傳遞docker鏡像乃至傳遞編排模闆。

容器服務讓我們可以專注應用本身功能的開發,而無需關注基礎設施、應用部署、管理等等一大堆棘手的問題。

越來越多的公司開始考慮使用docker的方式部署和管理應用,以降低運維的成本。

同時,阿裡雲容器服務團隊正在積極的推進國内docker的發展,阿裡雲在雲栖大會上宣布和docker公司戰略合作,将為docker hub提供中國營運的基礎服務

說易行難,真正開始的時候又不知道具體該做什麼,會遇到哪些坑?

日前,阿裡雲容器服務團隊進行了一次線上的圓桌互動,以下是提煉和總結

來自使用者的總結:

個人了解:具體到 docker 技術在測試領域的應用,可以展現在:

1)快速搭建相容性測試環境

從docker的鏡像與容器技術特點可以預見,當被測應用要求在各類web伺服器、中間件、資料庫的組合環境中得到充分驗證時,可以快速地利用基礎docker鏡像建立各類容器,裝載相應的技術元件并快速啟動運作,測試人員省去了大量花在測試環境搭建上的時間。

2)快速搭建複雜分布式測試環境

docker的輕量虛拟化特點決定了它可以在一台機器上(甚至是測試人員的一台筆記本電腦上)輕松搭建出成百上千個分布式節點的容器環境,進而模拟以前需要耗費大量時間和機器資源才能搭建出來的分布式複雜測試環境。

3)持續內建

docker可以快速建立和撤銷容器,在持續內建的環境中,可以頻繁和快速地進行部署和驗證工作

精彩問答:

- hyper_x問:如何平滑遷移到docker ?合适的容器排程管理平台有推薦嗎?多主機跨容器通信及性能問題怎麼處理?容器的監控及故障遷移恢複怎麼操作?

- 專家答:

遷移docker的時候,建議“慢慢來”,先把一些邊緣的、無狀态的應用放在容器裡運作,核心服務先不動,穩定之後再逐漸開始遷移重要應用。

遷移過程中,可能會涉及到對應用通路模式的改造,在條件允許的情況下,比如業務壓力不是這麼大,可以做一些改造。比如兩個應用原來是部署在一台機器上,通過unix domain socket通信,切換到docker之後,推薦每個容器隻跑一個應用,但是在過渡期,做一個大鏡像,裡面放兩個應用也不是不可以

容器管理方面,目前主要三個方面:k8s, swarm和mesos,很難說哪個更好,您可以都嘗試下。阿裡雲的容器服務采用的是swarm的模式,內建了阿裡雲的一些基礎服務:日志、監控、存儲等,在排程等方面做了很多優化,你也可以使用看看。

容器跨主機通信,docker本身提供了overlay network,也有一些開源的軟體 flannel calico,按照底層網絡模式分,overlay flannel weave等是vxlan的方式,需要對packet封裝和解封,性能上差一些,calico 使用 bgp 協定直接路由,但是對底層的網絡模型要求較高。容器服務提供了針對阿裡雲的vpc的 docker 插件,容器之間的資料包不需要封裝操作,性能幾乎和vpc内兩台ecs通信性能一樣。

- rg小恒問:

1.docker的友善我覺得是靈活傳遞以及持續內建,在對叢集主控端的資源利用上比虛拟主機友善一些,譬如容器遷移比vm遷移友善,我想問一下容器對于資源利用比直接跑在vm上是不是要好一些。

2.假如我的應用是基于tomcat的,挂載volume是用主控端的磁盤好一些還是用nas,釋出新版本(譬如更換war包)有什麼好的方法,是我手動去替換volume裡邊的war包還是觸發自動建構重新起一個tomcat容器,如果我隻是想替換tomcat應用容器中的某些jsp檔案呢

3.用阿雲的容器服務的時候,叢集預設會有etcd容器還是需要自己起一個

4.容器的監控是用阿雲的監控即可還是需要自己另尋他路,譬如用谷歌的cadvisor等

更細粒度的資源管理可以提高資源使用率,從實體機到虛拟機再到容器,資源的粒度在不斷細化。一台vm上啟動多個容器能更充分的利用vm的資源,配合雲服務和自動排程等手段,可以進一步提供資源使用率和降低資源成本。

docker推崇的做法是不可變基礎架構,變更的是鏡像而不是容器内的檔案,是以每次釋出,要用新的war包建構一個新鏡像,再用新鏡像啟動應用。即使不說容器,在java web開發裡也不建議在生産環境裡熱更新jsp,生産環境要求的是可靠和高性能,替換jsp這種方式隻能用在開發測試環境。

容器服務有etcd服務,但主要用于docker daemon以及容器服務自身的agent,如果是您自己的業務上用到etcd,可以自己起一個。

- 使用者問:

有沒有鏡像制作的最佳實踐可以參考?

使用 dockerfile 制作鏡像,不要用 docker commit

dockerfile放在一個專門的目錄裡,其中隻包含制作鏡像所需的檔案(如果分離建構和鏡像制作,這裡隻放建構後的包,不要放源碼)。

必要的時候可以使用.dockerignore

減少層數量,dockerfile 裡用 run 的時候,一個run後面跟多個指令,指令之間用&&分割

經常變化的内容放在 dockerfile 的後面,前面不變的部分可以直接用 cache,降低 build 鏡像的時間。