《容器技術係列》一導讀
前 言
Docker是什麼
Docker從2013年誕生,短短兩年時間就在全球IT技術圈內迅速走紅,實乃技術圈內不可忽視的一陣颶風。然而,Docker是什麼,Docker帶來了什麼?
Docker官方如此描述Docker:“Build, Ship, Run. An open platform for distributed applications for developers and sysadmins”。換言之,Docker為開發者與係統管理者提供了分布式應用的開放平台,從而可以便捷地構建、遷移與運行分布式應用。
多年來,IT行業中開發與運維一直是兩個界限清晰的詞。開發工程師專門從事軟件的開發工作,最終交付軟件代碼;運維工程師則部署前者交付的軟件,並接管軟件的運行與管理。然而,在長時間的實踐過程中,開發與運維分離的方式難免存在弊病,兩者職責的過分清晰導致軟件效率的降低。隨著分布式係統的流行,係統規模越來越大,軟件越來越複雜,係統環境配置暴露的問題層出不窮。究其緣由,還是因為開發人員缺少軟件運行環境的認知,而運維人員對軟件邏輯所知甚少。在這樣的背景下,DevOps橫空出世,提倡開發與運維不可分割,協調並進。
Docker無疑是DevOps大潮中最具實踐價值的不二法寶。Docker從Linux內核的角度出發,屬於輕量級虛擬化技術,有能力秒級提供應用隔離環境,完成雲計算時代分布式應用的第一需求“隔離”。另外,Docker的鏡像技術利用聯合文件係統的優勢,自下至上打包係統軟件、係統環境以及軟件程序,將運行環境與應用程序靈活地結合,快速運行Docker化的應用程序。同時,可讀性極強的Dockerfile,極大地簡化鏡像的複雜性,並為鏡像的轉移與重新構建提供了可能性。
Docker提供輕便的資源分配方式,解決應用運行與係統環境的依賴,彌合應用跨節點遷移的鴻溝,種種特性都表明Docker幾乎就是為“雲計算”而生的。如今,Docker社區不斷擴大並健康發展,多家國際IT巨頭也紛紛宣布支持Docker,這一切更是讓全球IT人士對Docker的未來充滿信心。
本書的內容
本書是一本引導讀者了解Docker實現原理的技術普及書。筆者一直堅信,了解軟件或者係統最直接、最透徹的方式就是研讀它們的源碼。“源碼即文檔”也是鼓勵開發者能更多地從源碼的角度去學習軟件或係統的本質。
本書的內容主要集中於3個部分:Docker的架構,Docker的模塊,Docker的三駕馬車Swarm、Machine以及Compose。
第一部分,主要從宏觀的角度和讀者一起領略Docker的架構設計,並初步介紹架構中各模塊的職責。
第二部分是本書的主體部分,主要針對Docker中多個重要的模塊進行具體深入分析,包括:Docker Client、Docker Daemon、Docker Server、Docker網絡、Docker鏡像、Docker容器等。讀者可以發現,Docker 的模塊之間耦合度非常低,很適合循序漸進,層層深入。第2章至第8章主要從Docker軟件的架構入手,勾勒骨架;第9章至第11章重點討論Docker鏡像技術,夯實基礎;第12章至第14章則進一步分析Docker容器的始末,闡述本質。
第三部分介紹Docker生態三駕馬車Swarm、Machine、Compose。Docker擁有強大的單機能力,三駕馬車可以很好地補充Docker的跨主機能力以及部署能力。讀者可以通過第15章至第17章感受Docker生態圈中其他功能強大的軟件。
希望本書能夠讓讀者最大化地感受Docker的神奇與魅力。
關於勘誤
由於時間與水平都比較有限,因此本書難免會存在一些紕漏和錯誤。如果讀者發現了問題,請及時與我聯係。我也會在本書後續的版本中加以改正。我的郵箱是:allen.sun@daocloud.io。我非常希望和大家一起學習與討論Docker,並共同推動Docker在社區的發展。
致謝
最後,向本書編寫過程中給予我巨大幫助的人們表示最誠摯的感謝。感謝我的父母,沒有他們的鼓勵和支持,此書不可能在如此短的時間內完成。感謝我的母校浙江大學以及SEL實驗室的老師與同學們,是他們在我求學過程中給予無私的指引與幫助。感謝我的同事熊中祥,是他在本書編寫過程中提出了很多寶貴的建議,尤其在Machine和Compose部分。感謝我的同事喻勇和馮釗,他們為本書的編寫做了很多溝通與協調工作。最後,還要感謝華章公司的編輯們,她們認真細致的工作,使本書以完美的形式展現給各位讀者。
目 錄
第1章 Docker架構
1.1 引言
1.2 Docker總架構圖
1.3 Docker各模塊功能與實現分析
1.4 Docker運行案例分析
1.5 總結
第2章 Docker Client創建與命令執行
2.1 引言
2.2 創建Docker Client
2.3 Docker命令執行
2.4 總結
第3章 啟動Docker Daemon
3.1 引言
3.2 Docker Daemon的啟動流程
3.3 mainDaemon()的具體實現
3.4 總結
第4章 Docker Daemon之NewDaemon實現
4.1 引言
4.2 NewDaemon具體實現
4.3 應用配置信息
4.3.1 配置Docker容器的MTU
4.3.2 檢測網橋配置信息
4.3.3 查驗容器間的通信配置
4.3.4 處理網絡功能配置
4.3.5 處理PID文件配置
4.4 檢測係統支持及用戶權限
4.5 配置工作路徑
4.6 加載並配置graphdriver
4.6.1 創建graphdriver
4.6.2 驗證btrfs與SELinux的兼容性
4.6.3 創建容器倉庫目錄
4.6.4 遷移容器至aufs類型
4.6.5 創建鏡像graph
4.6.6 創建volumesdriver以及volumes graph
4.6.7 創建TagStore
4.7 配置Docker Daemon網絡環境
4.7.1 創建Docker網絡設備
4.7.2 啟用iptables功能
4.7.3 啟用係統數據包轉發功能
4.7.4 創建DOCKER鏈
4.7.5 注冊處理方法至Engine
4.8 創建graphdb並初始化
4.9 創建execdriver
4.10 創建daemon實例
4.11 檢測DNS配置
4.12 啟動時加載已有Docker容器
4.13 設置shutdown的處理方法
4.14 返回daemon對象實例
4.15 總結
第5章 Docker Server的創建
5.1 引言
5.2 Docker Server創建流程
5.2.1 創建名為“serveapi”的Job
5.2.2 配置Job環境變量
5.2.3 運行Job
5.3 ServeApi運行流程
5.4 ListenAndServe實現
5.4.1 創建router路由實例
5.4.2 創建listener監聽實例
5.4.3 創建http.Server
5.4.4 啟動API服務
5.5 總結
第6章 Docker Daemon網絡
6.1 引言
6.2 Docker Daemon網絡介紹
6.3 Docker Daemon網絡配置接口
6.4 Docker Daemon網絡初始化
6.4.1 啟動Docker Daemon傳遞flag參數
6.4.2 解析網絡flag參數
6.4.3 預處理flag參數
6.4.4 確定Docker網絡模式
6.5 創建Docker網橋
6.5.1 提取環境變量
6.5.2 確定Docker網橋設備名
6.5.3 查找bridgeIface網橋設備
6.5.4 bridgeIface已創建
6.5.5 bridgeIface未創建
6.5.6 獲取網橋設備的網絡地址
6.5.7 配置Docker Daemon的iptables
6.5.8 配置網絡設備間數據報轉發功能
6.5.9 注冊網絡Handler
6.6 總結
第7章 Docker容器網絡
7.1 引言
7.2 Docker容器網絡模式
7.2.1 bridge橋接模式
7.2.2 host模式
7.2.3 other container模式
7.2.4 none模式
7.3 Docker Client配置容器網絡模式
7.3.1 使用Docker Client
7.3.2 runconfig包解析
7.3.3 CmdRun執行
7.4 Docker Daemon創建容器網絡流程
7.4.1 創建容器之網絡配置
7.4.2 啟動容器之網絡配置
7.5 execdriver網絡執行流程
7.5.1 創建libcontainer的Config對象
7.5.2 調用libcontainer的namespaces啟動容器
7.6 libcontainer實現內核態網絡配置
7.6.1 創建exec.Cmd
7.6.2 啟動exec.Cmd創建進程
7.6.3 為容器進程初始化網絡環境
7.7 總結
第8章 Docker鏡像
8.1 引言
8.2 Docker鏡像介紹
8.3 rootfs
8.4 Union Mount
8.5 image
8.6 layer
8.7 總結
第9章 Docker鏡像下載
9.1 引言
9.2 Docker鏡像下載流程
9.3 Docker Client
9.3.1 解析鏡像參數
9.3.2 配置認證信息
9.3.3 發送API請求
9.4 Docker Server
9.4.1 解析請求參數
9.4.2 創建並配置Job
9.4.3 觸發執行Job
9.5 Docker Daemon
9.5.1 解析Job參數
9.5.2 創建session對象
9.5.3 執行鏡像下載
9.6 總結
第10章 Docker鏡像存儲
10.1 引言
10.2 鏡像注冊
10.3 驗證鏡像ID
10.4 創建鏡像路徑
10.4.1 創建mnt、diff和layers子目錄
10.4.2 掛載祖先鏡像並返回根目錄
10.5 存儲鏡像內容
10.5.1 解壓鏡像內容
10.5.2 收集鏡像大小並記錄
10.5.3 存儲jsonData信息
10.6 注冊鏡像ID
10.7 總結
第11章 docker build實現
11.1 引言
11.2 docker build執行流程
11.2.1 Docker Client與docker build
11.2.2 Docker Server與docker build
11.2.3 Docker Daemon與docker build
11.3 Dockerfile命令解析流程
11.4 Dockerfile命令分析
11.4.1 FROM命令
11.4.2 RUN命令
11.4.3 ENV命令
11.5 總結
第12章 Docker容器創建
12.1 引言
12.2 Docker容器運行流程
12.3 Docker Daemon創建容器對象
12.3.1 LookupImage
12.3.2 CheckDepth
12.3.3 mergeAndVerifyConfig
12.3.4 newContainer
12.3.5 createRootfs
12.3.6 ToDisk
12.3.7 Register
12.4 Docker Daemon啟動容器
12.4.1 setupContainerDns
12.4.2 Mount
12.4.3 initializeNetworking
12.4.4 verifyDaemonSetting
12.4.5 prepareVolumesForContainer
12.4.6 setupLinkedContainers
12.4.7 setupWorkingDirectory
12.4.8 createDaemonEnvironment
12.4.9 populateCommand
12.4.10 setupMountsForContainer
12.4.11 waitForStart
12.5 總結
第13章 dockerinit啟動
13.1 引言
13.2 dockerinit介紹
13.2.1 dockerinit初始化內容
13.2.2 dockerinit與Docker Daemon
13.3 dockerinit執行入口
13.3.1 createCommand分析
13.3.2 namespace.exec
13.4 dockerinit運行
13.4.1 reexec.Init()的分析 208
13.4.2 dockerinit的執行流程 210
13.5 libcontainer的運行
13.5.1 Docker Daemon設置cgroups參數
13.5.2 Docker Daemon創建網絡棧資源
13.5.3 dockerinit配置網絡棧
13.5.4 dockerinit初始化mount namespace
13.5.5 dockerinit完成namespace配置
13.5.6 dockerinit執行用戶命令Entrypoint
13.6 總結
第14章 libcontainer介紹
14.1 引言
14.2 Docker、libcontainer以及LXC的關係
14.3 libcontainer模塊分析
14.3.1 namespace
14.3.2 cgroup
14.3.3 網絡
14.3.4 掛載
14.3.5 設備
14.3.6 nsinit
14.3.7 其他模塊
14.4 總結
第15章 Swarm架構設計與實現
15.1 引言
15.2 Swarm架構
15.2.1 Swarm Node
15.2.2 Docker Node
15.2.3 node discovery
15.2.4 scheduler
15.3 Swarm命令
15.3.1 swarm create
15.3.2 swarm manage
15.3.3 swarm join
15.3.4 swarm list
15.4 總結
第16章 Machine架構設計與實現
16.1 引言
16.2 Machine架構
16.2.1 Machine
16.2.2 Store
16.2.3 Host
16.2.4 Driver
16.2.5 Provisioner
16.2.6 Machine運行流程
16.3 Machine與Swarm的結合
16.4 總結
第17章 Compose架構設計與實現
17.1 引言
17.2 Compose介紹
17.3 Compose架構
17.4 Compose評價
17.4.1 Compose單機能力
17.4.2 Compose跨節點能力
17.4.3 Compose與Swarm
17.5 總結
最後更新:2017-06-21 15:31:56