《天天5分鐘玩轉Docker容器技術》是一個有關容器技術的教程,有下面兩個特色:java
簡單回答是:容器技術很是熱門,但門檻高。docker
容器技術是繼大數據和雲計算以後又一煊赫一時的技術,並且將來至關一段時間內都會很是流行。ubuntu
對 IT 行業來講,這是一項很是有價值的技術。而對 IT 從業者來講,掌握容器技術是市場的須要,也是提高自我價值的重要途徑。瀏覽器
拿我本身的工做經從來說,畢業後的頭幾年是作 J2EE 應用開發。後來到一家大型IT公司,公司的產品從中間件到操做系統、從服務器到存儲、從虛擬化到雲計算都有涉及。安全
我所在的部門是專門作 IT 基礎設施實施服務的,最開始是作傳統的 IT 項目,包括服務器配置,雙機 HA 等。隨着虛擬化技術成熟,工做上也開始涉及各類虛擬化技術的規劃和實施,包括 VMWare、KVM、PowerVM等。後來雲計算興起,在公司業務和我的興趣的驅動下,開始學習和實踐 OpenStack,在這個過程當中寫了《天天5分鐘玩轉OpenStack》教程並獲得你們的承認。服務器
如今以 Docker 爲表明的容器技術來了,並且關注度愈來愈高,這一點能夠從 Google Trend 中 Docker 的搜索上升趨勢(藍色曲線)中清楚看到。微信
每一輪新技術的興起,不管對公司仍是我的既是機會也是挑戰。網絡
我我的的見解是:若是某項新技術將來將成爲主流,就應該及早儘快掌握。
由於:架構
機會講過了,我們再來看看挑戰。app
新技術每每意味着技術上的突破和創新,會有很多新的概念和方法。
並且從大數據,雲計算和容器技術來看,這些新技術都是平臺級別,覆蓋的技術範圍很是廣,包括了計算、網絡、存儲、高可用、監控、安全等多個方面,要掌握這些新技術對 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)每週 一、三、5 按期分享。歡迎你們經過公衆號提出問題和建議,進行技術交流。
爲了下降學習的難度而且考慮到移動端碎片化閱讀的特色,每次推送的內容你們只須要花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 和操做系統,咱們的選擇以下:
本節咱們將在 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
環境就緒,立刻運行第一個容器,執行命令:
其過程能夠簡單的描述爲:
下面咱們能夠經過瀏覽器驗證容器是否正常工做。在瀏覽器中輸入 http://[your ubuntu host IP]
能夠訪問容器的 http 服務了,第一個容器運行成功!咱們輕輕鬆鬆就擁有了一個 WEB 服務器。隨着學習的深刻,會看到容器技術帶給咱們更多的價值。
咱們已經完成了教程的第一部分。
咱們認識了容器生態系統,後面會陸續學習生態系統中的大部分技術。咱們在 Ubuntu 16.04 上配置好了實驗環境,併成功運行了第一個容器 httpd。
容器大門已經打開,讓咱們去探祕吧。