ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 第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系统的简约方法。