Docker的集成部署攻略

1. 背景
敏捷開發(fā)已經(jīng)流行了很長時間,如今有越來越多的企業(yè)開始踐行敏捷開發(fā)所提倡的以人為中心、迭代、循序漸進的開發(fā)理念。在這樣的場景下引入Docker技術,首要目的就是使用Docker提供的虛擬化方式,給開發(fā)團隊建立一套可以復用的開發(fā)環(huán)境,讓開發(fā)環(huán)境可以通過Image的形式分享給項目的所有開發(fā)成員,以簡化開發(fā)環(huán)境的搭建。但是,在沒有Docker技術之前就已經(jīng)有類如Vagrant的開發(fā)環(huán)境分發(fā)技術,軟件開發(fā)者一樣可以創(chuàng)建類似需求的環(huán)境配置流程。所以在開發(fā)環(huán)境方面,Docker技術的優(yōu)勢并不能很好的發(fā)揮出來。筆者認為Docker的優(yōu)點在于可以簡化CI(持續(xù)集成)、CD(持續(xù)交付)的構(gòu)建流程,讓開發(fā)者把更多的精力用在開發(fā)上。
每家公司都有自己的開發(fā)技術棧,我們需要結(jié)合實際情況對其進行持續(xù)改進,優(yōu)化自己的構(gòu)建流程。當我們準備邁出第一步時,我們首先要確立一張構(gòu)建藍圖,做到胸有成竹,這樣接下來的事情才會很快實現(xiàn)。
這張時序圖概括了目前敏捷開發(fā)流程的所有環(huán)節(jié)。結(jié)合以上時序圖給出的藍圖框架,本文的重點是講解引入Docker技術到每個環(huán)節(jié)中的實踐經(jīng)驗。
2. 創(chuàng)建持續(xù)發(fā)布的團隊
開發(fā)團隊在引入Docker技術的時候,最大的問題是沒有可遵循的業(yè)界標準。大家常常以最佳實踐為口號,引入多種工具鏈,導致在使用Docker的過程中沒有側(cè)重點。涉及到Docker選型,又在工具學習上花費大量時間,而不是選用合適的工具以組建可持續(xù)發(fā)布產(chǎn)品的開發(fā)團隊?;谶@樣的場景,我們可以把“簡單易用”的原則作為評判標準,引入到Docker技術工具選型的參考中。開發(fā)團隊在引入Docker技術的過程中,首先需要解決的是讓團隊成員盡快掌握Docker命令行的使用。在熟悉了Docker命令行之后,團隊需要解決幾個關鍵問題具體如下:
1)Base Image的選擇, 比如phusion-baseimage
2)配置管理Docker鏡像的工具的選擇,比如Ansible、Chef、Puppet
3)Host主機系統(tǒng)的選擇,比如CoreOS、Atomic、Ubuntu
Base Image包括了操作系統(tǒng)命令行和類庫的最小集合,一旦啟用,所有應用都需要以它為基礎創(chuàng)建應用鏡像。Ubuntu作為官方使用的默認版本,是目前最易用的版本,但系統(tǒng)沒有經(jīng)過優(yōu)化,可以考慮使用第三方有劃過的版本,比如如phusion-baseimage。對于選擇RHEL、CentOS分支的Base Image,提供安全框架SELinux的使用、塊級存儲文件系統(tǒng)devicemapper等技術,這些特性是不能和Ubuntu分支通用的。另外需要注意的是,使用的操作系統(tǒng)分支不同,其裁剪系統(tǒng)的方法也完全不同,所以大家在選擇操作系統(tǒng)時一定要慎重。
配置管理Docker鏡像的工具主要用于基于Dockerfile創(chuàng)建Image的配置管理。我們需要結(jié)合開發(fā)團隊的現(xiàn)狀,選擇一款團隊熟悉的工具作為通用工具。配置工具有很多種選擇,其中Ansible作為后起之秀,在配置管理的使用中體驗非常簡單易用,推薦大家參考使用。
Host主機系統(tǒng)是Docker后臺進程的運行環(huán)境。從開發(fā)角度來看,它就是一臺普通的單機OS系統(tǒng),我們僅部署Docker后臺進程以及集群工具,所以希望Host主機系統(tǒng)的開銷越小越好。這里推薦給大家的Host主機系統(tǒng)是CoreOS,它是目前開銷最小的主機系統(tǒng)。另外,還有紅帽的開源Atomic主機系統(tǒng),有基于Fedora、CentOS、RHEL多個版本的分支選擇,也是不錯的候選對象。另外一種情況是選擇最小安裝操作系統(tǒng),自己定制Host主機系統(tǒng)。如果你的團隊有這個實力,可以考慮自己定制這樣的系統(tǒng)。
3. 持續(xù)集成的構(gòu)建系統(tǒng)
當開發(fā)團隊把代碼提交到Git應用倉庫的那一刻,我相信所有的開發(fā)者都希望有一個系統(tǒng)能幫助他們把這個應用程序部署到應用服務器上,以節(jié)省不必要的人工成本。但是,復雜的應用部署場景,讓這個想法實現(xiàn)起來并不簡單。
首先,我們需要有一個支持Docker的構(gòu)建系統(tǒng),這里推薦Jenkins。它的主要特點是項目開源、方便定制、使用簡單。Jenkins可以方便的安裝各種第三方插件,從而方便快捷的集成第三方的應用。
通過Jenkins系統(tǒng)的Job觸發(fā)機制,我們可以方便的創(chuàng)建各種類型的集成Job用例。但缺乏統(tǒng)一標準的Job用例使用方法,會導致項目Job用例使用的混亂,難于管理維護。這也讓開發(fā)團隊無法充分利用好集成系統(tǒng)的優(yōu)勢,當然這也不是我們期望的結(jié)果。所以,敏捷實踐方法提出了一個可以持續(xù)交付的概念 DeploymentPipeline(管道部署)。通過Docker技術,我們可以很方便的理解并實施這個方法。
Jenkins的管道部署把部署的流程形象化成為一個長長的管道,每間隔一小段會有一個節(jié)點,也就是Job,完成這個Job工作后才可以進入下一個環(huán)節(jié)。形式如下
大家看到上圖中的每一塊面板在引入Docker技術之后,就可以使用Docker把任務模塊化,然后做成有針對性的Image用來跑需要的任務。每一個任務Image的創(chuàng)建工作又可以在開發(fā)者自己的環(huán)境中完成,類似的場景可以參考下圖:
所以,使用Docker之后,任務的模塊化很自然地被定義出來。通過管道圖,可以查看每一步的執(zhí)行時間。開發(fā)者也可以針對任務的需要,為每一個任務定義嚴格的性能標準,已作為之后測試工作的參考基礎。
4.最佳的發(fā)布環(huán)境
應用經(jīng)過測試,接下來我們需要把它發(fā)布到測試環(huán)境和生產(chǎn)環(huán)境。這個階段中如何更合理地使用Docker也是一個難點,開發(fā)團隊需要考慮如何打造一個可伸縮擴展的分發(fā)環(huán)境。其實,這個環(huán)境就是基于Docker的私有云,更進一步我們可能期望的是提供API接口的PaaS云服務。為了構(gòu)建此PaaS服務,這里推薦幾款非常熱門的工具方便大家參考,通過這些工具可以定制出企業(yè)私有的PaaS服務。
1) Apache Mesos + marathon
Apache Mesos系統(tǒng)是一套資源管理調(diào)度集群系統(tǒng),生產(chǎn)環(huán)境使用它可以實現(xiàn)應用集群。此系統(tǒng)是由Twitter發(fā)起的Apache開源項目。在這個集群系統(tǒng)里,我們可以使用Zookeeper開啟3個Mesos master服務,當3個Mesos master通過zookeeper交換信息后會選出Leader服務,這時發(fā)給其它兩臺Slave Messos Master上的請求會轉(zhuǎn)發(fā)到Messos master Leader服務。Mesos slave服務器在開啟后會把內(nèi)存、存儲空間和CPU 資源信息發(fā)給Messos master。Mesos是一個框架,在設計它的時候只是為了用它執(zhí)行Job來做數(shù)據(jù)分析。它并不能運行一個比如Web服務Nginx這樣長時間運行的服務,所以我們需要借助marathon來支持這個需求。marathon有自己的REST API,我們可以創(chuàng)建如下的配置文件Docker.json:
- {
- "container": {
- "type": "DOCKER",
- "docker": {
- "image": "libmesos/ubuntu"
- }
- },
- "id": "ubuntu",
- "instances": "1",
- "cpus": "0.5",
- "mem": "512",
- "uris": [],
- "cmd": "while sleep 10; do date -u +%T; done"
- }
然后調(diào)用
curl -X POST -H "Content-Type: application/json" http://<master>:8080/v2/apps -d@Docker.json
我們就可以創(chuàng)建出一個Web服務在Mesos集群上。對于Marathon的具體案例,可以參考官方案例。
2) Google Kubernetes
Google的一個容器集群管理工具,它提出兩個概念:
Pods,每個Pod是一個容器的集合并部署在同一臺主機上,共享IP地址和存儲空間,比如Apache,Redis之類分為一組容器集合。
Labels,提供服務標簽,方便Pod容器之間的調(diào)用協(xié)作。
通過官方架構(gòu)設計文檔的介紹,可以詳細的了解每個組件的設計思想。這是目前業(yè)界唯一在生產(chǎn)環(huán)境部署經(jīng)驗的基礎上推出的開源容器方案,可以預見到未來會成為容器管理系統(tǒng)的行業(yè)參考標準。
3) Panamax
在琳瑯滿目的集群管理工具面前,如何管理單機的Docker容器也是一個需要解決問題。因為Docker占用內(nèi)存小,在單機服務器上部署成百上千個容器也不足為奇。Panamax提供人性化的Web管理界面用來安裝軟件讓部署變得更簡單。并且,Panamax還提供豐富的容器模板,讓在線創(chuàng)建服務成為可能。比如到DigitalOcean申請一臺主機,安裝一套Panamax啟動為后臺服務。然后通過Panamax Web界面安裝Nginx、Mysql、Redis等服務鏡像,這樣可以快速搭建生產(chǎn)環(huán)境的應用場景。所有的操作都是在Web界面上完成,開發(fā)者只需要關注開發(fā)本身即可。
5. 結(jié)論
Docker的集成部署方案,是一套靈活簡單的工具集解決方案。它克服了之前集群工具復雜、難用的困境,使用統(tǒng)一的Docker應用容器的概念部署軟件應用。通過引入Docker技術,開發(fā)團隊在面對復雜的生產(chǎn)環(huán)境中,可以結(jié)合自己團隊的實際情況,定制出適合自己基礎架構(gòu)的配套軟件發(fā)布方案。
相關文章
輕松玩轉(zhuǎn)虛擬機套娃! 在Hyper-V中開啟嵌套虛擬化的技巧
有辦法在虛擬機中創(chuàng)建虛擬機嗎?答案是肯定的,在虛擬機中運行虛擬機是可能的,我們將其稱為嵌套虛擬化,下面我們就來看看詳細操作方法2025-02-19龍蜥操作系統(tǒng)Anolis OS-23.x安裝配置圖解教程(保姆級)
本文主要介紹了安裝和配置AnolisOS 23.2系統(tǒng),包括分區(qū)、軟件選擇、設置root密碼、網(wǎng)絡配置、主機名設置和禁用SELinux的步驟,具有一定的參考價值,感興趣的可以了解一下2025-01-20- 在處理文件拷貝復制到VMware虛擬機中的任務時,有多種方法可以實現(xiàn)文件的高效傳輸,使用這些方法,可以在不同的操作系統(tǒng)和環(huán)境下,實現(xiàn)文件的快速、安全遷移,詳細請看下文2024-09-24
統(tǒng)信 UOS V20 桌面專業(yè)版更新發(fā)布:附更新內(nèi)容匯總
統(tǒng)信 UOS V20 桌面專業(yè)版(1070u1)正式發(fā)布,支持微信掃碼登錄、應用窗口縮略圖,海量功能修復,詳細請看下文介紹2024-08-08怎么看自己IP地址? 不同的操作系統(tǒng)中查看路由器的IP地址的方法
在互聯(lián)網(wǎng)上進行網(wǎng)絡連接,每個設備都有一個唯一的標識,即IP地址,本文介紹了如何在不同平臺上查找路由器的IP地址,包括Windows、Mac、iPhone、iPad、Android、Chrome OS和2024-07-16- 很多人在使用虛擬機系統(tǒng)的時候,經(jīng)常對虛擬機的運行速度不甚滿意,甚至經(jīng)常很惱火,虛擬機速度慢有很多原因,每個人需要根據(jù)自己的情況具體分析,本文根據(jù)筆者的使用經(jīng)驗將2024-02-21
- 使用虛擬機的時候,遇到了錯誤,想要把錯誤的代碼或是運行情況復制粘貼到Windows的網(wǎng)上論壇區(qū)求助大神,該怎么操作呢?詳細請看下文介紹2024-02-21
統(tǒng)信UOS V20桌面專業(yè)版(1060)11月更新發(fā)布(附更新內(nèi)容匯總)
國產(chǎn)桌面操作系統(tǒng)統(tǒng)信 UOS V20 專業(yè)版(1060)11月更新發(fā)布,這是統(tǒng)信 UOS V20 專業(yè)版(1060)2023 年度最后一次更新,下面我們就來看看詳細的更新內(nèi)容2023-12-01統(tǒng)信 UOS 將推 Rust 版 Bash 命令行工具 utshell(附下載地址)
統(tǒng)信 UOS 服務器版將于不久后推出 Rust 版 Bash,名為 utshell,旨在突破傳統(tǒng) Shell 所面臨的安全限制,詳細請看下文介紹2023-09-20UOS開機進入busybox界面怎么辦 uos無法進入桌面的解決辦法
UOS開機進入busybox界面怎么辦?UOS系統(tǒng)開機黑屏進入busybox界面了,該怎么辦呢?下面我們就來看看uos無法進入桌面的解決辦法2023-09-06