Docker作為一個2013年才誕生的開源項目,其發展的速度和火爆程度卻令人驚嘆。容器技術本不是什么新鮮事物,但是在Docker的整合下,一切變得清晰、易用起來,并且隨著各大云計算廠商的進場,使Docker得到了極大的推廣。如今,Docker已經成為容器技術領域當仁不讓的領頭羊。國內外以Docker技術起家的創業公司如雨后春筍般涌現出來,體現了容器市場的巨大需求。越來越多的企業開始逐步把傳統的應用開發流程遷移到Docker容器中作為開發部署流程的一環。伴隨而來的是各種復雜的需求與Docker尚不算完善的功能所產生的矛盾,這些問題制約著企業容器化的腳步。另一方面,Docker以其友好的使用體驗使廣大開發者對其“一見傾心”,越來越多的開發者使用Docker作為應用分發部署的一個重要陣地。盡管如此,Docker對于大部分開發者而言還是尚未開拓的疆土。特別是對于國內環境而言,Docker的推廣基本上靠國內幾家與Docker相關的初創公司。
本書以一位普通的全棧開發者的身份,詳細介紹了Docker的基礎知識,分享了企業級容器云的實戰經驗。為什么學習Docker如果您是一名開發者,想必遇到過“這個程序只有在我的機器上才可以運行”的情況。隨著用戶需求變得多樣,軟件愈發復雜,所依賴環境愈發龐大,使得軟件在其他機器上運行需要做大量的遷移工作。更糟糕的是,這些瑣事完成后軟件還不一定能正常運行。為了解決這些問題,虛擬化技術開始普及。人們可以通過各種虛擬化技術來實現軟件的遷移和分發。最常見的就是虛擬機或KVM技術。在虛擬機里完成開發再遷移到線上不會出現環境問題,解決了遷移過程中的諸多難題,但是仍然存在性能低下、分發流程麻煩、耗時和成本昂貴等問題。在云計算時代這些問題更加突出。
隨著容器技術的普及,人們意識到容器技術可以極大地降低成本。容器技術具有啟動快、體積小和分發迅速等諸多特點,這簡直就是開發人員夢寐以求的工具。 而“欣喜若狂”的不止是開發人員,還有運維人員。如果在十年前,普通企業要管理上百臺服務器,最可能使用的方法是通過Shell腳本的方式使用SSH連接到所有服務器然后執行相同的指令,并把日志保存起來歸檔。這種方式我們稱之為第一代運維。那時維護服務器是一項繁重的工作,工程師不得不把大量的時間耗費在服務器管理上。隨著技術的發展,虛擬化技術的普及和云計算的出現,企業需要管理的服務器數量大幅增長。過去我們只要管理企業內部數據中心的物理服務器,而現在則要管理遍布全球的服務器,運維成本愈發昂貴。于是開發者開始針對云計算時代服務器運維方式做出改變,涌現出了諸如Ansible、Puppet、SaltStack和Chef等出色的運維工具。人們可以通過這些工具快速地完成對上百臺甚至上千臺服務器的管理操作。這被稱之為第二代運維。它極大地解決了管理龐大服務器集群的難題,使人們可以在屏幕面前通過一個界面管理所有服務器。但本質上這些工具都是通過SSH或者類似于SSH的方式連接到服務器來管理服務器集群,這意味著其實第二代運維和第一代運維并沒有發生根本性的改變。
上面那些運維工具在云計算普及的大勢下很快暴露了它們的問題——速度。因為大部分運維工具依靠的是SSH連接來交換信息,這使得整個過程十分耗時,更不用說其他復雜的管理操作。而隨著容器技術的爆發,以Docker為代表的容器技術開始發力,并隨著DevOps概念的普及,使運維發生了根本性的改變。容器集群管理不再是通過低效的SSH來連接服務器,甚至不需要登錄服務器就可以完成對服務器的管理。人們發現,通過容器管理集群可以拋棄傳統的“SSH+秘鑰”的連接方式來連接服務器,這對大規模集群來說是一個極大的變革。而且在速度上,容器技術在上百臺服務器上啟動應用只需要一眨眼的時間,這使得運維的工作大大減輕。
運維和開發在容器時代逐步“融為一體”,形成一個流水線車間的工作環境。這對于軟件行業來說無疑是一次巨大的變革。
如果您也對傳統的軟件開發和運維的煩瑣流程感到吃力,又對容器技術感興趣,那么本書將是很好的入門書籍。如果您不是職業的開發和運維人員,對Linux也不算熟悉,但屬于一個對Docker感興趣的極客,想通過Docker部署一些復雜的應用,本書也一樣適合您。本書雖以Linux為平臺介紹Docker的使用,但是與在Windows和Mac OS平臺上的操作基本一致,普通用戶完全可以把Docker當做一個“好玩的工具”來使用,體驗Docker帶來的便捷。
本書適合新手入門,本書在基礎方面內容非常詳盡,包括鏡像的構建、容器的運行監控、網絡的管理、倉庫的應用、集群的部署等內容,全面、細致地介紹了Docker的基本使用方法與實現原理,適合新手入門。 應用結合實際。本書在實戰應用部分結合實際應用,從不同的角度分析問題并提出對應的解決辦法,擴展了很多實用的實戰技巧。實戰部分根據不同類型的開發環境構建基礎開發環境鏡像,使讀者可以直接使用Docker進入測試開發,并根據不同類型的應用部署做了詳細介紹。
前言
第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 容器技術的發展5
1.3 容器的原理7
1.3.1 從namespace說起7
1.3.2 認識Cgroups9
1.3.3 容器的創建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的現狀16
2.1.3 Docker的未來17
2.2 Docker的功能及優缺點18
2.2.1 Docker在解決什么18
2.2.2 為什么選擇Docker19
2.2.3 Docker的缺點19
2.3 Docker和虛擬機19
2.3.1 Docker與虛擬機的區別20
2.3.2 Docker與虛擬機的優缺點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系統27
3.1.1 一鍵安裝腳本27
3.1.2 Debian發行版28
3.1.3 Ubuntu發行版30
3.1.4 Centos/Fedora發行版33
3.1.5 Arch Linux發行版37
3.1.6 Suse/openSUSE發行版38
3.2 Windows與Mac OS系統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 創建容器的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 管理網絡的docker network命令62
4.1.21 管理節點的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 查看容器狀態的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 管理數據卷的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 創建鏡像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 導出鏡像到本地文件系統91
5.3.2 從本地文件系統導入鏡像91
5.4 發布鏡像91
5.4.1 發布鏡像到Docker Hub92
5.4.2 給鏡像打上標簽92
5.4.3 發布到第三方鏡像倉庫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 聯合掛載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的書寫規則98
6.1.3 基礎鏡像信息和維護者信息99
6.2 Dockerfile指令99
6.2.1 指定基礎鏡像的FR