你好,我是 legendtkl,目前就職于某 BAT 大廠,任職技術專家,具有豐富的后端開發經驗,包括 Docker、Kubernetes、Web 開發和大數據等。
首先感謝大家來學習這門專欄,在本專欄中,我將會為大家深入淺出地剖析 Docker 技術及其最佳實踐并分享我在使用 Docker 的時候所踩的一些坑。
眾所周知,Docker 是使用 Go 語言編寫的,我從畢業之初就開始關注和使用 Go 語言,那時候 Go 語言的明星項目還比較少,Docker 算是其中一個比較耀眼的項目。
于是,我抱著學習的態度,把 Docker 的源代碼擼了一遍,也算是把 Docker 技術入了門。再到后來我注意到 Kubernetes 日益火熱起來,于是我又開始投入精力學習 Kubernetes。
這樣的學習一直持續到了 2016 年,彼時,Docker 作為云計算的基礎設施逐漸進入大眾視野,隨后被譽為云上操作系統的 Kubernetes 也開始逐漸嶄露頭角。
作為國內云計算市場的領頭羊,我所在的部門也開始大量引入 Docker 和 Kubernetes 技術棧,由于我之前一直在儲備這方面的技術知識,正好匹配部門當前的需求,于是開始在部門內脫穎而出。同時也印證了那句:“機會從來都是留給有準備的人”。
另外我在部門容器化轉型過程中通過不斷的學習和總結積累了非常寶貴的一手經驗,希望可以通過本專欄介紹給大家。
1. 為什么要學習 Docker
Docker 已經變成基礎設施
目前的技術水平已經真正的進入了云計算時代,各大基礎設施紛紛上云。阿里已經在去年雙十一將所有業務都遷移到了云上。而云的基礎設施就是 Docker,準確的說是容器,而 Docker 正是當下最主流的容器技術。
之所以說 Docker 是基礎設施,是因為 Docker 的資源限制和隔離性是云上必不可少的特性。相比于之前每個部門的應用申請一堆物理機來部署自己的應用進程,使用云計算的方式來統一管理公司所有的應用使得資源的使用率更加的高。
那么這么多的應用部署到一起就需要解決三個主要問題:應用隔離、應用部署和資源限制。
應用隔離
很容易理解,比如不同的應用依賴了沖突的基礎軟件包,如果都直接部署在操作系統環境下,必然會引起沖突。這個時候就需要應用之間互相隔離。Docker 使用操作系統底層的 Namespace 技術來做隔離是一種主流的技術方案。
應用部署
在容器技術誕生之前,所有的應用都是直接部署在操作系統上面的,彼此之間共享底層的操作系統資源,比如內存、CPU、磁盤等。
打個比方,如果我們要將應用 A 和應用 B 部署到同一臺機器上,那么這兩個應用需要的環境信息,我們都需要滿足。如果應用 A 和 B 的環境依賴之間存在沖突,或者說不兼容,那么管理起來就會非常的困難。
而這個問題,我們通過容器的鏡像技術卻可以非常簡單地解決掉。除此之后,Docker 技術還有很多相比于傳統技術更加優勢的地方,這也 Docker 技術能夠迅猛發展起來的根本原因。
資源限制
不同的應用共享集群不可避免的涉及到資源使用限制的問題。比如一個公司同時有多個業務部門使用一個統一的集群,在統計研發成本時,需要統計各個部門的資源使用情況然后做劃分。這樣我們就可以根據資源使用限制來劃分,當某些應用資源使用超限就殺掉應用。Docker 使用內核提供的 Cgroup 技術來做資源限制正好可以應用到這個場景。
Docker 技術學習方法
這幾年為團隊面試過很多同學,發現很多候選人對于 Docker 的技術理解都浮于表面,知道 Docker 如何使用,但是一旦涉及到底層技術原理就不清楚了。
有一些同學可能會有疑問,工作中更多的還是使用,真的有必要了解底層原理嗎?日常使用可能沒有問題,但是一旦出現疑難雜癥,如果不了解 Docker 的底層知識,Docker 對于我們就是一個黑盒,對于排查問題是很不利的。
造成上面這種現象的主要原因是大部分的候選人都沒有系統地進行學習,而是在日常工作中遇到技術問題去專項解決,或者網上搜索一些各種博主的文章。而網上的文章大部分都是轉載來轉載去,有一些知識點還是錯的,我之前有一篇文章就被反復轉載,而里面一個知識點是老版本中的實現,新版本中的實現早就變了。
而這篇專欄正是要解決上面這個問題的,為大家提供一個系統地,全面地學習教程。
2. Kuberneters
前面介紹了 Docker 技術的一些理論知識和最佳實踐,但是正如前面所說,Docker 技術從來都不是一個孤立的技術。Docker 更多的還是作為一種技術基石,基于 Docker 我們還需要做一些包括容器編排管理等工作。
說到容器編排和集群管理系統,從早期的 docker-compose 到 swarm,可以說是諸侯林立。但是自從 Kubernetes 出現后慢慢的出現了大一統的趨勢,憑借著 Google 內部早期積累的經驗和優秀的云原生設計理念,Kubernetes 可以說是一騎絕塵,目前已經全面占領了云端統一管理的地位。
而在本專欄中,我也給大家設計了“Kubernetes 的核心技術精講和最佳實踐”環節,幫助大家快速掌握 Kubernetes 這一獨領風騷的容器編排和集群管理系統。
3. 你可以收獲什么
通過本課程你可以學習到 Docker 和 Kubernetes 的基礎知識和核心原理以及最佳實踐。
最重要的是授人以漁。本專欄的文章組織形式都是一種學習思路的再現,比如提出問題,嘗試解決問題,理解問題背后的原理。
我覺得這也是一種比較好的學習方式,問題驅動式的學習方式能夠幫助我們不僅知其然、而且知其所以然。更重要的是通過這種方式習得的知識要比填鴨式的照本宣科顯得更加的牢靠。
4. 課程組織
為了能讓你更快的掌握 Docker 和 Kubernetes 的基礎知識和核心原理,同時也照顧一下那些沒有基礎的同學,我將專欄內容作了如下安排“
本專欄圍繞 Docker 和 Kuberneters 核心技術展開,共劃分為 5 部分 47 個小節。
第一章: Docker 基礎
本部分內容會介紹 Docker 的一些背景和基礎知識,簡單概括,包括如下部分:
- Docker 容器的發展之路。介紹 Docker 技術如何從一個不起眼的技術逐步發展壯大并最終引領了一場 PaaS 革命的;
- Docker 安裝與運行。介紹 Docker 的基本操作,包括不同平臺的安裝和運行;
- Docker 技術概覽。這篇文章會介紹 Docker 的基本使用情況,讓大家對 Docker 技術有一個總體的概覽;
- Docker 鏡像技術。介紹 Docker 的鏡像技術。Docker 的鏡像技術是 Docker 技術中非常重要的一環,Docker 正是靠著鏡像技術改變了當年如火如荼的 PaaS 格局;
- 其他:包括 Docker 常用的鏡像等;
- 動手實踐:在這個環節,我們將動手實踐構建出第一個屬于我們自己的 Docker 應用。有句話說的好,“紙上得來終覺淺,絕知此事要躬行”。只有真正動手實踐才能更加深刻的理解內部原理。
第二章: Docker 核心技術
在第一部分,我們主要介紹一些 Docker 的基礎技術,在這個部分我們將帶領大家更加深入地理解 Docker 的核心技術。包括如下部分:
- Docker 隔離技術的本質 Namespace 深入解析:從內核層面介紹 Docker 的隔離的本質 Namespace 技術;
- Docker 資源限制技術的幕后主使 Cgroup 剖析:從操作系統角度介紹 Cgroup 技術;
- Docker 鏡像深入理解,主要介紹 Docker 鏡像的組織形式,包括聯合文件系統掛載等。
- Docker 的本質,Docker 的本質其實就是進程;
- Docker 鏡像構建,介紹 Dockerfile 的使用;
- Docker 網絡相關:介紹 Docker 的網絡的基本原理和幾種模式,以及 Docker 中 link 的實現原理;
- Docker 數據存儲相關:主要包括 Docker 的數據卷和數據共享相關。
第三章: Docker 最佳實踐
前面兩部分介紹完了理論部分,第三章主要介紹 Docker 最佳實踐:
- Dockerfile 最佳編程實踐:詳細介紹 Dockerfile 編寫中的各種指令的使用場景和最佳實踐;
- 如何構建最小鏡像最佳實踐:鏡像構建作為應用打包部署中非常關鍵的一環,這篇文章將介紹如何使得構建出來的鏡像盡量的??;
- 其他 Docker 使用中的最佳實踐,比如如何使用 tag 等;
- 我們容器化的時候為什么要保持 Docker 是個單進程模型:相信大家都聽過這句話 “Docker 是個單進程模型”,那么為什么這么說呢?本篇文章將從操作系統層面進行分析;
- 容器設計模式:介紹當前基于容器構建分布式應用程序幾種典型的設計模式;
- Docker 監控方案最佳實踐:這篇文章將介紹 Docker 的監控最佳實踐;
- 從 0 到 1 構建一個分布式高可用的 Web 應用。
第四章: 云原生容器技術Kubernetes
前面介紹了 Docker 技術的一些理論知識和最佳實踐,但是正如前面所說,Docker 技術從來都不是一個孤立的技術。Docker 更多的還是作為一種技術基石,基于 Docker 我們還需要做一些包括容器編排管理等工作。
說到容器編排和集群管理系統,從早期的 docker-compose 到 swarm,再到最近兩年的 Kubernetes,終于出現了大一統的趨勢,也就是 Kubernetes。Kubernetes 憑借著 Google 內部早期積累的經驗和優秀的云原生設計理念,一騎絕塵。在 2018 年全面推廣開來,目前已經全面占領了云端統一管理的地位。我們這一章就是要介紹 Kubernetes 相關的技術知識,包括:
- 云原生和 Kubernetes 簡介;
- Kubernetes 集群資源隔離介紹:Namespace;
- Kubernetes 核心設計 Pod 的解析;
- 配置管理 ConfigMap 和 Secret;
- 容器化守護進程 DaemonSet;
- Kubernetes 的控制器模式介紹;
- Kubernetes 的典型控制器 ReplicaSet、ReplicaController 和 Deployment 介紹;
- 批處理:Job 和 CronJob 介紹;
- 實踐部分:通過 Kubernetes 來構建我們的容器化應用。
第五章: 云原生監控方案
目前 Prometheus 已經成為云原生監控方案的事實標準,最后一章我們將介紹 Prometheus 的一些知識,包括:
- Prometheus 簡介:包括定位等;
- Prometheus 架構解析;
- 通過 Prometheus 監控容器。
最后,大家在學習過程中有任何問題都可以在專欄的評論區進行留言,我會統一進行回復。