【实战】Docker的典型应用场景

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 本文讲的是【实战】Docker的典型应用场景,【编者的话】Docker技术已日趋成熟,但很多新接触Docker的朋友可能对「Docker到底能用来干什么」这一问题比较纠结。本文总结了一些作者在应用打包、多版本混合部署、升级回滚、多租户资源隔离以及内部开发环境方面使用Docker的一些经验,希望能抛砖引玉,给Docker的观望者一些启发。
本文讲的是【实战】Docker的典型应用场景 【编者的话】Docker技术已日趋成熟,但很多新接触Docker的朋友可能对「Docker到底能用来干什么」这一问题比较纠结。本文总结了一些作者在应用打包、多版本混合部署、升级回滚、多租户资源隔离以及内部开发环境方面使用Docker的一些经验,希望能抛砖引玉,给Docker的观望者一些启发。

相对于VM,Docker在其轻量、配置复杂度以及资源利用率方面有着明显的优势。 随着Docker技术的不断成熟,越来越多的企业开始考虑通过Docker来改进自己的IT系统。

本文列举一些Docker的实际应用场景,以期能够起到抛砖引玉的作用, 来帮助大家更加方便的使用Docker。

应用打包

制作过RPM、GEM等软件包的同学可能很清楚,每一个软件包依赖于哪个库的哪个版本, 往往需要明确的写在依赖列表里。依赖又往往分为编译时依赖和运行时依赖。

在传统的基础设施环境下,为了保证所生成的软件包在其它机器上可正常安装且运行, 一般需要在打包之前创建个干净的虚拟机,或者手工创建个chroot环境, 然后在这个干净的环境下安全各种依赖包,然后执行打包脚本。 生成软件包以后,需要再创建一个干净的环境安装、运行这个软件包,来验证是否符合预期。 这样虽然也能完成打包工作,但至少有以下缺点:
  • 耗时耗力
  • 依赖关系容易漏掉,比如:在干净的环境中经过多次调试,把缺少的依赖包一个一个的装上了, 但最后写spec文件时却忘记添加某个依赖,导致下次打包时需要重新调试或者打包后软件包无法使用等问题。

通过Docker可以很好的解决打包问题。具体作法如下:
  • “干净的打包环境”很容易准备,Docker官方提供的ubuntu、centos等系统镜像天生就能作为纯净无污染的打包环境使用
  • Dockerfile本身能起到文档固化的作用,只要写好Dockerfile,创建好打包镜像,以后就能无限次重复使用这个镜像进行打包

示例:

我们要为某个PHP扩展模块(如:php-redis)制作个RPM包。

首先,需要写个用于创建打包镜像的Dockerfile,内容如下:
FROM centos:centos6  
RUN yum update -y  
RUN yum install -y php-devel rpm-build tar gcc make  
RUN mkdir -p /rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} && \  
echo '%_topdir /rpmbuild' > ~/.rpmmacros
ADD http://pecl.php.net/get/redis-2.2.7.tgz /rpmbuild/SOURCES/redis-2.2.7.tgz  
ADD https://gist.githubusercontent.com/mountkin/5175c213585d485db31e/raw/02f6dce79e12b692bf39d6337f0cfa72813ce9fb/php-redis.spec /redis.spec  
RUN rpmbuild -bb /redis.spec  

然后执行 docker build -t php-redis-builder .  执行成功后,就会生成我们需要的RPM包。

接下来,执行以下命令把生成的软件包从Docker镜像中复制出来:
[ -d /rpms ] || mkdir /rpms
docker run --rm -v /rpms:/rpms:rw php-redis-builder cp /rpmbuild/RPMS/x86_64/php-redis-2.2.7-1.el6.x86_64.rpm /rpms/  

然后/rpms目录下就会有我们刚刚制作的RPM包。

最后,软件包的验证过各也非常简单,只需要新创建一个docker镜像,把新生成的软件包添加进去并安装即可。

Dockerfile如下(为了ADD RPM文件,需要保存在/rpms目录下):
FROM centos:centos6  
ADD php-redis-2.2.7-1.el6.x86_64.rpm /php-redis-2.2.7-1.el6.x86_64.rpm  
RUN yum localinstall -y /php-redis-2.2.7-1.el6.x86_64.rpm  
RUN php -d "extension=redis.so" -m |grep redis  

在/rpms目录下执行  docker build -t php-redis-validator .  如果执行成功,则表明RPM包可正常工作。

多版本混合部署

随着产品的不断更新换代,一台服务器上部署多个应用或者同一个应用的多个版本在企业内部非常常见。

但一台服务器上部署同一个软件的多个版本,文件路径、端口等资源往往会发生冲突,造成多个版本无法共存的问题。

