Docker和容器技術是當下*火的IT技術,無論是互聯網還是傳統企業都在研究和實踐如何用容器構建自己的 IT 基礎設施。學習本書能夠讓讀者少走彎路,系統地學習、掌握和實踐 Docker 和容器技術。
本書共分為三部分。*部分介紹容器技術生態環境。第二部分是容器核心知識,包括架構、鏡像、容器、網絡和存儲。第三部分是容器進階知識,包括多主機管理、跨主機網絡方案、監控、日志管理和數據管理。讀者在學習的過程中,可以跟著教程進行操作,在實踐中掌握 Docker 容器技術的核心技能。在之后的工作中,可以將本教程作為參考書,按需查找相關知識點。
本書主要面向微服務軟件開發人員,以及 IT 實施和運維工程師等相關人員,也適合高等院校和培訓學校相關專業的師生教學參考。
容器技術是繼大數據和云計算之后又一炙手可熱的技術,而且未來相當一段時間內都會非常流行對 IT 從業者來說,掌握容器技術是市場的需要,也是提升自我價值的重要途徑每一輪新技術的興起,無論對公司還是個人既是機會也是挑戰
前 言
寫在最前面
《每天5分鐘玩轉Docker容器技術》是一個有關容器技術的教程,有下面兩個特點:
1. 系統講解當前最流行的容器技術
從容器的整個生態環境到各種具體的技術,從整體到細節逐一討論。
2. 重實踐并兼顧理論
從實際操作的角度帶領大家學習容器技術。
為什么要寫這個
簡單回答是:容器技術非常熱門,但門檻高。
容器技術是繼大數據和云計算之后又一炙手可熱的技術,而且未來相當一段時間內都會非常流行。
對 IT 行業來說,這是一項非常有價值的技術。而對 IT 從業者來說,掌握容器技術是市場的需要,也是提升自我價值的重要途徑。
拿我自己的工作經歷來說,畢業后的頭幾年是做 J2EE 應用開發。后來到一家大型IT公司,公司的產品從中間件到操作系統、從服務器到存儲、從虛擬化到云計算都有涉及。
我所在的部門是專門做 IT 基礎設施實施服務的,最開始是做傳統的 IT 項目,包括服務器配置,雙機 HA 等。隨著虛擬化技術成熟,工作上也開始涉及各種虛擬化技術的規劃和實施,包括 VMWare、KVM、PowerVM等。后來云計算興起,在公司業務和個人興趣的驅動下,開始學習和實踐 OpenStack,在這個過程中寫了《每天5分鐘玩轉OpenStack》教程并得到大家的認可。
現在以 Docker 為代表的容器技術來了,而且關注度越來越高,這一點可以從 Google Trend 中 Docker 的搜索上升趨勢中清楚看到,如下圖所示(圖中曲線上揚最高的為Docker)。
每一輪新技術的興起,無論對公司還是個人既是機會也是挑戰。
我個人的看法是:如果某項新技術未來將成為主流,就應該及早盡快掌握。
因為:
1. 新技術意味著新的市場和新的需求
初期掌握這種技術的人不會很多,而市場需求會越來越大,因而會形成供不應求的賣方市場,物以稀為貴,這對技術人員將是一個難得的價值提升機會。
2. 學習新技術需要時間和精力,早起步早成材
機會講過了,咱們再來看看挑戰。
新技術往往意味著技術上的突破和創新,會有不少新的概念和方法,而且從大數據、云計算和容器技術來看,這些新技術都是平臺級別,覆蓋的技術范圍非常廣,包括計算、網絡、存儲、高可用、監控、安全等多個方面,要掌握這些新技術對 IT 老兵尚有不小困難,更別說新人了。
由于對技術一直保持著很高的熱誠和執著,在掌握了 OpenStack 相關 IaaS 技術后,我便開始調研 PaaS 技術棧。正好這時 Docker 也越來越流行,自然而然便開始了容器相關技術的學習研究和實踐。
學習容器技術的過程可以說是驚喜不斷,經常驚嘆于容器理念的先進和容器生態環境的完整和強大。很多傳統軟件開發和運維中的難題在容器世界里都能輕松解決,也漸漸理解了容器為何如此受到青睞。
不夸張地說,容器為我打開了一扇通往另一個軟件世界的大門,讓我沉浸其中,激動不已。高興之余,我也迫不及待地想把我所看到、所學到和所想到的有關容器的知識介紹給更多的人,讓更多的IT工程師能夠從容器技術中受益。
我希望這個教程也能為大家打開這扇門,降低學習的曲線,系統地學習和掌握容器技術。
寫給誰看
這套教程的目標讀者包括:
1. 軟件開發人員
相信微服務架構(Microservice Architectur)會逐漸成為開發應用系統的主流,而容器則是這種架構的基石。市場將需要更多能夠開發出基于容器的應用程序的軟件開發人員。
2. IT 實施和運維工程師
容器為應用提供了更好的打包和部署方式,越來越多的應用將以容器的方式在開發、測試和生產環境中運行。掌握容器相關技術將成為實施和運維工程師的核心競爭力。
3. 我自己
我堅信最好的學習方法是分享。編寫這個教程同時也是對自己學習和實踐容器技術的總結。對于知識,只有把它寫出來并能夠讓其他人理解,才能說明真正掌握。
包含哪些內容
本系列教程分為《每天5分鐘玩轉Docker容器技術》和《每天5分鐘玩轉Docker容器平臺》兩本,包括以下三大塊內容:
下面分別介紹各部分包含的內容。
1. 啟程
如下圖所示,啟程會介紹容器的生態系統,讓大家先從整體上了解容器包含哪些技術,各種技術之間的相互關系是什么,然后再來看我們的教程都會涉及生態中的哪些部分。
為了讓大家盡快對容器有個感性認識,我們會搭建實驗環境并運行第一個容器,為之后的學習熱身。
2. 容器技術
容器技術主要內容如下圖所示,包含容器核心知識和容器進階知識兩部分。
核心知識主要回答有關容器 What、Why 和 How 三方面的問題,其中以 How 為重,將展開討論架構、鏡像、容器、網絡和存儲。
進階知識包括將容器真正用于生成所必需的技術,包括多主機管理、跨主機網絡、監控、數據管理、日志管理和安全管理。
這部分內容將在本書《每天5分鐘玩轉Docker容器技術》中詳細討論。
3. 容器平臺技術
如下圖所示,容器平臺技術包括容器編排引擎、容器管理平臺和基于容器的 PaaS。容器平臺技術在生態環境中占據著舉足輕重的位置,對于容器是否能夠落地,是否能應用于生產至關重要。
我們將在本系列教程的另一本書《每天5分鐘玩轉Docker容器平臺》中詳細討論容器編排引擎、容器管理平臺和基于容器的 PaaS,學習和實踐業界最具代表性的開源產品。
怎樣的編寫方式
我會繼續采用《每天5分鐘玩轉OpenStack》(本書已在清華出版)的方式,通過大量的實驗由淺入深地探討和實踐容器技術,力求達到如下目標:
(1)快速上手:以最直接、最有效的方式讓大家把容器用起來。
(2)循序漸進:由易到難、從淺入深,詳細分析容器的各種功能和配置使用方法。
(3)理解架構:從設計原理和架構分析入手,深入探討容器的架構和運行機理。
(4)注重實踐:以大量實際操作案例為基礎,讓大家能夠掌握真正的實施技能。
在內容的發布上還是通過微信公眾號(cloudman6)每周一、三、五定期分享。歡迎大家通過公眾號提出問題和建議,進行技術交流。
為什么叫《每天5分鐘玩轉Docker容器技術》
為了降低學習的難度并且考慮到移動端碎片化閱讀的特點,每次推送的內容大家只需要花5分鐘就能看完(注意這里說的是看完,有時候完全理解可能需要更多時間哈),每篇內容包含1~3個知識點,這就是我把本書命名為《每天5分鐘玩轉Docker容器技術》的原因。雖然是碎片化推送,但整個教程是系統、連貫和完整的,只是化整為零了。
好了,今天這5分鐘算是開了個頭,下面我們正式開始玩轉Docker容器技術。
編 者
2017年7月
CloudMan,十多年 IT 從業經驗,就職于國際知名 IT 企業,從事 IT 基礎設施實施服務,項目涉及服務器、存儲、網絡、虛擬化、云技術等各個方面。CloudMan 對新技術長期保持濃厚的興趣和學習熱情,十幾年來一直專注 IT 技術領域的鉆研與實踐。
目 錄
第一篇 啟 程
第1章 鳥瞰容器生態系統 3
1.1 容器生態系統 3
1.2 本教程覆蓋的知識范圍 10
1.3 準備實驗環境 10
1.3.1
環境選擇 10
1.3.2
安裝 Docker 10
1.4 運行第一個容器 11
1.5 小結 12
第二篇 容器技術
第2章 容器核心知識概述 15
2.1
What
什么是容器 15
2.2
Why
為什么需要容器 16
2.2.1
容器解決的問題 16
2.2.2
Docker 的特性 20
2.2.3
容器的優勢 20
2.3
How
容器是如何工作的 21
2.4 小結 24
第3章 Docker 鏡像 26
3.1 鏡像的內部結構 26
3.1.1
hello-world
最小的鏡像 26
3.1.2
base 鏡像 27
3.1.3
鏡像的分層結構 30
3.2 構建鏡像 32
3.2.1
docker commit 32
3.2.2
Dockerfile 34
3.3
RUN vs CMD vs ENTRYPOINT 42
3.3.1
Shell 和 Exec 格式 42
3.3.2
RUN 44
3.3.3
CMD 44
3.3.4
ENTRYPOINT 45
3.3.5
最佳實踐 46
3.4 分發鏡像 46
3.4.1
為鏡像命名 46
3.4.2
使用公共 Registry 49
3.4.3
搭建本地 Registry 51
3.5 小結 52
第4章 Docker 容器 55
4.1 運行容器 55
4.1.1
讓容器長期運行 56
4.1.2
兩種進入容器的方法 57
4.1.3
運行容器的最佳實踐 59
4.1.4
容器運行小結 59
4.2
stop/start/restart 容器 60
4.3
pause / unpause 容器 61
4.4 刪除容器 61
4.5
State Machine 62
4.6 資源限制 65
4.6.1
內存限額 65
4.6.2
CPU 限額 66
4.6.3
Block IO 帶寬限額 68
4.7 實現容器的底層技術 69
4.7.1
cgroup 70
4.7.2
namespace 70
4.8 小結 72
第5章 Docker 網絡 74
5.1
none 網絡 74
5.2
host 網絡 75
5.3
bridge 網絡 76
5.4
user-defined 網絡 78
5.5 容器間通信 84
5.5.1
IP通信 84
5.5.2
Docker DNS Server 85
5.5.3
joined 容器 85
5.6 將容器與外部世界連接 87
5.6.1
容器訪問外部世界 87
5.6.2
外部世界訪問容器 90
5.7 小結 91
第6章 Docker 存儲 92
6.1
storage driver 92
6.2
Data Volume 94
6.2.1
bind mount 94
6.2.2
docker managed volume 96
6.3 數據共享 99
6.3.1
容器與 host 共享數據 99
6.3.2
容器之間共享數據 99
6.4
volume container 100
6.5
data-packed volume container 102
6.6
Data Volume 生命周期管理 103
6.6.1
備份 104
6.6.2
恢復 104
6.6.3
遷移 104
6.6.4
銷毀 104
6.7 小結 105
第三篇 容器進階知識
第7章 多主機管理 109
7.1 實驗環境描述 110
7.2 安裝 Docker
Machine 111
7.3 創建 Machine
112
7.4 管理Machine 114
第8章 容器網絡 117
8.1
libnetwork & CNM 117
8.2 overlay
119
8.2.1
實驗環境描述 120
8.2.2
創建overlay網絡 121
8.2.3
在overlay中運行容器 122
8.2.4
overlay 網絡連通性 124
8.2.5
overlay 網絡隔離 126
8.2.6
overlay IPAM 127
8.3
macvlan 127
8.3.1
準備實驗環境 127
8.3.2
創建 macvlan 網絡 128
8.3.3
macvlan 網絡結構分析 130
8.3.4
用 sub-interface 實現多 macvlan 網絡 131
8.3.5
macvlan 網絡間的隔離和連通 132
8.4
flannel 136
8.4.1
實驗環境描述 137
8.4.2
安裝配置 etcd 137
8.4.3
build flannel 138
8.4.4
將 flannel 網絡的配置信息保存到 etcd 139
8.4.5
啟動 flannel 139
8.4.6
配置 Docker 連接 flannel 141
8.4.7
將容器連接到 flannel 網絡 143
8.4.8
flannel 網絡連通性 144
8.4.9
flannel 網絡隔離 146
8.4.10
flannel 與外網連通性 146
8.4.11
host-gw backend 146
8.5
weave 148
8.5.1
實驗環境描述 148
8.5.2
安裝部署 weave 149
8.5.3
在host1中啟動weave 149
8.5.4
在 host1 中啟動容器 150
8.5.5
在host2中啟動weave并運行容器 153
8.5.6
weave 網絡連通性 154
8.5.7
weave 網絡隔離 155
8.5.8
weave 與外網的連通性 156
8.5.9
IPAM 158
8.6
calico 158
8.6.1
實驗環境描述 159
8.6.2
啟動 etcd 159
8.6.3
部署 calico 160
8.6.4
創建calico網絡 161
8.6.5
在 calico 中運行容器 161
8.6.6
calico 默認連通性 164
8.6.7
calico policy 167
8.6.8
calico IPAM 169
8.7 比較各種網絡方案 170
8.7.1
網絡模型 171
8.7.2
Distributed Store 171
8.7.3
IPAM 171
8.7.4
連通與隔離 172
8.7.5
性能 172
第9章 容器監控 173
9.1
Docker自帶的監控子命令 173
9.1.1
ps 173
9.1.2
top 174
9.1.3
stats 175
9.2
sysdig 175
9.3
Weave Scope 179
9.3.1
安裝 179
9.3.2
容器監控 181
9.3.3
監控 host 184
9.3.4
多主機監控 186
9.4
cAdvisor 189
9.4.1
監控 Docker Host 189
9.4.2
監控容器 191
9.5
Prometheus 194
9.5.1
架構 194
9.5.2
多維數據模型 195
9.5.3
實踐 196
9.6 比較不同的監控工具 204
9.7 幾點建議 205
第10章 日志管理 207
10.1
Docker logs 207
10.2
Docker logging driver 209
10.3
ELK 211
10.3.1
日志處理流程 211
10.3.2
安裝 ELK 套件 212
10.3.3
Filebeat 214
10.3.4
管理日志 216
10.4
Fluentd 220
10.4.1
安裝 Fluentd 221
10.4.2
重新配置 Filebeat 221
10.4.3
監控容器日志 221
10.5
Graylog 222
10.5.1
Graylog 架構 222
10.5.2
部署 Graylog 223
10.5.3
配置 Graylog 225
10.5.4
監控容器日志 227
10.6
小結 229
第11章 數據管理 230
11.1
從一個例子開始 230
11.2
實踐 Rex-Ray driver 232
11.2.1
安裝 Rex-Ray 232
11.2.2
配置 VirtualBox 234
11.2.3
創建Rex-Ray volume 236
11.2.4
使用 Rex-Ray volume 237
寫在最后 243