Docker优雅使用指南
敏捷思想地图
敏捷思想和团队
Docker 的优点在于通过简化CI(持续集成)、CD(持续交付)的构建流程,让开发者把更多的精力用在开发上。
每家公司都有自己的开发技术栈,我们需要结合实际情况对其进行持续改进,优化自己的构建流程。
那在引入 Docker 技术的时候,遵循什么样的业界标准呢?大家会发现其实目前并没有什么最佳实践标准,常常以最佳实践为口号,引入多种工具链,导致在使用 Docker 的过程中没有侧重点。涉及到 Docker 选型,又在工具学习上花费大量时间,而不是选用合适的工具以组建可持续发布产品的开发团队。基于这样的场景,我们可以把“简单易用”的原则作为评判标准。
首先指定好整体构建蓝图,让团队的每一个成员都清晰知道流程,然后需要解决的是让团队成员尽快掌握 Docker 命令行的使用。
基础镜像
包括了操作系统命令行和类库的最小集合,一旦启用,所有应用都需要以它为基础创建应用镜像。Ubuntu 作为官方使用的默认版本,是目前最易用的版本,但系统没有经过优化,可以考虑使用第三方优化过的版本,比如 phusion-baseimage。
那我们为什么要使用优化过的基础镜像?拿baseimage来说,它提供了:
- 一个正确的 init进程
Baseimage-docker附带一个init进程/sbin/my_init,可以正确地处理孤立的子进程,并正确响应SIGTERM。这样你的容器就不会充满僵尸进程,并且docker stop可以正常工作。
- 修复了与Docker的APT不兼容问题:请参阅Docker问题#1024。
- syslog优化:它运行syslog守护程序,以便重要的系统消息不会丢失。
- cron守护进程:它运行一个cron守护进程,以便cronjobs工作。
- SSH服务器:允许您轻松登录容器以检查或管理事物。
对于选择 RHEL、CentOS 分支的 Base Image,提供安全框架 SELinux 的使用、块级存储文件系统 devicemapper 等技术,这些特性是不能和 Ubuntu 分支通用的。另外需要注意的是,使用的操作系统分支不同,其裁剪系统的方法也完全不同,所以大家在选择操作系统时一定要慎重。
配置管理工具
一般学习Docker时,主要用于基于 Dockerfile 来创建 Image 镜像的,考虑到在实际情况中,我们需要配置和维护Docker宿主机,对容器和镜像进行管理,对构建的进行配置。所以需要结合开发团队的现状,选择一款团队熟悉的工具作为通用工具。
配置工具有很多种选择:Chef、Ansible、Salt Stack、Puppet。其中 Ansible 作为后起之秀,具备简单、强大、无代理的特点。在配置管理的使用中体验非常简单易用,推荐大家参考使用。
Host主机系统
主机系统是Docker 后台进程的运行环境。从开发角度来看,它就是一台普通的单机 OS 系统,我们仅部署Docker 后台进程以及集群工具,所以希望 Host 主机系统的开销越小越好。这里推荐给大家的 Host 主机系统是 CoreOS,它是目前开销最小的主机系统。另外,还有红帽的开源 Atomic 主机系统,有基于Fedora、CentOS、RHEL多个版本的分支选择,也是不错的候选对象。
另外一种情况是选择最小安装操作系统,自己定制Host 主机系统。如果你的团队有这个实力,可以考虑自己定制这样的系统。
优雅实践指南
持续集成的构建系统
开发团队把代码提交到 Git 应用仓库的那一刻,我相信所有的开发者都希望有一个系统能帮助他们把这个应用程序部署到应用服务器上,以节省不必要的人工成本。但是,复杂的应用部署场景,让这个想法实现起来并不简单。
首先,我们需要有一个支持 Docker 的构建系统,这里推荐 Jenkins。它的主要特点是项目开源、方便定制、使用简单,完全拥抱docker。Jenkins 支持安装各种第三方插件,从而方便快捷的集成第三方的应用。
通过Jenkins 系统的 Job 触发机制,我们可以方便的创建各种类型的集成 Job 用例,但缺乏统一标准的 Job 用例使用方法,会导致项目 Job 用例使用的混乱,难于管理维护,这也让开发团队无法充分利用好集成系统的优势,当然这也不是我们期望的结果。所以,敏捷实践方法提出了一个可以持续交付的概念 DeploymentPipeline(管道部署)。通过Docker 技术,我们可以很方便的理解并实施这个方法。
Jenkins 的管道部署把部署的流程形象化成为一个长长的管道,每间隔一小段会有一个节点,也就是 Job,完成这个 Job 工作后才可以进入下一个环节。形式如下:
大家看到上图中的每一块面板在引入 Docker 技术之后,就可以使用 Docker 把任务模块化,然后做成有针对性的 Image 用来跑需要的任务。每一个任务 Image 的创建工作又可以在开发者自己的环境中完成,类似的场景可以参考下图:所以,使用 Docker 之后,任务的模块化很自然地被定义出来。通过管道图,可以查看每一步的执行时间。开发者也可以针对任务的需要,为每一个任务定义严格的性能标准,已作为之后测试工作的参考基础。
所以,使用 Docker 之后,任务的模块化很自然地被定义出来。通过管道图,可以查看每一步的执行时间。开发者也可以针对任务的需要,为每一个任务定义严格的性能标准,已作为之后测试工作的参考基础。
最佳的发布环境
应用经过测试,接下来我们需要把它发布到测试环境和生产环境。这个阶段中如何更合理地使用Docker 也是一个难点,开发团队需要考虑如何打造一个可伸缩扩展的分发环境。其实,这个环境就是基于 Docker 的私有云,更进一步我们可能期望的是提供 API 接口的 PaaS 云服务。为了构建此 PaaS 服务,这里推荐Google Kubernetes。
Kubernetes是一个容器集群管理工具,它提出两个概念:
1 Cluster control plane(AKA master),集群控制面板,内部包括多个组件来支持容器集群需要的功能扩展。
2 The Kubernetes Node,计算节点,通过自维护的策略来保证主机上服务的可用性,当集群控制面板发布指令后,也是异步通过 etcd 来存储和发布指令,没有集群控制链路层面的依赖。
通过官方架构设计文档的介绍,可以详细的了解每个组件的设计思想。这是目前业界唯一在生产环境部署经验的基础上推出的开源容器方案,目前是 CNCF 推荐的容器管理系统的行业参考标准。
需要的监控网站
这里介绍使用一个开源项目来监控容器的运行——Weave Scope,操作简单易用,初学者极力推荐。
首先,在宿主主机执行以下命令来安装和启动 Weave Scope:
sudo curl -L git.io/scope -o /usr/local/bin/scope //如果下载不下来,可以自己手动去下载再传到宿主机上
sudo chmod a+x /usr/local/bin/scope
scope launch
安装启动后,控制台会输出浏览器服务器 IP 地址和端口信息4040,访问这个URL地址就可以实时监控了:
点击对应的容器即可查看容器信息,包括 CPU 占用率,内存占用,端口映射表,开机时间,IP 地址,进程列表,环境变量等等。并且,通过这个监控网站上的界面操作,可以对容器做一些简单操作:停止,重启,attach,exec 等,提升一定的效率。
当然这是一个很简单的 Docker 容器监控方案,虽然使用者可以通过这个监控网站直接操作容器,所以无需登录宿主主机来进行相关操作,完美实现资源隔离。但是权限并没有做到独立,所以选择的时候要根据你的实际情况进行使用。
此外结合Kubernetes的使用,还可以监控整个集群,总之是一个不错的web监控方案。
镜像加速
方式一:
- 注册 DaoCloud https://account.daocloud.io/signup
- 使用加速功能
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
方式二:修改/etc/sysconfig/docker
vim /etc/sysconfig/docker
--registry-mirror={加速地址} 比如: --registry-mirror=http://f1361db2.m.daocloud.io https://yzcs6yua.mirror.aliyuncs.com
方式三:修改/etc/default/docker
echo "DOCKER_OPTS=\"\$DOCKER_OPTS --registry-mirror=http://f2d6cb40.m.daocloud.io\"" | sudo tee -a /etc/default/docker
配置好后要重启服务,并查看下是否带上了镜像参数,相关命令如下
service docker restart //重启服务
ps aux | grep docker // 查看启动参数
小结
Docker优雅实践方案,其实是一套灵活简单的敏捷解决方案,充分体现了DevOps思想。它克服了之前集群工具复杂、难用的困境,使用统一的 Docker 应用容器概念部署软件应用。
通过引入 Docker 技术,开发团队在面对复杂的生产环境中,可以结合自己团队的实际情况,定制出适合自己基础架构的开发测试运维一体化解决方案。
参考文档 :
https://www.jianshu.com/p/1a82f357c364
https://blog.csdn.net/qian1122221/article/details/82260644
http://guide.daocloud.io/dcs/daocloud-services-9152664.html