如果用docker,这个问题将非常简单。由于每个容器都有自己独立的文件系统,所以根本不存在文件路径冲突的问题; 对于端口冲突问题,只需要在启动容器时指定不同的端口映射即可解决问题。

升级回滚

一次升级,往往不仅仅是应用软件本身的升级,通过还会包含依赖项的升级。 但新旧软件的依赖项很可能是不同的,甚至是有冲突的,所以在传统的环境下做回滚一般比较困难。

如果使用Docker,我们只需要每次应用软件升级时制作一个新的Docker镜像,升级时先停掉旧的容器, 然后把新的容器启动。 需要回滚时,把新的容器停掉,旧的启动即可完成回滚,整个过程各在秒级完成,非常方便。

多租户资源隔离

资源隔离对于提供共享hosting服务的公司是个强需求。 如果使用VM,虽然隔离性非常彻底,但部署密度相对较低,会造成成本增加。

Docker容器充分利用linux内核的namespaces提供资源隔离功能。 

结合cgroup,可以方便的设置某个容器的资源配额。 既能满足资源隔离的需求,又能方便的为不同级别的用户设置不同级别的配额限制。

但在这种应用场景下,由于容器中运行的程序对于hosting服务提供方来说是不可信的, 所以需要特殊的手段来保证用户无法从容器中操作到宿主机的资源(即:越狱,尽管这种问题发生的概率很小,但安全无小事,多一层防护肯定让人更加放心)。

安全及隔离性加固方面,可考虑以下措施:
  • 通过iptables阻断从容器到所有内网IP的通信(当然如果需要也可以针对特定的IP/端口开放权限)
  • 通过selinux或者apparmor限制某个容器所能访问的资源
  • 对某些sysfs或者procfs目录,采用只读方式挂载
  • 通过grsec来加固系统内核
  • 通过cgroup对内存、CPU、磁盘读写等资源进行配额控制
  • 通过tc对每个容器的带宽进行控制

另外我们在实际测试中发现系统的随机数生成器很容易因熵源耗尽而发生阻塞。 在多租户共享环境下需要在宿主机上启用rng-tools来补充熵源。

这个应用场景下有很多工作是docker本身所不能提供的,并且实施起来需要关注的细节比较多。 为此我们提供了安全加强版Docker管理平台,可完美解决以上问题。 需要的朋友可以通过 csphere官网 了解更多细节。

内部开发环境

在容器技术出现之前,公司往往是通过为每个开发人员提供一台或者多台虚拟机来充当开发测试环境。

开发测试环境一般负载较低,大量的系统资源都被浪费在虚拟机本身的进程上了。

Docker容器没有任何CPU和内存上的额外开销,很适合用来提供公司内部的开发测试环境。 
而且由于Docker镜像可以很方便的在公司内部分享,这对开发环境的规范性也有极大的帮助。

如果要把容器作为开发机使用,需要解决的是远程登录容器和容器内进程管理问题。 虽然Docker的初衷是为“微服务”架构设计的,但根据我们的实际使用经验, 在Docker内运行多个进程,甚至sshd或者upstart也是可行的。

后记

以上总结了我们在实际开发和生产环境中使用Docker的一些场景, 以及在每种情况下遇到的问题和相应的解决方法,希望对有意使用Docker的朋友有所启发。 同时我们也欢迎更多的朋友分享关于Docker的使用经验。

原文链接: Docker的典型应用场景(作者:魏世江 审校:李颖杰)  

===========================

作者介绍:
魏世江,NiceScale联合创始人,长期从事DevOps相关研发工作。 专注于Linux环境Web应用及周边服务的配置管理自动化。擅长使用go语言及PHP语言, 对容器技术有一定的研究,目前正集中精力做基于docker的企业级解决方案。 创业之前在新浪云平台(SAE)任技术经理。欢迎志同道合的朋友以各种方式勾搭骚扰。微博:  @魏世江  Email:  mountkin@gmail.com

