# 第2章 技術棧
生產環境的Docker設置包括了一些基本的架構組件,這些組件對運行容器化的及傳統的服務器集群來說是通用的。在很多方面,可以簡單地認為構建和運行容器的方式與當前構建和運行虛擬機的方式是一樣的,只是使用了一套新的工具和技術。
(1)構建并保存鏡像快照。
(2)將鏡像上傳到倉庫中。
(3)下載鏡像到某臺宿主機中。
(4)以容器方式運行鏡像。
(5)將容器連接到其他服務上。
(6)路由流量到容器中。
(7)將容器日志發送到指定位置。
(8)監控容器。
與虛擬機不同的是,容器通過將宿主機(裸機或虛擬機)與應用程序服務隔離,從而提供了更高的靈活性。這為構建和配備流程帶來了直接的改善,但由于額外的容器嵌入層,會增加一些開銷。
典型的Docker技術棧將包括用于解決以下關注點的組件:
- 構建系統;
- 鏡像倉庫;
- 宿主機管理;
- 配置管理;
- 部署;
- 編排;
- 日志;
- 監控。
- 如何構建鏡像,并將其推送到鏡像倉庫中?
- Dockerfile位于何處?
構建Docker鏡像通常有以下兩種方式。
(1)在開發人員電腦上手工構建,然后推送到到倉庫中。
(2)使用CI/CD系統在代碼提交時自動構建。
理想的Docker生產環境將使用類似Jenkins或Codeship這樣的CI/CD(配置集成/持續部署)系統,在代碼提交時自動構建鏡像。一旦容器構建完畢,它將被發送到鏡像倉庫中,自動化測試系統就可以從中下載并運行該鏡像。
- Docker鏡像保存在哪里?
當前的Docker鏡像倉庫可靠性比較差,但是每個月都在改善。Docker官方的鏡像[倉庫中心](https://registry.hub.docker.com)是眾所周知的不可靠,需要額外的重試和故障保護措施。多數團隊一般會在自己的基礎設施上運行私有的鏡像倉庫,以減少網絡傳輸成本和延遲。
- 如何配備宿主機?
- 如何升級宿主機?
由于Docker鏡像包含了應用及其依賴,宿主機管理系統通常只需要添加新服務器,配置訪問權限和防火墻,并安裝Docker守護進程即可。
類似亞馬遜的[EC2 Container Service](http://aws.amazon.com/ecs/)這類服務將消除對傳統宿主機管理的依賴。
- 如何定義容器的集群?
- 如何處理宿主機和容器運行時的配置?
- 如何管理密鑰和機密信息?
一個基本規則是:盡量避免使用傳統的配置管理系統。其增加的復雜性往往會造成故障。[Ansible](http://www.ansible.com/)、[SaltStack](http://saltstack.com/)、[Chef](https://www.chef.io/chef/)或[Puppet](https://puppetlabs.com/)這類工具僅用于配備帶有Docker守護進程的宿主機。盡可能試著擺脫對舊的配置管理系統的依賴,并使用本書所述的發現和集群技術轉移到自我配置的容器上。
- 如何將容器放置在宿主機上?
鏡像部署有以下兩種基本方法。
(1)**推送** ——部署或編排系統將鏡像推送給相關宿主機。
(2)**拉取** ——事先或按需從鏡像倉庫拉取鏡像。
- 如何將容器組織成集群?
- 在哪些服務器上運行容器?
- 如何調度服務器資源?
- 如何運行容器?
- 如何將流量路由給容器?
- 如何讓容器公開和發現服務?
“編排 = 強力膠帶”。至少多數情況下可以這么認為。
市面上有很多處于早期階段的全功能容器編排系統,如[Docker Swarm](https://docs.docker.com/swarm/)、[Kubernetes](http://kubernetes.io/)、[Mesos](http://mesos.apache.org/)和[Flynn](http://flynn.io/)。但對大多數團隊而言,這些系統通常過于強大,增加了在生產環境中出現問題時調試的復雜度。決定使用哪個工具來完成編排常常是設置和運行Docker中最艱難的部分。
在第3章中,我們將講述Peerspace所采取的一種構建Docker系統的簡約方法。
- 版權信息
- 版權聲明
- 內容提要
- 對本書的贊譽
- 譯者介紹
- 前言
- 本書面向的讀者
- 誰真的在生產環境中使用Docker
- 為什么使用Docker
- 開發環境與生產環境
- 我們所說的“生產環境”
- 功能內置與組合工具
- 哪些東西不要Docker化
- 技術審稿人
- 第1章 入門
- 1.1 術語
- 1.1.1 鏡像與容器
- 1.1.2 容器與虛擬機
- 1.1.3 持續集成/持續交付
- 1.1.4 宿主機管理
- 1.1.5 編排
- 1.1.6 調度
- 1.1.7 發現
- 1.1.8 配置管理
- 1.2 從開發環境到生產環境
- 1.3 使用Docker的多種方式
- 1.4 可預期的情況
- 為什么Docker在生產環境如此困難
- 第2章 技術棧
- 2.1 構建系統
- 2.2 鏡像倉庫
- 2.3 宿主機管理
- 2.4 配置管理
- 2.5 部署
- 2.6 編排
- 第3章 示例:極簡環境
- 3.1 保持各部分的簡單
- 3.2 保持流程的簡單
- 3.3 系統細節
- 利用systemd
- 3.4 集群范圍的配置、通用配置及本地配置
- 3.5 部署服務
- 3.6 支撐服務
- 3.7 討論
- 3.8 未來
- 3.9 小結
- 第4章 示例:Web環境
- 4.1 編排
- 4.1.1 讓服務器上的Docker進入準備運行容器的狀態
- 4.1.2 讓容器運行
- 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.1.1 寫時復制與高效的鏡像存儲與分發
- 7.1.2 Docker對寫時復制的使用
- 7.2 鏡像構建基本原理
- 7.2.1 分層的文件系統和空間控管
- 7.2.2 保持鏡像小巧
- 7.2.3 讓鏡像可重用
- 7.2.4 在進程無法被配置時,通過環境變量讓鏡像可配置
- 7.2.5 讓鏡像在Docker變化時對自身進行重新配置
- 7.2.6 信任與鏡像
- 7.2.7 讓鏡像不可變
- 7.3 小結
- 第8章 存儲Docker鏡像
- 8.1 啟動并運行存儲的Docker鏡像
- 8.2 自動化構建
- 8.3 私有倉庫
- 8.4 私有registry的擴展
- 8.4.1 S3
- 8.4.2 本地存儲
- 8.4.3 對registry進行負載均衡
- 8.5 維護
- 8.6 對私有倉庫進行加固
- 8.6.1 SSL
- 8.6.2 認證
- 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.2.1 Chef
- 10.2.2 Ansible
- 10.2.3 Salt Stack
- 10.2.4 Puppet
- 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
- Red Hat公司首席工程師Clayton Coleman的想法
- 第14章 服務發現
- 14.1 DNS服務發現
- DNS服務器的重新發明
- 14.2 Zookeeper
- 14.3 基于Zookeeper的服務發現
- 14.4 etcd
- 基于etcd的服務發現
- 14.5 consul
- 14.5.1 基于consul的服務發現
- 14.5.2 registrator
- 14.6 Eureka
- 基于Eureka的服務發現
- 14.7 Smartstack
- 14.7.1 基于Smartstack的服務發現
- 14.7.2 Nerve
- 14.7.3 Synapse
- 14.8 nsqlookupd
- 14.9 小結
- 第15章 日志和監控
- 15.1 日志
- 15.1.1 Docker原生的日志支持
- 15.1.2 連接到Docker容器
- 15.1.3 將日志導出到宿主機
- 15.1.4 發送日志到集中式的日志平臺
- 15.1.5 在其他容器一側收集日志
- 15.2 監控
- 15.2.1 基于宿主機的監控
- 15.2.2 基于Docker守護進程的監控
- 15.2.3 基于容器的監控
- 15.3 小結
- DockOne社區簡介
- 看完了