# 第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社区简介
- 看完了