原文发布时间为:2015-03-11
本文作者:mountkin
本文来自云栖社区合作伙伴DockerOne,了解相关信息可以关注DockerOne。
原文标题:【实战】Docker的典型应用场景
相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
9天前
|
关系型数据库 MySQL Shell
4.Docker 应用部署
4.Docker 应用部署
|
11天前
|
Serverless 应用服务中间件 开发工具
Serverless 应用引擎产品使用之阿里函数计算中,在本地进行调试,并且需要用到Docker如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
22 0
|
1天前
|
存储 安全 数据安全/隐私保护
【Docker 专栏】Docker 容器化应用的备份与恢复策略
【5月更文挑战第9天】本文探讨了Docker容器化应用的备份与恢复策略,强调了备份在数据保护、业务连续性和合规要求中的关键作用。内容涵盖备份的重要性、内容及方法,推荐了Docker自带工具和第三方工具如Portainer、Velero。制定了备份策略,包括频率、存储位置和保留期限,并详细阐述了恢复流程及注意事项。文章还提及案例分析和未来发展趋势,强调了随着技术发展,备份与恢复策略将持续演进,以应对数字化时代的挑战。
【Docker 专栏】Docker 容器化应用的备份与恢复策略
|
1天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
1天前
|
存储 安全 数据库
【Docker 专栏】Docker 容器内应用的状态持久化
【5月更文挑战第9天】本文探讨了Docker容器中应用状态持久化的重要性,包括数据保护、应用可用性和历史记录保存。主要持久化方法有数据卷、绑定挂载和外部存储服务。数据卷是推荐手段,可通过`docker volume create`命令创建并挂载。绑定挂载需注意权限和路径一致性。利用外部存储如数据库和云服务可应对复杂需求。最佳实践包括规划存储策略、定期备份和测试验证。随着技术发展,未来将有更智能的持久化解决方案。
【Docker 专栏】Docker 容器内应用的状态持久化
|
1天前
|
机器学习/深度学习 人工智能 异构计算
【Docker 专栏】Docker 与 GPU 加速应用的结合
【5月更文挑战第9天】GPU加速技术在处理大规模数据和复杂计算时展现强大性能,尤其在AI和深度学习领域。Docker作为轻量级容器化工具,提供隔离、可移植和高效的环境。结合GPU加速,关键在于容器访问GPU设备和安装相应驱动。NVIDIA提供了支持工具,允许Docker利用GPU。应用场景包括人工智能、科学计算和视频处理。优势包括资源利用率提升和部署灵活性,但面临驱动兼容性、资源管理和监控调试的挑战。未来,随着技术发展,Docker与GPU加速在边缘计算中的应用将有广阔前景。
【Docker 专栏】Docker 与 GPU 加速应用的结合
|
2天前
|
存储 Prometheus 监控
【Docker 专栏】Docker 容器内应用的调试与故障排除
【5月更文挑战第8天】本文探讨了Docker容器内应用的调试与故障排除,强调其重要性。方法包括:通过日志排查、进入容器检查、使用监控工具及检查容器配置。常见问题涉及应用启动失败、性能问题、网络连接和数据存储。案例分析展示了实战场景,注意事项提醒避免不必要的容器修改、备份数据和理解应用架构。掌握这些技能能确保Docker应用的稳定运行和性能优化。
【Docker 专栏】Docker 容器内应用的调试与故障排除
|
2天前
|
开发框架 安全 网络安全
【Docker 专栏】Docker 多平台应用构建与部署
【5月更文挑战第8天】Docker作为一种关键的容器化技术,简化了多平台应用的构建与部署。它提供一致的运行环境,确保应用在不同平台无缝运行;通过分层构建机制加速镜像创建,提升开发效率。Docker的可移植性、高效部署及资源利用率是其主要优势。流程包括开发环境准备、构建镜像、测试验证及部署。然而,面临操作系统差异、网络安全和资源限制等挑战,需注意安全、版本管理和性能优化。Docker在多平台场景的应用将持续发挥价值。
【Docker 专栏】Docker 多平台应用构建与部署
|
2天前
|
存储 缓存 监控
【Docker 专栏】Docker 容器性能调优实战
【5月更文挑战第8天】本文探讨了Docker容器的性能调优技巧,包括理解容器性能指标(如CPU、内存、网络和磁盘I/O)并进行相应调优。重点讲述了CPU和内存的限制设置,网络配置优化以及磁盘I/O性能提升方法。通过实例展示了如何解决高CPU使用率问题,强调了根据应用需求进行调优的重要性,以实现更高效、稳定的容器运行。
【Docker 专栏】Docker 容器性能调优实战
|
3天前
|
Kubernetes Cloud Native 持续交付
【Docker专栏】Kubernetes与Docker:协同构建云原生应用
【5月更文挑战第7天】本文探讨了Docker和Kubernetes如何协同构建和管理云原生应用。Docker提供容器化技术,Kubernetes则负责容器的部署和管理。两者结合实现快速部署、自动扩展和高可用性。通过编写Dockerfile创建镜像,然后在Kubernetes中定义部署和服务进行应用暴露。实战部分展示了如何部署简单Web应用,包括编写Dockerfile、构建镜像、创建Kubernetes部署配置以及暴露服务。Kubernetes还具备自动扩展、滚动更新和健康检查等高级特性,为云原生应用管理提供全面支持。
【Docker专栏】Kubernetes与Docker:协同构建云原生应用