本書由淺入深地講解了Docker的相關(guān)內(nèi)容,涵蓋從開發(fā)環(huán)境到DevOps流水線,再一路到生產(chǎn)環(huán)境的整個(gè)落地過程以及相關(guān)的實(shí)用技巧。書中介紹Docker的核心概念和架構(gòu),以及將Docker和開發(fā)環(huán)境有機(jī)、高效地結(jié)合起來的方法,包括背Docker用作輕量級(jí)虛擬機(jī)、構(gòu)建容器、宿主機(jī)編排、配置管理、精簡(jiǎn)鏡像等。不僅如此,本書還通過“問題-解決方案-討論”的形式,將Docker如何融入DevOps流水線、如何在生產(chǎn)環(huán)境落地等一系列難題拆解成114個(gè)相關(guān)的實(shí)用技巧,為讀者提供解決方案以及一些細(xì)節(jié)和技巧方面的實(shí)踐經(jīng)驗(yàn)。閱讀本書,讀者學(xué)到的不只是Docker,還包括持續(xù)集成、持續(xù)交付、構(gòu)建和鏡像管理、容器編排等相關(guān)領(lǐng)域的一線生產(chǎn)經(jīng)驗(yàn)。本書編寫時(shí)一些案例參考的Docker版本是Docker 1.13。
本書要求讀者具備一定的容器管理和運(yùn)維的基礎(chǔ)知識(shí),適合想要將Docker投入實(shí)踐的相關(guān)技術(shù)人員閱讀,尤其適合具有中高級(jí)DevOps和運(yùn)維背景的讀者閱讀。
1.暢銷Docker容器實(shí)踐教程升級(jí)版,編寫時(shí)參考的Docker版本是Docker 1.13;
2.114個(gè)實(shí)戰(zhàn)技巧為讀者提供解決方案以及一些細(xì)節(jié)和技巧方面的實(shí)踐經(jīng)驗(yàn);
3.提供配套源代碼下載。
本書詳細(xì)介紹了一些堅(jiān)實(shí)可靠的、經(jīng)過檢驗(yàn)的Docker技術(shù),如替換虛擬機(jī)(VM)、啟用微服務(wù)架構(gòu)、高效網(wǎng)絡(luò)建模、離線生產(chǎn)和建立容器驅(qū)動(dòng)的持續(xù)交付過程等,讓開發(fā)人員能夠按照手冊(cè)風(fēng)格的“問題-解決方案-討論”模式探索真實(shí)案例,并學(xué)習(xí)如何將這些經(jīng)驗(yàn)應(yīng)用到自己的開發(fā)項(xiàng)目中。
本書主要內(nèi)容:
持續(xù)集成和交付。
Kubernetes編排工具。
精簡(jiǎn)云工作流。
swarm集群模式下的Docker。
新興的最佳實(shí)踐和技巧。
本書是專門寫給在生產(chǎn)環(huán)境中使用Docker的開發(fā)人員和工程師的。
作者伊恩·米爾(Ian Miell)和艾丹·霍布森·塞耶斯(Aidan Hobson Sayers)都是經(jīng)驗(yàn)豐富的基礎(chǔ)設(shè)施架構(gòu)師。他們一起使用Docker完成了英國(guó)一家大型游戲公司的DevOps轉(zhuǎn)型。
伊恩·米爾(Ian Miell),巴克萊的首席OpenShift架構(gòu)師,也是一位經(jīng)驗(yàn)豐富的軟件工程師,他是公司中首位發(fā)現(xiàn)Docker潛力的人,并且在Docker生態(tài)系統(tǒng)中創(chuàng)建了他自己的工具。
艾丹·霍布森·塞耶斯(Aidan Hobson Sayers),對(duì)Docker實(shí)踐的細(xì)節(jié)有濃厚的興趣,他經(jīng)常分析Docker源代碼。他和Ian都為Docker的發(fā)展貢獻(xiàn)了自己的一份力量,對(duì)在商業(yè)壓力開發(fā)環(huán)境中構(gòu)建和維護(hù)Docker基礎(chǔ)設(shè)施有著豐富的經(jīng)驗(yàn)。
譯者簡(jiǎn)介
楊銳,前ThoughtWorks咨詢師,DevOps領(lǐng)域持續(xù)關(guān)注者,曾任某海外大型項(xiàng)目DevOps工程師,對(duì)其持續(xù)交付、基礎(chǔ)設(shè)施即代碼、流水線即代碼等方面進(jìn)行了持續(xù)推動(dòng),對(duì)云計(jì)算、容器化和持續(xù)交付等有一定經(jīng)驗(yàn),F(xiàn)供職美團(tuán)點(diǎn)評(píng)。
吳佳興,畢業(yè)于華東理工大學(xué)計(jì)算機(jī)系,主要研究方向有運(yùn)維自動(dòng)化、云原生基礎(chǔ)設(shè)施建設(shè)和混沌工程等。2014年年底有幸加入DockOne社區(qū),作為譯者,利用閑暇時(shí)間為社區(qū)貢獻(xiàn)一些微薄的力量。歡迎郵件聯(lián)系(wjx_colstu@hotmail.com)。
梁曉勇,畢業(yè)于廈門大學(xué),現(xiàn)任齊家網(wǎng)技術(shù)總監(jiān),DockOne社區(qū)編外人員。長(zhǎng)期奮戰(zhàn)在技術(shù)研發(fā)第一線,在網(wǎng)絡(luò)管理、技術(shù)開發(fā)、架構(gòu)設(shè)計(jì)等方面略有心得。熱愛互聯(lián)網(wǎng)技術(shù),積極投身開源社區(qū),對(duì)Docker等容器技術(shù)具有濃厚興趣。歡迎郵件聯(lián)系(sunlxy@yahoo.com)。
黃博文,ThoughtWorks資深軟件工程師/咨詢師,擁有豐富的敏捷團(tuán)隊(duì)工作經(jīng)驗(yàn)。目前專注于DevOps技術(shù)及云端架構(gòu),在搭建持續(xù)集成及部署平臺(tái)、自動(dòng)化構(gòu)建基礎(chǔ)設(shè)施、虛擬化環(huán)境以及云端運(yùn)維等方面有著豐富的經(jīng)驗(yàn)。擁有AWS解決方案架構(gòu)師以及開發(fā)者證書。譯作有《Effective JavaScript》《響應(yīng)式Web設(shè)計(jì):HTML5和CSS3實(shí)踐指南》《C#多線程編程實(shí)戰(zhàn)》等。個(gè)人郵箱為huangbowen521@gmail.com。
第一部分 Docker基礎(chǔ)
第1章 Docker初探 3
1.1 Docker是什么以及為什么用Docker 4
1.1.1 Docker是什么 4
1.1.2 Docker有什么好處 6
1.1.3 關(guān)鍵的概念 7
1.2 構(gòu)建一個(gè)Docker應(yīng)用程序 9
1.2.1 創(chuàng)建新的Docker鏡像的方式 10
1.2.2 編寫一個(gè)Dockerfile 11
1.2.3 構(gòu)建一個(gè)Docker鏡像 12
1.2.4 運(yùn)行一個(gè)Docker容器 13
1.2.5 Docker分層 16
1.3 小結(jié) 17
第2章 理解Docker——深入引擎室 18
2.1 Docker的架構(gòu) 18
2.2 Docker守護(hù)進(jìn)程 20
技巧1 向世界開放Docker守護(hù)進(jìn)程 20
技巧2 以守護(hù)進(jìn)程方式運(yùn)行容器 22
技巧3 將Docker移動(dòng)到不同分區(qū) 25
2.3 Docker客戶端 26
技巧4 使用socat監(jiān)控Docker API流量 26
技巧5 在瀏覽器中使用Docker 29
技巧6 使用端口連接容器 31
技巧7 允許容器通信 33
技巧8 鏈接容器實(shí)現(xiàn)端口隔離 34
2.4 Docker注冊(cè)中心 36
技巧9 建立一個(gè)本地Docker注冊(cè)中心 37
2.5 Docker Hub 38
技巧10 查找并運(yùn)行一個(gè)Docker鏡像 39
2.6 小結(jié) 41
第二部分 Docker與開發(fā)
第3章 將Docker用作輕量級(jí)虛擬機(jī) 45
3.1 從虛擬機(jī)到容器 46
技巧11 將虛擬機(jī)轉(zhuǎn)換為容器 46
技巧12 類宿主機(jī)容器 49
技巧13 將一個(gè)系統(tǒng)拆成微服務(wù)容器 51
技巧14 管理容器內(nèi)服務(wù)的啟動(dòng) 54
3.2 保存和還原工作成果 57
技巧15 “保存游戲”的方式:廉價(jià)的源代碼管理 57
技巧16 給Docker打標(biāo)簽 59
技巧17 在Docker Hub上分享鏡像 62
技巧18 在構(gòu)建時(shí)指向特定的鏡像 64
3.3 進(jìn)程即環(huán)境 65
技巧19 “保存游戲”的方式:在2048里獲勝 65
3.4 小結(jié) 67
第4章 構(gòu)建鏡像 68
4.1 構(gòu)建鏡像 68
技巧20 使用ADD指令將文件注入鏡像里 68
技巧21 不帶緩存的重新構(gòu)建 71
技巧22 清除緩存 73
技巧23 使用build-args實(shí)現(xiàn)智能的緩存清除 74
技巧24 使用ADD指令實(shí)現(xiàn)智能的緩存清除 78
技巧25 在容器里設(shè)置正確的時(shí)區(qū) 81
技巧26 語言環(huán)境管理 83
技巧27 image-steper遍歷鏡像分層 86
技巧28 ONBUILD指令和golang 90
4.2 小結(jié) 93
第5章 運(yùn)行容器 94
5.1 運(yùn)行容器 94
技巧29 在Docker里運(yùn)行GUI 94
技巧30 檢查容器 97
技巧31 干凈地“殺死”容器 98
技巧32 使用Docker Machine置備Docker宿主機(jī) 100
技巧33 帶通配符的DNS 104
5.2 卷——持久化問題 105
技巧34 Docker卷——持久化的問題 105
技巧35 通過Resilio Sync 實(shí)現(xiàn)的分布式卷 107
技巧36 保留容器的bash歷史 109
技巧37 數(shù)據(jù)容器 111
技巧38 使用SSHFS掛載遠(yuǎn)程卷 113
技巧39 通過NFS共享數(shù)據(jù) 115
技巧40 開發(fā)工具容器 118
5.3 小結(jié) 119
第6章 Docker日常 120
6.1 保持陣型 120
技巧41 運(yùn)行Docker時(shí)不加sudo 120
技巧42 清理容器 121
技巧43 清理卷 123
技巧44 無須停止容器,從容器里解綁 125
技巧45 使用Portainer來管理Docker守護(hù)進(jìn)程 125
技巧46 生成Docker鏡像的依賴圖 126
技巧47 直接行動(dòng):在容器上執(zhí)行命令 129
技巧48 你在容器里嗎 130
6.2 小結(jié) 131
第7章 配置管理,讓一切井然有序 132
7.1 配置管理和Dockerfile 132
技巧49 使用ENTRYPOINT創(chuàng)建可靠的定制工具 133
技巧50 在構(gòu)建中指定版本來避免軟件包的漂移 134
技巧51 用perl -p -i -e替換文本 136
技巧52 鏡像的扁平化 138
技巧53 用Alien管理外來軟件包 140
7.2 傳統(tǒng)配置管理工具與Docker 142
技巧54 傳統(tǒng)方式:搭配make和Docker 142
技巧55 借助Chef Solo構(gòu)建鏡像 145
7.3 小即是美 149
技巧56 讓鏡像變得更小的技巧 149
技巧57 通過BusyBox和Alpine精簡(jiǎn)Docker鏡像 151
技巧58 Go模型的最小容器 153
技巧59 使用inotifywait給容器瘦身 156
技巧60 大也可以美 159
7.4 小結(jié) 161
第三部分 Docker與DevOps
第8章 持續(xù)集成:加快開發(fā)流水線 165
8.1 Docker Hub自動(dòng)化構(gòu)建 165
技巧61 使用Docker Hub工作流 166
8.2 更有效的構(gòu)建 169
技巧62 使用eatmydata為I/O密集型構(gòu)建提速 169
技巧63 設(shè)置一個(gè)軟件包緩存用于加快構(gòu)建速度 171
技巧64 容器里的無頭Chrome 174
技巧65 在Docker內(nèi)部運(yùn)行Selenium測(cè)試 176
8.3 容器化CI過程 181
技巧66 在一個(gè)Docker容器里運(yùn)行Jenkins主服務(wù)器 181
技巧67 包含一個(gè)復(fù)雜的開發(fā)環(huán)境 183
技巧68 使用Jenkins的Swarm插件擴(kuò)展CI 188
技巧69 安全地升級(jí)容器化Jenkins服務(wù)器 191
8.4 小結(jié) 195
第9章 持續(xù)交付:與Docker原則完美契合 196
9.1 在CD流水線上與其他團(tuán)隊(duì)互動(dòng) 197
技巧70 Docker契約:減少摩擦 197
9.2 推動(dòng)Docker鏡像的部署 199
技巧71 手動(dòng)同步注冊(cè)中心鏡像 200
技巧72 通過受限連接交付鏡像 201
技巧73 以TAR文件方式共享Docker對(duì)象 203
9.3 為不同環(huán)境配置鏡像 205
技巧74 使用etcd通知容器 205
9.4 升級(jí)運(yùn)行中的容器 208
技巧75 使用confd啟用零停機(jī)時(shí)間切換 209
9.5 小結(jié) 213
第10章 網(wǎng)絡(luò)模擬:無痛的現(xiàn)實(shí)環(huán)境測(cè)試 214
10.1 容器通信:超越手工鏈接 214
技巧76 一個(gè)簡(jiǎn)單的Docker Compose集群 214
技巧77 一個(gè)使用Docker Compose的SQLite服務(wù)器 218
10.2 使用Docker模擬真實(shí)世界的網(wǎng)絡(luò) 222
技巧78 使用Comcast模擬有問題的網(wǎng)絡(luò) 223
技巧79 使用Blockade模擬有問題的網(wǎng)絡(luò) 226
10.3 Docker和虛擬網(wǎng)絡(luò) 230
技巧80 創(chuàng)建另一個(gè)Docker虛擬網(wǎng)絡(luò) 231
技巧81 使用Weave建立一個(gè)基底網(wǎng)絡(luò) 234
10.4 小結(jié) 237
第四部分 從單機(jī)到云的編排
第11章 容器編排入門 241
11.1 簡(jiǎn)單的單臺(tái)宿主機(jī) 242
技巧82 使用systemd管理宿主機(jī)上的容器 242
技巧83 編排宿主機(jī)上的容器的啟動(dòng) 246
11.2 手動(dòng)多宿主機(jī)Docker 249
技巧84 使用Helios手動(dòng)管理多宿主機(jī)Docker 249
11.3 服務(wù)發(fā)現(xiàn):我們有什么 254
技巧85 使用Consul發(fā)現(xiàn)服務(wù) 255
技巧86 使用Registrator進(jìn)行自動(dòng)化服務(wù)注冊(cè) 262
11.4 小結(jié) 264
第12章 使用Docker實(shí)現(xiàn)數(shù)據(jù)中心即操作系統(tǒng) 265
12.1 多宿主機(jī)Docker 265
技巧87 swarm模式的無縫Docker集群 265
技巧88 使用Kubernetes集群 269
技巧89 在pod內(nèi)訪問Kubernetes API 274
技巧90 使用OpenShift在本地運(yùn)行AWS API 277
技巧91 在Mesos上構(gòu)建框架 283
技巧92 使用Marathon細(xì)粒度管理Mesos 290
12.2 小結(jié) 293
第13章 Docker平臺(tái) 294
13.1 組織選擇的因素 295
13.1.1 投放到市場(chǎng)的時(shí)間 297
13.1.2 購(gòu)買與構(gòu)建 297
13.1.3 單體與零散 298
13.1.4 開源與授權(quán) 299
13.1.5 安全態(tài)度 299
13.1.6 消費(fèi)者獨(dú)立性 300
13.1.7 云策略 300
13.1.8 組織結(jié)構(gòu) 300
13.1.9 多平臺(tái)? 300
13.1.10 組織選擇因素結(jié)論 301
13.2 采用Docker時(shí)需要考慮的方面 301
13.2.1 安全與控制 301
13.2.2 構(gòu)建和分發(fā)鏡像 307
13.2.3 運(yùn)行容器 309
13.3 供應(yīng)商、組織和產(chǎn)品 311
13.3.1 云原生計(jì)算基金會(huì)(CNCF) 311
13.3.2 Docker公司 313
13.3.3 谷歌 313
13.3.4 微軟 313
13.3.5 亞馬遜 314
13.3.6 Red Hat 314
13.4 小結(jié) 315
第五部分 生產(chǎn)環(huán)境中的Docker
第14章 Docker與安全 319
14.1 Docker訪問權(quán)限及其意味著什么 319
你在乎嗎 320
14.2 Docker中的安全手段 320
技巧93 限制能力 321
技巧94 掃描一個(gè)“壞”Docker鏡像 324
14.3 保衛(wèi)對(duì)于Docker的使用 325
技巧95 Docker實(shí)例上的HTTP認(rèn)證 326
技巧96 保護(hù)Docker API 329
14.4 Docker外部的安全性 333
技巧97 使用DockerSlim來減少容器攻擊者的攻擊面 333
技巧98 去除在構(gòu)建中加入的密碼 338
技巧99 OpenShift—— 一個(gè)應(yīng)用程序平臺(tái)即服務(wù) 342
技巧100 使用安全選項(xiàng) 350
14.5 小結(jié) 357
第15章 一帆風(fēng)順:在生產(chǎn)環(huán)境中運(yùn)行Docker 358
15.1 監(jiān)控 358
技巧101 記錄容器的日志到宿主機(jī)的syslog 358
技巧102 記錄Docker日志的輸出 361
技巧103 使用cAdvisor監(jiān)控容器 363
15.2 資源控制 365
技巧104 限制容器可以運(yùn)行的內(nèi)核 365
技巧105 給重要的容器更多CPU 366
技巧106 限制容器的內(nèi)存使用 367
15.3 Docker的系統(tǒng)管理員用例 369
技巧107 使用Docker運(yùn)行cron作業(yè) 369
技巧108 通過“保存游戲”的方法來備份 372
15.4 小結(jié) 374
第16章 Docker生產(chǎn)環(huán)境實(shí)踐——應(yīng)對(duì)各項(xiàng)挑戰(zhàn) 375
16.1 性能:不能忽略宿主機(jī) 375
技巧109 從容器訪問宿主機(jī)資源 375
技巧110 禁用內(nèi)存溢出殺手 379
16.2 在容器出問題時(shí)——調(diào)試Docker 381
技巧111 使用nsenter調(diào)試容器的網(wǎng)絡(luò) 381
技巧112 無須重新配置,使用tcpflow進(jìn)行實(shí)時(shí)調(diào)試 384
技巧113 調(diào)試在特定宿主機(jī)上出問題的容器 386
技巧114 從鏡像中提取文件 389
16.3 小結(jié) 391
附錄A 安裝并使用Docker 392
A.1 虛擬機(jī)的方式 392
A.2 連接到外部Docker服務(wù)器的Docker客戶端 393
A.3 原生Docker客戶端和虛擬機(jī) 393
Windows上的Docker 393
A.4 獲得幫助 395
附錄B Docker配置 396
B.1 配置Docker 396
B.2 重啟Docker 397
B.2.1 使用systemctl重啟 397
B.2.2 重啟服務(wù) 398
附錄C Vagrant 399
C.1 設(shè)置 399
C.2 圖形用戶界面 399
C.3 內(nèi)存 400