對于不同的團隊,生產環境意味著不同的東西。在本書中,我們所說的生產環境是指真實客戶用于運行代碼的環境。這是相對于開發環境、預演環境及測試環境而言的,后者的停機時間不會被客戶感知到。
在生產環境中,Docker有時是用于接收公共網絡流量的容器,有時則是用于處理來自隊列負荷的異步的后臺作業。不管哪種用途,在生產環境中運行Docker與在其他環境中運行相比,最主要的差異都是需要在其安全性與穩定性上投入較多的注意力。
編寫本書的動力之一是,與Docker相關的文檔和博客文章中缺乏對實際生產環境與其他環境的明確區分。我們認為,80%的Docker博客文章中的建議在嘗試在生產環境中運行6個月之后會被放棄(或至少修改)。為什么?因為大多數博客文章中舉的都是理想化的例子,使用了最新、最好用的工具,一旦某個極端的情況變成了致命缺陷,這些工具將被遺棄(或延期),被更簡單的方法所取代。這是Docker技術生態系統現狀的一個反映,而非技術博客的缺陷。
總的來說,生產環境很難管理。Docker簡化了從開發到生產的工作流程,但同時增加了安全和編排的復雜度(更多關于編排的內容參見第4章)。
為了節省時間,下面給出本書的重點綜述。
所有在生產環境中運行Docker的團隊,都會在傳統的安全最佳實踐上做出一項或多項妥協。如果無法完全信任容器內運行的代碼,那么就只得選用容器與虛擬機一對一的拓撲方式。對于很多團隊而言,在生產環境中運行Docker的優勢遠遠大于其帶來的安全與編排問題。如果遇到工具方面的問題,請等待一到兩個月,以便Docker社區對其進行修復,不要浪費時間去修補其他人的工具。保持Docker設置最小化。讓一切自動化。最后,對成熟的編排工具(如Mesos、Kubernates等)的需求遠比想象的要少得多。
### 功能內置與組合工具
Docker社區一個常見的口頭禪是“電池內置但可移除”,指的是將很多功能捆綁在一起的單體二進制文件,這有別于傳統Unix哲學下相對較小、功能單一、管道化的二進制文件。
這種單體式的做法是由兩個主要因素決定的:(1)使Docker易于開箱即用;(2)Golang缺少動態鏈接。Docker及多數相關工具都是用Google的[Go編程語言](https://golang.org/)編寫的,該語言可以簡化高并發代碼的編寫與部署。雖然Go是一門出色的編程語言,但用它來構建的Docker生態系統中也因此遲遲無法實現一個可插拔的架構,在這種架構中可以很容易用替代品對工具進行更換。
如果讀者有Unix系統背景,最好是編譯自己的精簡版Docker守護進程,以符合生產環境的需求。如果讀者有開發背景,預計到2015年下半年,Docker插件將成為現實[\[1\]](#anchor001)。在此期間,估計Docker生態系統中的工具將會出現明顯的重疊現象,某些情況下甚至是相互排斥的。
換句話說,要讓Docker運行于生產環境中,用戶的一半工作將是決定哪些工具對自己的技術棧最有意義。與DevOps所有事情一樣,先從最簡單的解決方案入手,然后在必要時增加其復雜性。
2015年5月,Docker公司發布了[Compose](https://docs.docker.com/compose/)、[Machine](https://docs.docker.com/machine/)及[Swarm](https://docs.docker.com/swarm/),與Docker生態系統內的同類工具進行競爭。所有這些工具都是可選的,請根據實際情況對其進行評估,而不要認為Docker公司提供的工具就一定是最佳解決方案。
探索Docker生態系統時的另一項關鍵建議是:評估每個開源工具的資金來源及其商業目標。目前,Docker公司和CoreOS經常發布工具,以爭奪關注度和市場份額。一個新工具發布后,最好等上幾個月,看看社區的反應,不要因為它看起來很酷就切換到最新、最好用的工具上。
- - - - - -
[[1]](#ac001) Docker 1.7版中正式引入了插件系統。——譯者注
- 版權信息
- 版權聲明
- 內容提要
- 對本書的贊譽
- 譯者介紹
- 前言
- 本書面向的讀者
- 誰真的在生產環境中使用Docker
- 為什么使用Docker
- 我們所說的“生產環境”
- 哪些東西不要Docker化
- 技術審稿人
- 第1章 入門
- 1.1 術語
- 1.2 從開發環境到生產環境
- 1.3 使用Docker的多種方式
- 1.4 可預期的情況
- 第2章 技術棧
- 2.1 構建系統
- 2.2 鏡像倉庫
- 2.3 宿主機管理
- 2.4 配置管理
- 2.5 部署
- 2.6 編排
- 第3章 示例:極簡環境
- 3.1 保持各部分的簡單
- 3.2 保持流程的簡單
- 3.3 系統細節
- 3.4 集群范圍的配置、通用配置及本地配置
- 3.5 部署服務
- 3.6 支撐服務
- 3.7 討論
- 3.8 未來
- 3.9 小結
- 第4章 示例:Web環境
- 4.1 編排
- 4.2 連網
- 4.3 數據存儲
- 4.4 日志
- 4.5 監控
- 4.6 無須擔心新依賴
- 4.7 零停機時間
- 4.8 服務回滾
- 4.9 小結
- 第5章 示例:Beanstalk環境
- 5.1 構建容器的過程
- 5.2 日志
- 5.3 監控
- 5.4 安全
- 5.5 小結
- 第6章 安全
- 6.1 威脅模型
- 6.2 容器與安全性
- 6.3 內核更新
- 6.4 容器更新
- 6.5 suid及guid二進制文件
- 6.6 容器內的root
- 6.7 權能
- 6.8 seccomp
- 6.9 內核安全框架
- 6.10 資源限制及cgroup
- 6.11 ulimit
- 6.12 用戶命名空間
- 6.13 鏡像驗證
- 6.14 安全地運行Docker守護進程
- 6.15 監控
- 6.16 設備
- 6.17 掛載點
- 6.18 ssh
- 6.19 私鑰分發
- 6.20 位置
- 第7章 構建鏡像
- 7.1 此鏡像非彼鏡像
- 7.2 鏡像構建基本原理
- 7.3 小結
- 第8章 存儲Docker鏡像
- 8.1 啟動并運行存儲的Docker鏡像
- 8.2 自動化構建
- 8.3 私有倉庫
- 8.4 私有registry的擴展
- 8.5 維護
- 8.6 對私有倉庫進行加固
- 8.7 保存/載入
- 8.8 最大限度地減小鏡像體積
- 8.9 其他鏡像倉庫方案
- 第9章 CI/CD
- 9.1 讓所有人都進行鏡像構建與推送
- 9.2 在一個構建系統中構建所有鏡像
- 9.3 不要使用或禁止使用非標準做法
- 9.4 使用標準基礎鏡像
- 9.5 使用Docker進行集成測試
- 9.6 小結
- 第10章 配置管理
- 10.1 配置管理與容器
- 10.2 面向容器的配置管理
- 10.3 小結
- 第11章 Docker存儲引擎
- 11.1 AUFS
- 11.2 DeviceMapper
- 11.3 BTRFS
- 11.4 OverlayFS
- 11.5 VFS
- 11.6 小結
- 第12章 Docker 網絡實現
- 12.1 網絡基礎知識
- 12.2 IP地址的分配
- 12.3 域名解析
- 12.4 服務發現
- 12.5 Docker高級網絡
- 12.6 IPv6
- 12.7 小結
- 第13章 調度
- 13.1 什么是調度
- 13.2 調度策略
- 13.3 Mesos
- 13.4 Kubernetes
- 13.5 OpenShift
- 第14章 服務發現
- 14.1 DNS服務發現
- 14.2 Zookeeper
- 14.3 基于Zookeeper的服務發現
- 14.4 etcd
- 14.5 consul
- 14.6 Eureka
- 14.7 Smartstack
- 14.8 nsqlookupd
- 14.9 小結
- 第15章 日志和監控
- 15.1 日志
- 15.2 監控
- 15.3 小結
- DockOne社區簡介
- 看完了