Docker作為一個2013年才誕生的開源項目,其發(fā)展的速度和火爆程度卻令人驚嘆。容器技術本不是什么新鮮事物,但是在Docker的整合下,一切變得清晰、易用起來,并且隨著各大云計算廠商的進場,使Docker得到了極大的推廣。如今,Docker已經(jīng)成為容器技術領域當仁不讓的領頭羊。國內外以Docker技術起家的創(chuàng)業(yè)公司如雨后春筍般涌現(xiàn)出來,體現(xiàn)了容器市場的巨大需求。越來越多的企業(yè)開始逐步把傳統(tǒng)的應用開發(fā)流程遷移到Docker容器中作為開發(fā)部署流程的一環(huán)。伴隨而來的是各種復雜的需求與Docker尚不算完善的功能所產生的矛盾,這些問題制約著企業(yè)容器化的腳步。另一方面,Docker以其友好的使用體驗使廣大開發(fā)者對其“一見傾心”,越來越多的開發(fā)者使用Docker作為應用分發(fā)部署的一個重要陣地。盡管如此,Docker對于大部分開發(fā)者而言還是尚未開拓的疆土。特別是對于國內環(huán)境而言,Docker的推廣基本上靠國內幾家與Docker相關的初創(chuàng)公司。
本書以一位普通的全棧開發(fā)者的身份,詳細介紹了Docker的基礎知識,分享了企業(yè)級容器云的實戰(zhàn)經(jīng)驗。為什么學習Docker如果您是一名開發(fā)者,想必遇到過“這個程序只有在我的機器上才可以運行”的情況。隨著用戶需求變得多樣,軟件愈發(fā)復雜,所依賴環(huán)境愈發(fā)龐大,使得軟件在其他機器上運行需要做大量的遷移工作。更糟糕的是,這些瑣事完成后軟件還不一定能正常運行。為了解決這些問題,虛擬化技術開始普及。人們可以通過各種虛擬化技術來實現(xiàn)軟件的遷移和分發(fā)。最常見的就是虛擬機或KVM技術。在虛擬機里完成開發(fā)再遷移到線上不會出現(xiàn)環(huán)境問題,解決了遷移過程中的諸多難題,但是仍然存在性能低下、分發(fā)流程麻煩、耗時和成本昂貴等問題。在云計算時代這些問題更加突出。
隨著容器技術的普及,人們意識到容器技術可以極大地降低成本。容器技術具有啟動快、體積小和分發(fā)迅速等諸多特點,這簡直就是開發(fā)人員夢寐以求的工具。 而“欣喜若狂”的不止是開發(fā)人員,還有運維人員。如果在十年前,普通企業(yè)要管理上百臺服務器,最可能使用的方法是通過Shell腳本的方式使用SSH連接到所有服務器然后執(zhí)行相同的指令,并把日志保存起來歸檔。這種方式我們稱之為第一代運維。那時維護服務器是一項繁重的工作,工程師不得不把大量的時間耗費在服務器管理上。隨著技術的發(fā)展,虛擬化技術的普及和云計算的出現(xiàn),企業(yè)需要管理的服務器數(shù)量大幅增長。過去我們只要管理企業(yè)內部數(shù)據(jù)中心的物理服務器,而現(xiàn)在則要管理遍布全球的服務器,運維成本愈發(fā)昂貴。于是開發(fā)者開始針對云計算時代服務器運維方式做出改變,涌現(xiàn)出了諸如Ansible、Puppet、SaltStack和Chef等出色的運維工具。人們可以通過這些工具快速地完成對上百臺甚至上千臺服務器的管理操作。這被稱之為第二代運維。它極大地解決了管理龐大服務器集群的難題,使人們可以在屏幕面前通過一個界面管理所有服務器。但本質上這些工具都是通過SSH或者類似于SSH的方式連接到服務器來管理服務器集群,這意味著其實第二代運維和第一代運維并沒有發(fā)生根本性的改變。
上面那些運維工具在云計算普及的大勢下很快暴露了它們的問題——速度。因為大部分運維工具依靠的是SSH連接來交換信息,這使得整個過程十分耗時,更不用說其他復雜的管理操作。而隨著容器技術的爆發(fā),以Docker為代表的容器技術開始發(fā)力,并隨著DevOps概念的普及,使運維發(fā)生了根本性的改變。容器集群管理不再是通過低效的SSH來連接服務器,甚至不需要登錄服務器就可以完成對服務器的管理。人們發(fā)現(xiàn),通過容器管理集群可以拋棄傳統(tǒng)的“SSH+秘鑰”的連接方式來連接服務器,這對大規(guī)模集群來說是一個極大的變革。而且在速度上,容器技術在上百臺服務器上啟動應用只需要一眨眼的時間,這使得運維的工作大大減輕。
運維和開發(fā)在容器時代逐步“融為一體”,形成一個流水線車間的工作環(huán)境。這對于軟件行業(yè)來說無疑是一次巨大的變革。
如果您也對傳統(tǒng)的軟件開發(fā)和運維的煩瑣流程感到吃力,又對容器技術感興趣,那么本書將是很好的入門書籍。如果您不是職業(yè)的開發(fā)和運維人員,對Linux也不算熟悉,但屬于一個對Docker感興趣的極客,想通過Docker部署一些復雜的應用,本書也一樣適合您。本書雖以Linux為平臺介紹Docker的使用,但是與在Windows和Mac OS平臺上的操作基本一致,普通用戶完全可以把Docker當做一個“好玩的工具”來使用,體驗Docker帶來的便捷。
本書適合新手入門,本書在基礎方面內容非常詳盡,包括鏡像的構建、容器的運行監(jiān)控、網(wǎng)絡的管理、倉庫的應用、集群的部署等內容,全面、細致地介紹了Docker的基本使用方法與實現(xiàn)原理,適合新手入門。 應用結合實際。本書在實戰(zhàn)應用部分結合實際應用,從不同的角度分析問題并提出對應的解決辦法,擴展了很多實用的實戰(zhàn)技巧。實戰(zhàn)部分根據(jù)不同類型的開發(fā)環(huán)境構建基礎開發(fā)環(huán)境鏡像,使讀者可以直接使用Docker進入測試開發(fā),并根據(jù)不同類型的應用部署做了詳細介紹。
前言
第1篇 容器技術與Docker概念
第1章 容器技術2
1.1 什么是容器2
1.1.1 關于虛擬化2
1.1.2 容器的定義3
1.1.3 為什么使用容器3
1.2 容器技術的前世今生4
1.2.1 容器技術的起源4
1.2.2 容器技術的發(fā)展5
1.3 容器的原理7
1.3.1 從namespace說起7
1.3.2 認識Cgroups9
1.3.3 容器的創(chuàng)建11
1.4 容器云12
1.5 容器與Docker13
1.6 本章小結13
第2章 Docker簡介14
2.1 什么是Docker14
2.1.1 Docker的歷史14
2.1.2 Docker的現(xiàn)狀16
2.1.3 Docker的未來17
2.2 Docker的功能及優(yōu)缺點18
2.2.1 Docker在解決什么18
2.2.2 為什么選擇Docker19
2.2.3 Docker的缺點19
2.3 Docker和虛擬機19
2.3.1 Docker與虛擬機的區(qū)別20
2.3.2 Docker與虛擬機的優(yōu)缺點20
2.4 Docker與runC21
2.4.1 libcontainer與runC21
2.4.2 runC的使用22
2.4.3 runC原理22
2.5 Docker基本架構24
2.5.1 Docker Client介紹24
2.5.2 Docker daemon介紹25
2.5.3 Docker鏡像25
2.5.4 Docker容器26
2.5.5 Docker倉庫26
2.6 本章小結26
第3章 安裝Docker27
3.1 Linux系統(tǒng)27
3.1.1 一鍵安裝腳本27
3.1.2 Debian發(fā)行版28
3.1.3 Ubuntu發(fā)行版30
3.1.4 Centos/Fedora發(fā)行版33
3.1.5 Arch Linux發(fā)行版37
3.1.6 Suse/openSUSE發(fā)行版38
3.2 Windows與Mac OS系統(tǒng)38
3.2.1 在Windows上安裝原生Docker39
3.2.2 在Mac OS上安裝原生Docker41
3.3 二進制安裝43
3.3.1 獲取Linux二進制包44
3.3.2 獲取Mac OS X二進制包44
3.3.3 獲取Windows的二進制包45
3.3.4 樹莓派安裝Docker45
3.4 本章小結46
第2篇 Docker基礎知識
第4章 Docker基礎48
4.1 Docker基本操作48
4.1.1 依附容器的docker attach命令49
4.1.2 構建鏡像的docker build命令51
4.1.3 提交容器的docker commit命令52
4.1.4 復制文件到宿主機的docker cp命令52
4.1.5 創(chuàng)建容器的docker create命令53
4.1.6 查看容器變化的docker diff命令54
4.1.7 查看事件的docker events命令54
4.1.8 進入容器的docker exec命令55
4.1.9 導出容器的docker export命令56
4.1.10 查看鏡像歷史的docker history命令56
4.1.11 查看本地鏡像的docker images命令57
4.1.12 導入容器的docker import命令58
4.1.13 查看Docker信息的docker info命令58
4.1.14 查看各項詳細信息的docker inspect命令59
4.1.15 殺死容器的docker kill命令60
4.1.16 導入鏡像的docker load命令60
4.1.17 登錄倉庫的docker login命令61
4.1.18 登出倉庫的docker logout命令61
4.1.19 查看容器日志的docker logs命令62
4.1.20 管理網(wǎng)絡的docker network命令62
4.1.21 管理節(jié)點的docker node命令63
4.1.22 暫停容器的docker pause命令64
4.1.23 查看容器端口的docker port命令64
4.1.24 查看本地容器信息的docker ps命令65
4.1.25 拉取鏡像的docker pull命令65
4.1.26 推送鏡像的docker push命令66
4.1.27 重命名容器的docker rename命令66
4.1.28 重啟容器的docker restart命令66
4.1.29 刪除容器的docker rm命令67
4.1.30 刪除鏡像的docker rmi命令67
4.1.31 運行容器的docker run命令68
4.1.32 導出鏡像的docker save命令72
4.1.33 搜索鏡像的docker search命令73
4.1.34 管理服務的docker service命令74
4.1.35 啟動容器的docker start命令74
4.1.36 查看容器狀態(tài)的docker stats命令75
4.1.37 停止容器的docker stop命令75
4.1.38 管理集群的docker swarm命令76
4.1.39 設置鏡像標簽的docker tag命令76
4.1.40 查看容器進程的docker top命令77
4.1.41 恢復暫停容器的docker unpause命令77
4.1.42 更新容器的docker update命令77
4.1.43 查看Docker版本的docker version命令78
4.1.44 管理數(shù)據(jù)卷的docker volume命令78
4.1.45 設置等待的docker wait命令79
4.2 啟動第一個Docker容器79
4.3 構建第一個Docker鏡像80
4.4 本章小結81
第5章 Docker鏡像82
5.1 認識鏡像82
5.1.1 使用docker pull拉取鏡像82
5.1.2 搜索鏡像83
5.1.3 查看鏡像信息84
5.2 創(chuàng)建鏡像86
5.2.1 剖析Hello World鏡像86
5.2.2 從Dockerfile構建鏡像86
5.2.3 自動構建鏡像87
5.2.4 提交容器為鏡像90
5.3 導出和導入鏡像91
5.3.1 導出鏡像到本地文件系統(tǒng)91
5.3.2 從本地文件系統(tǒng)導入鏡像91
5.4 發(fā)布鏡像91
5.4.1 發(fā)布鏡像到Docker Hub92
5.4.2 給鏡像打上標簽92
5.4.3 發(fā)布到第三方鏡像倉庫92
5.5 刪除鏡像93
5.5.1 刪除本地鏡像93
5.5.2 刪除倉庫鏡像93
5.6 Docker鏡像擴展94
5.6.1 Docker鏡像里有什么94
5.6.2 Docker鏡像的存儲方式95
5.6.3 聯(lián)合掛載95
5.6.4 Git式管理96
5.7 本章小結96
第6章 Dockerfile文件97
6.1 Dockerfile基本結構97
6.1.1 Dockerfile基礎97
6.1.2 Dockerfile的書寫規(guī)則98
6.1.3 基礎鏡像信息和維護者信息99
6.2 Dockerfile指令99
6.2.1 指定基礎鏡像的FR