Docker 很難么?帶你從頭到尾捋一遍,不信你學不會(文末送書)
提起 docker,很多軟件工程師都會認為那是運維工程師需要掌握的技能。殊不知互聯網日益內卷,極限環境下如何脫穎而出——成為佼佼者,這才是值得思考的問題。因此,我們不要局限在特定領域的“一畝三分地”,掌握“應用全生命周期”的各個環節,才是萬全之策。當“領域深耕+邊界擴寬”逐漸成為一種趨勢,T 型人才將會立于不敗之地,這就是所謂的底層邏輯。
而 docker 技術就是這樣一種神奇的存在:懂,萬物皆可容器化;不懂,則重復“搬磚”,繁忙而不自知。
因此,作為軟件工程師,不妨提高自身壁壘,儲備一些 Docker 技術知識體系以備不時之需。
值得關注的是,Docker 一詞的“谷歌趨勢”穩定在 75 分以上(熱度最高的字詞得 100 分),可以看出來近一年 Docker 技術的熱度“有增無減”。
言歸正傳,開篇我們先來講一講 Docker 技術體系,“擴寬邊界”從場景出發。
01
Docker 能做什么
開始之前,先來盤一下日常的開發中什么情況會接觸到 Docker 技術。
Docker 提供了一個通用配置文件。在初次配置成功后,研發人員可以將配置文件固化,之后碰到相同的配置需求,直接復制即可使用。
隨著應用逐漸增多,研發人員只需維護好與之對應的 Docker 配置文件即可,而這個配置文件則存儲了Docker 運行、啟動、部署的命令。
Docker 提供了一組應用打包構建、傳輸及部署的方法,以便于用戶能夠輕而易舉地在容器內運行任何應用。Docker 還提供了跨越這些異構環境以滿足一致性的微環境——從開發到部署、再到流暢發布。
以上這些只是Docker的基本能力,除此之外,它最強大的地方是:可以和Jenkins、GitLab 等串聯起來,融入項目開發的CI/CD(持續集成與持續發布)流程中,讓一鍵部署成為可能。
在傳統軟件開發過程中,開發和運維是兩個極其割裂的環節。對于互聯網公司而言,其業務高速發展,需要通過“小步快跑”的方式進行敏捷開發,以此來滿足用戶差異化的需求、應對競爭對手的產品策略。因此,在極端情況下,如:每周發布多次甚至每天發布多次的場景,高效的團隊協作就顯得尤為重要。
DevOps 在這種場景下應運而生,它打破了開發人員和運維人員之間的壁壘,通過“節點服務”組成工作流,串聯項目完整生命周期,涵蓋了研發、構建、測試、發布、監控及反饋等流程,從而促進了軟件的一致性和標準化。
標準的“節點服務”依賴一些隔離的執行環境:既要快速啟停、又要服務穩定執行、還要支持高并發調度,這一切都可以通過 Docker 來輕松實現。
測試人員每天都需要完成大量的測試任務,手動執行測試會耗費大量的時間,這時可以考慮使用 Docker 進行自動化改造。自動化的成本是首次自動化程序的編寫和維護,而收益則是解放人力、提高生產力。
測試人員在進行一些功能測試、性能測試以及UI測試時,需要快速搭建不同的運行環境、掌握Docker技術,可以讓測試人員如虎添翼。
讀者或許會疑惑,為什么需要應用隔離?例如,服務器上混部了兩個服務:
Node服務,用來啟動Web服務;
Java服務,用來提供前后端分離的API接口。
可能出現這種情況——兩個服務爭奪服務器的CPU資源,無論哪一方失敗都將造成災難。如下圖所示,服務器的CPU資源已經被Java服務占滿。
在資源有限的前提下,同一時間無法同時滿足多個進程的過度使用。當然,在這種場景下可以通過獨立部署、為虛擬機設定資源優先級等方案解決。
但在 Docker中,這些完全沒有必要擔心,因為Docker提供了進程級的隔離,可以更加精細地設置CPU和內存的使用率,進而更好地利用服務器的資源。
在企業中,如果存在大促或流量不均的場景,則服務器的自動擴容/縮容就會很關鍵。
在流量低谷時進行自動縮容,可以大幅度減少服務器成本。
在峰值來臨時,通過服務器性能嗅探,可以預測到瓶頸即將來臨,自動觸發服務器擴容操作,從而保證服務器穩定運行。
這一切在傳統的虛擬機中顯得十分笨重,而在Docker中卻非常靈活并且高效,因為,每個容器都可作為單獨的進程運行,并且可以共享底層操作系統的系統資源。這樣可以提高容器的啟動和停止效率,擴容也就毫不費力了。
節省成本也是很多企業使用Docker的原因之一。傳統企業一般會使用虛擬機,虛擬機雖然可以隔離出很多“子系統”,但占用的空間更大,啟動更慢。
Docker技術不需要虛擬出整個操作系統,只需要虛擬出一個小規模的環境,與“沙箱”類似。
此外,虛擬機一般要占用很大的存儲空間(可以達到數十GB);而容器只需要占用很小的存儲空間(最小的僅為幾KB),這樣就能節省出更多的服務器資源,從根本上節省成本。
可以看出,Docker已經滲透到了日常開發的方方面面。那么究竟Docker的技術體系有多大,不妨一起來探究下。
02
Docker技術體系
(1)Docker架構
我們先從Docker技術體系展開,如下圖:
簡單說明下,架構主要包含這些部分:
Docker Client:開發者可以在命令行中使用Docker相關執行與Docker守護進程進行交互,從而管理諸如Image(鏡像)、Container(容器)、Network(網絡)和Data Volumes(數據卷)等實體。
Docker Server:
? Daemon:通過 Libcontainer、LXC 等容器管理工具來接收 Client 端的指令完成容器管理操作;
? Containerd:Docker 引擎中的 Containerd 組件確保了 Docker 鏡像能夠以正確的 OCI Bundle 的格式傳遞給 Runc;
? Runc:實質上是一個輕量級的、針對 Libcontainer 進行了包裝的命令行交互工具,可以理解為一個獨立的容器運行時工具。作用只有一個——創建容器。
Docker Driver:
?Execdrive:存儲了容器定義的配置信息了,Libcontainer 拿到這些配置信息后,將會調用底層的 Namespace 和 Cgroup 等技術來完成容器的創建和管理;
? Networkdirver:主要作用是完成 Docker 容器的網絡環境配置,包括容器的 IP 地址、端口、防火墻策略,以及與主機的端口映射等;
? Graphdriver:主要負責對容器鏡像的管理。
Linux Kernel:
? Chroot:即 change root directory (主要用來更改 root 目錄)。在 Linux 系統中,系統默認的目錄結構都是以 /,即以根 (root) 開始的。而在使用 Chroot 之后,系統的目錄結構將以指定的位置作為 / 位置;
? Namespace:是 Linux 內核用來隔離內核資源的方式,目的就是實現輕量級虛擬化(容器)服務,為 Docker 等容器技術提供了基礎條件;
? Cgroup:是 Linux 內核提供的一種可以限制單個進程或者多個進程所使用資源的機制,可以對 CPU、內存等資源實現精細化的控制,Docker 就使用了 Cgroup提供的資源限制能力來完成 CPU,內存等部分的資源控制;
? Network:為 Docker 容器提供多種網絡解決方案;
? Capability:Linux 引入了 Capabilities 機制對 root 權限進行細粒度的控制,實現按需授權,從而減小系統的安全攻擊面;
? Seccomp:即安全計算模式,可以使用它來限制容器內可用的操作。seccomp()系統調用在調用進程的seccomp狀態下運行。Docker 中使用此功能來限制應用程序的訪問;
? Filesystem:UnionFS 通過 Linux Filesystem 為容器提供高效的管理能力。Docker 的鏡像就采用了 UnionFS 技術,從而實現了分層的鏡像。
如果需要搭建“企業級容器化標準”,那么一定要對 Docker 周邊生態有足夠的了解,不妨一起從下圖中感受整個技術體系。
從生態圖中我們看到,Docker涉及到很多工具或平臺。
但萬變不離其宗,“企業容器化標準”可以歸納以下幾方面:
服務發現:Etcd、ZooKeeper、Consul、Eureka
負載均衡:Nginx、F5、LVS
網絡選型:Flannel、Calico、Weave、自研
存儲系統:PV/PVC聲明文件、StorageClass動態供給
部署發布:Jenkins、GitLab、Registry
服務監控:Zabbix、Nagios、cAdvisor、Prometheus
日志管理:兩種模式Daemonset集中式、Sidecar自定義,ELK
鏈路追蹤:Pinpoint、Jaeger 、SkyWalking、Zipkin
容器編排:Swarm、Kubernetes、Mesos
數據存儲:Redis、MySQL、MongoDB
彈性部署:手動擴容、自動擴容、定時擴容
集群可靠性:集群預留、資源預留、集群組件(API Server、Etcd集群方案、kube-scheduler與controller-manager)
基于上述理論,我們來看一個實際場景:
對上述流程圖簡單解釋一下:
通過 Docker 對代碼進行容器化處理;
通過 Gitlab 托管代碼;
Jenkins 監聽 Gitlab 下的代碼,觸發自動構建,并執行 Kustomize 文件;
Kustomize 通過配置文件,設置了 Istio 的配置(染色識別、流量分發),并啟動 K8s 部署應用;
最終我們通過 Rancher 來對多容器進行界面化管理;
打開瀏覽器進行訪問。
架構圖如下:
看到這里,相信讀者也猜到了,我們實現了一個“多容器化部署”的案例。它有什么意義呢?
首先,當然是環境隔離了,研發每人一個容器開發,互不干擾;
其次,我們可以做很多小流量、灰度發布等事情;
最后,低成本隔離,自動化部署,一站式的流程體驗;
Docker 技術體系相當龐大,這也就導致了很多新人望而生畏。因此,我整理了一套Docker學習體系,為讀者快速掌握提供幫助。
03
如何快速掌握
市場上不乏 Docker 技術相關的書籍,或圍繞官方基礎文檔缺乏新意,或直入源碼讓新人望而卻步。鮮有既滿足讀者入門需要,又結合企業實際案例的佳作。
《Docker實戰派:容器入門七步法》正是看到了這一點,另辟蹊徑,從讀者角度出發,首次提出了“七步法”的概念。
何謂“七步法”?七是人們最容易記住的數字,也是人類瞬間記憶的極限,本書正是立意于此。
第一步,從具象的故事開始,開門見山、降低認知門檻。
第二步,通過“第一個Docker 項目”,幫助讀者快速上手。在讀者建立起體系概念后;
第三步,直切核心原理,圍繞Docker 架構展開,由淺入深的講解了Docker 底層隔離機制、容器生命周期、網絡與通訊、存儲原理以及源碼。深入剖析,知其然而知其所以然。
第四步,趁熱打鐵,圍繞前后端項目,從全棧角度進行項目實戰。
第五步,從Docker容器運維角度出發,進一步補充讀者知識圖譜,這也是初學者最容易忽視的內容。
第六步,步入高級教程,該部分重點圍繞Docker 技術最佳實踐展開,提供了容器與進程、文件存儲與備份、網絡配置、鏡像優化以及安全策略等內容,示例豐富,操作性十足。
第七步,全書內容升華。通過云原生持續交付模型、企業容器標準化及兩個實際的企業級方案,將本書所有內容進行串聯。
至此,七步完成。讀者可以清晰的感受每一步帶來的技術提升,穩扎穩打,從而完全將 Docker 技術融會貫通。
本書特色
《Docker實戰派——容器入門七步法》最大的亮點如下。
(1) 趣味易懂。
書中較多的原理,剝除了Docker 官方文檔晦澀難懂的外衣,通過趣味的故事展開。如:
通過“蓋房子”的比方來理解Docker 是什么;
通過“別墅與膠囊旅館”的例子來闡述容器與虛擬機的概念;
通過“工廠和車間”來說明進程和線程等。
讀者無須記憶就可輕松理解,這也正是本書想要傳達的觀點:并非技術晦澀難懂,而是缺乏技巧。
(2) 案例豐富。
本書第2、4、5、6、7章都包含大量的示例。不管是“第一個 Docker 項目”還是項目實戰,或者是“企業案例”都包含了大量的代碼講解。
讀者完全可以按照教程逐步實現,體驗Docker 編程的樂趣。
(3) 實操性強。
值得一提的是,本書中案例均來自于實際的研發過程,為了讓讀者能夠輕松掌握,去除了容器中包含的業務邏輯,保留了Docker 容器最核心的架構,實操性強。
熟練掌握書中的精彩案例,沉淀其所表現出來的方法論,相信讀者一定能夠在企業應用中靈活運用,事半功倍。
Docker 容器化并不是一個單點的技術,反而涉及工程化以及運維體系的方方面面。因此,特邀請李傳龍、盧桂周兩位行業大佬通力合作,讓本書在該領域更具專業性。而做這一切的目的,就是為讀者提供舒適的閱讀體驗和清晰明了的入門之旅。
也許你暫時不會接觸 Docker 容器化技術,但《Docker實戰派:容器入門七步法》卻值得擁有。因為它能為你指明方向:技術入門,七步可成!
掃碼查看本書詳情!
敲黑板!本次民工哥技術之路公眾號聯合電子工業博文視點為大家帶來贈書福利,拼手氣的時候到了,看看誰才是錦鯉?
點我參與技術書籍抽獎!
規則:
1、民工哥技術之路公眾號讀者專屬(同一用戶近期多次中獎無效(發現作弊行為永久拉黑)!請把機會留給其他人),中獎需于 8小時內主動聯系小編發送收貨信息,逾期則視為自動放棄。
Docker 容器
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。