寫在最前面
《每天5分鐘玩轉Docker容器技術》是一個有關容器技術的教程,有下面兩個特點:
- 系統講解當前最流行的容器技術
從容器的整個生態環境到各種具體的技術,從整體到細節逐一討論。 - 重實踐併兼顧理論
從實際操作的角度帶領大家學習容器技術。
為什麼要寫這個
簡單回答是:容器技術非常熱門,但門檻高。
容器技術是繼大資料和雲端計算之後又一炙手可熱的技術,而且未來相當一段時間內都會非常流行。
對 IT 行業來說,這是一項非常有價值的技術。而對 IT 從業者來說,掌握容器技術是市場的需要,也是提升自我價值的重要途徑。
拿我自己的工作經歷來說,畢業後的頭幾年是做 J2EE 應用開發。後來到一家大型IT公司,公司的產品從中介軟體到作業系統、從伺服器到儲存、從虛擬化到雲端計算都有涉及。
我所在的部門是專門做 IT 基礎設施實施服務的,最開始是做傳統的 IT 專案,包括伺服器配置,雙機 HA 等。隨著虛擬化技術成熟,工作上也開始涉及各種虛擬化技術的規劃和實施,包括 VMWare、KVM、PowerVM等。後來雲端計算興起,在公司業務和個人興趣的驅動下,開始學習和實踐 OpenStack,在這個過程中寫了《每天5分鐘玩轉OpenStack》教程並得到大家的認可。
現在以 Docker 為代表的容器技術來了,而且關注度越來越高,這一點可以從 Google Trend 中 Docker 的搜尋上升趨勢(藍色曲線)中清楚看到。
每一輪新技術的興起,無論對公司還是個人既是機會也是挑戰。
我個人的看法是:如果某項新技術未來將成為主流,就應該及早儘快掌握。
因為:
- 新技術意味著新的市場和新的需求
初期掌握這種技術的人不會很多,而市場需求會越來越大,因而會形成供不應求的賣方市場,物以稀為貴,這對技術人員將是一個難得的價值提升機會。 - 學習新技術需要時間和精力,早起步早成材
機會講過了,我們們再來看看挑戰。
新技術往往意味著技術上的突破和創新,會有不少新的概念和方法。
而且從大資料,雲端計算和容器技術來看,這些新技術都是平臺級別,覆蓋的技術範圍非常廣,包括了計算、網路、儲存、高可用、監控、安全等多個方面,要掌握這些新技術對 IT 老兵尚有不小難度,更別說新人了。
由於對技術一直保持著很高的熱誠和執著,在掌握了 OpenStack 相關 IaaS 技術後,我便開始調研 PaaS 技術棧。正好這時 Docker 也越來越流行,自然而然便開始了容器相關技術的學習研究和實踐。
學習容器技術的過程可以說是驚喜不斷,經常驚歎於容器理念的先進和容器生態環境的完整和強大。很多傳統軟體開發和運維中的難題在容器世界裡都能輕鬆解決,也漸漸理解了容器為何如此受到青睞。
不誇張地說,容器為我開啟了一扇通往另一個軟體世界的大門,讓我沉浸其中,激動不已。高興之餘,我也迫不及待地想把我所看到所學到和所想到的有關容器的知識介紹給更多的人,讓更多的IT工程師能夠從容器技術中受益。
我希望這個教程也能為大家開啟這扇門,降低學習的曲線,系統地學習和掌握容器技術。
寫給誰看?
這套教程的目標讀者包括:
軟體開發人員
相信微服務架構(Microservice Architectur)會逐漸成為開發應用系統的主流。而容器則是這種架構的基石。市場將需要更多能夠開發出基於容器的應用程式的軟體開發人員。
IT 實施和運維工程師
容器為應用提供了更好的打包和部署方式。越來越多的應用將以容器的方式在開發、測試和生產環境中執行。掌握容器相關技術將成為實施和運維工程師的核心競爭力。
我自己
我堅信最好的學習方法是分享。編寫這個教程同時也是對自己學習和實踐容器技術的總結。對於知識,只有把它寫出來並能夠讓其他人理解,才能說明真正掌握了這項知識。
包含哪些內容?
本系列教程分為《每天5分鐘玩轉Docker容器技術》和《每天5分鐘玩轉Docker容器平臺》兩本,包括以下三大塊內容:
下面分別介紹各部分包含的內容。
啟程
“啟程”會介紹容器的生態系統,讓大家先從整體上了解容器都包含哪些技術,各種技術之間的相互關係是什麼,然後再來看我們的教程都會涉及生態中的哪些部分。
為了讓大家儘快對容器有個感性認識,我們會搭建實驗環境並執行第一個容器,為之後的學習熱身。
容器技術
這是教程的主要內容,包含“容器核心知識”和“容器進階知識”兩部分。
核心知識主要回答有關容器 what, why 和 how 三方面的問題。 其中以 how 為重,將展開討論架構、映象、容器、網路和儲存。
進階知識包括將容器真正用於生產所必需的技術,包括多主機管理、跨主機網路、監控、資料管理、日誌管理和安全管理。
這部分內容將在本書《每天5分鐘玩轉Docker容器技術》中詳細討論。
容器平臺技術
如下圖所示,“容器平臺技術”包括容器編排引擎、容器管理平臺和基於容器的 PaaS。容器平臺技術在生態環境中佔據著舉足輕重的位置,對於容器是否能夠落地,是否能應用於生產至關重要。
我們將在本系列教程的另一本書《每天5分鐘玩轉Docker容器平臺》中詳細討論容器編排引擎、容器管理平臺和基於容器的 PaaS,學習和實踐業界最具代表性的開源產品。
怎樣的編寫方式?
我會繼續採用《每天5分鐘玩轉OpenStack》的方式,通過大量的實驗由淺入深地探討和實踐容器技術,力求達到如下目標:
- 快速上手:以最直接、最有效的方式讓大家把容器用起來。
- 循序漸進:由易到難,從淺入深,詳細分析容器的各種功能和配置使用方法。
- 理解架構:從設計原理和架構分析入手,深入探討容器的架構和執行機理。
- 注重實踐:以大量實際操作案例為基礎,讓大家能夠掌握真正的實施技能。
在內容的釋出上還是通過微信公眾號(cloudman6)每週 1、3、5 定期分享。歡迎大家通過公眾號提出問題和建議,進行技術交流。
為什麼叫《每天5分鐘玩轉Docker容器技術》?
為了降低學習的難度並且考慮到移動端碎片化閱讀的特點,每次推送的內容大家只需要花5分鐘就能看完(注意這裡說的是看完,有時候要完全理解可能需要更多時間哈),每篇內容包含1-3個知識點,這就是我把教程命名為《每天5分鐘玩轉Docker容器技術》的原因。雖然是碎片化推送,但整個教程是系統、連貫和完整的,只是化整為零了。
好了,今天這5分鐘算是開了個頭,下次我們正式開始玩轉容器技術。
容器生態系統
對於像容器這類平臺級別的技術,通常涉及的知識範圍會很廣,相關的軟體,解決方案也會很多,初學者往往容易迷失。
那怎麼辦呢?
我們可以從生活經驗中尋找答案。
當我們去陌生城市旅遊想了解一下這個城市一般我們會怎麼做?
我想大部分人應該會開啟手機看一下這個城市的地圖:
- 城市大概的位置和地理形狀是什麼?
- 都由哪幾個區或縣組成?
- 主要的交通幹道是哪幾條?
同樣的道理,學習容器技術我們可以先從天上鳥瞰一下:
- 容器生態系統包含哪些不同層次的技術?
- 不同技術之間是什麼關係?
- 哪些是核心技術哪些是輔助技術?
首先得對容器技術有個整體認識,之後我們的學習才能夠有的放矢,才能夠分清輕重緩急,做到心中有數,這樣就不容易迷失了。
接下來我會根據自己的經驗幫大家規劃一條學習路線,一起探索容器生態系統。
學習新技術得到及時反饋是非常重要的,所以我們馬上會搭建實驗環境,並執行第一個容器,感受什麼是容器。
千里之行始於足下,讓我們從瞭解生態系統開始吧。
鳥瞰容器生態系統
容器生態系統
一談到容器,大家都會想到 Docker。
Docker 現在幾乎是容器的代名詞。確實,是 Docker 將容器技術發揚光大。同時,大家也需要知道圍繞 Docker 還有一個生態系統。Docker 是這個生態系統的基石,但完善的生態系統才是保障 Docker 以及容器技術能夠真正健康發展的決定因素。
大致來看,容器生態系統包含核心技術、平臺技術和支援技術。
下面分別介紹。
容器核心技術
容器核心技術是指能夠讓 container 在 host 上執行起來的那些技術。
這些技術包括容器規範、容器 runtime、容器管理工具、容器定義工具、Registry 以及 容器 OS,下面分別介紹。
容器規範
容器不光是 Docker,還有其他容器,比如 CoreOS 的 rkt。為了保證容器生態的健康發展,保證不同容器之間能夠相容,包含 Docker、CoreOS、Google在內的若干公司共同成立了一個叫 Open Container Initiative(OCI) 的組織,其目是制定開放的容器規範。
目前 OCI 釋出了兩個規範:runtime spec 和 image format spec。
有了這兩個規範,不同組織和廠商開發的容器能夠在不同的 runtime 上執行。這樣就保證了容器的可移植性和互操作性。
容器 runtime
runtime 是容器真正執行的地方。runtime 需要跟作業系統 kernel 緊密協作,為容器提供執行環境。
如果大家用過 Java,可以這樣來理解 runtime 與容器的關係:
Java 程式就好比是容器,JVM 則好比是 runtime。JVM 為 Java 程式提供執行環境。同樣的道理,容器只有在 runtime 中才能執行。
lxc、runc 和 rkt 是目前主流的三種容器 runtime。
lxc 是 Linux 上老牌的容器 runtime。Docker 最初也是用 lxc 作為 runtime。
runc 是 Docker 自己開發的容器 runtime,符合 oci 規範,也是現在 Docker 的預設 runtime。
rkt 是 CoreOS 開發的容器 runtime,符合 oci 規範,因而能夠執行 Docker 的容器。
容器管理工具
光有 runtime 還不夠,使用者得有工具來管理容器啊。容器管理工具對內與 runtime 互動,對外為使用者提供 interface,比如 CLI。這就好比除了 JVM,還得提供 java
命令讓使用者能夠啟停應用不是。
lxd 是 lxc 對應的管理工具。
runc 的管理工具是 docker engine。docker engine 包含後臺 deamon 和 cli 兩個部分。我們通常提到 Docker,一般就是指的 docker engine。
rkt 的管理工具是 rkt cli。
容器定義工具
容器定義工具允許使用者定義容器的內容和屬性,這樣容器就能夠被儲存,共享和重建。
docker image 是 docker 容器的模板,runtime 依據 docker image 建立容器。
dockerfile 是包含若干命令的文字檔案,可以通過這些命令建立出 docker image。
ACI (App Container Image) 與 docker image 類似,只不過它是由 CoreOS 開發的 rkt 容器的 image 格式。
Registry
容器是通過 image 建立的,需要有一個倉庫來統一存放 image,這個倉庫就叫做 Registry。
企業可以用 Docker Registry 構建私有的 Registry。
Docker Hub(https://hub.docker.com) 是 Docker 為公眾提供的託管 Registry,上面有很多現成的 image,為 Docker 使用者提供了極大的便利。
http://Quay.io(https://quay.io/)是另一個公共託管 Registry,提供與 Docker Hub 類似的服務。
容器 OS
由於有容器 runtime,幾乎所有的 Linux、MAC OS 和 Windows 都可以執行容器。但這不併沒有妨礙容器 OS 的問世。
容器 OS 是專門執行容器的作業系統。與常規 OS 相比,容器 OS 通常體積更小,啟動更快。因為是為容器定製的 OS,通常它們執行容器的效率會更高。
目前已經存在不少容器 OS,CoreOS、atomic 和 ubuntu core 是其中的傑出代表。
容器平臺技術
容器核心技術使得容器能夠在單個 host 上執行。而容器平臺技術能夠讓容器作為叢集在分散式環境中執行。
容器平臺技術包括容器編排引擎、容器管理平臺和基於容器的 PaaS。
容器編排引擎
基於容器的應用一般會採用微服務架構。在這種架構下,應用被劃分為不同的元件,並以服務的形式執行在各自的容器中,通過 API 對外提供服務。為了保證應用的高可用,每個元件都可能會執行多個相同的容器。這些容器會組成叢集,叢集中的容器會根據業務需要被動態地建立、遷移和銷燬。
大家可以看到,這樣一個基於微服務架構的應用系統實際上是一個動態的可伸縮的系統。這對我們的部署環境提出了新的要求,我們需要有一種高效的方法來管理容器叢集。而這,就是容器編排引擎要乾的工作。
所謂編排(orchestration),通常包括容器管理、排程、叢集定義和服務發現等。通過容器編排引擎,容器被有機的組合成微服務應用,實現業務需求。
docker swarm 是 Docker 開發的容器編排引擎。
kubernetes 是 Google 領導開發的開源容器編排引擎,同時支援 Docker 和 CoreOS 容器。
mesos 是一個通用的叢集資源排程平臺,mesos 與 marathon 一起提供容器編排引擎功能。
以上三者是當前主流的容器編排引擎。
容器管理平臺
容器管理平臺是架構在容器編排引擎之上的一個更為通用的平臺。通常容器管理平臺能夠支援多種編排引擎,抽象了編排引擎的底層實現細節,為使用者提供更方便的功能,比如 application catalog 和一鍵應用部署等。
Rancher 和 ContainerShip 是容器管理平臺的典型代表。
基於容器的 PaaS
基於容器的 PaaS 為微服務應用開發人員和公司提供了開發、部署和管理應用的平臺,使使用者不必關心底層基礎設施而專注於應用的開發。
Deis、Flynn 和 Dokku 都是開源容器 PaaS 的代表。
容器支援技術
下面這些技術被用於支援基於容器的基礎設施。
容器網路
容器的出現使網路拓撲變得更加動態和複雜。使用者需要專門的解決方案來管理容器與容器,容器與其他實體之間的連通性和隔離性。
docker network 是 Docker 原生的網路解決方案。除此之外,我們還可以採用第三方開源解決方案,例如 flannel、weave 和 calico。不同方案的設計和實現方式不同,各有優勢和特點,需要根據實際需要來選型。
服務發現
動態變化是微服務應用的一大特點。當負載增加時,叢集會自動建立新的容器;負載減小,多餘的容器會被銷燬。容器也會根據 host 的資源使用情況在不同 host 中遷移,容器的 IP 和埠也會隨之發生變化。
在這種動態的環境下,必須要有一種機制讓 client 能夠知道如何訪問容器提供的服務。這就是服務發現技術要完成的工作。
服務發現會儲存容器叢集中所有微服務最新的資訊,比如 IP 和埠,並對外提供 API,提供服務查詢功能。
etcd、consul 和 zookeeper 是服務發現的典型解決方案。
監控
監控對於基礎架構非常重要,而容器的動態特徵對監控提出更多挑戰。針對容器環境,已經湧現出很多監控工具和方案。
docker ps/top/stats 是 Docker 原生的命令列監控工具。除了命令列,Docker 也提供了 stats API,使用者可以通過 HTTP 請求獲取容器的狀態資訊。
sysdig、cAdvisor/Heapster 和 Weave Scope 是其他開源的容器監控方案。
資料管理
容器經常會在不同的 host 之間遷移,如何保證持久化資料也能夠動態遷移,是 Rex-Ray 這類資料管理工具提供的能力。
日誌管理
日誌為問題排查和事件管理提供了重要依據。
docker logs 是 Docker 原生的日誌工具。而 logspout 對日誌提供了路由功能,它可以收集不同容器的日誌並轉發給其他工具進行後處理。
安全性
對於年輕的容器,安全性一直是業界爭論的焦點。
OpenSCAP 能夠對容器映象進行掃描,發現潛在的漏洞。
本教程覆蓋的知識範圍
前面我們已經鳥瞰了整個容器生態系統,對容器所涉及的技術體系有了全面的認識。那我們的系列教程會討論其中的哪些內容呢?
會覆蓋容器生態系統 91.6% 的技術!
執行第一個容器
為了讓大家對容器有個感性認識,我們將盡快讓一個容器執行起來。首先我們需要搭建實驗環境。
環境選擇
容器需要管理工具、runtime 和作業系統,我們的選擇如下:
- 管理工具 - Docker Engine
因為 Docker 最流行使用最廣泛。 - runtime - runc
Docker 的預設 runtime - 作業系統 - Ubuntu
雖然存在諸如 CoreOS 的容器 OS,因考慮到我們目前處於初學階段,選擇大家熟悉的作業系統更為合適。等具備了紮實的容器基礎知識後再使用容器 OS 會更有利。
安裝 Docker
本節我們將在 ubuntu 16.04 虛擬機器中安裝 Docker。因為安裝過程需要訪問 internet, 所以虛擬機器必須能夠上網。
Docker 支援幾乎所有的 Linux 發行版,也支援 Mac 和 Windows。各作業系統的安裝方法可以訪問:https://docs.docker.com/engine/installation/
Docker 分為開源免費的 CE(Community Edition)版本和收費的 EE(Enterprise Edition)版本。下面我們將按照文件,通過以下步驟在 Ubuntu 16.04 上安裝 Docker CE 版本。
配置 Docker 的 apt 源
1.安裝包,允許 apt
命令 HTTPS 訪問 Docker 源。
2.新增 Docker 官方的 GPG key
3.將 Docker 的源新增到 /etc/apt/sources.list
安裝 Docker
執行第一個容器
環境就緒,馬上執行第一個容器,執行命令:
其過程可以簡單的描述為:
- 從 Docker Hub 下載 httpd 映象。映象中已經安裝好了 Apache HTTP Server。
- 啟動 httpd 容器,並將容器的 80 埠對映到 host 的 80 埠。
下面我們可以通過瀏覽器驗證容器是否正常工作。在瀏覽器中輸入 http://[your ubuntu host IP]
可以訪問容器的 http 服務了,第一個容器執行成功!我們輕輕鬆鬆就擁有了一個 WEB 伺服器。隨著學習的深入,會看到容器技術帶給我們更多的價值。
小結
我們已經完成了教程的第一部分。
我們認識了容器生態系統,後面會陸續學習生態系統中的大部分技術。我們在 Ubuntu 16.04 上配置好了實驗環境,併成功執行了第一個容器 httpd。
容器大門已經開啟,讓我們去探祕吧。