【实战】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的典型应用场景

时间: 2025-01-20 23:50:28

【实战】Docker的典型应用场景的相关文章

Docker的典型应用场景

相对于VM,docker在其轻量.配置复杂度以及资源利用率方面有着明显的优势. 随着docker技术的不断成熟,越来越多的企业开始考虑通过docker来改进自己的IT系统. 本文列举一些docker的实际应用场景,以期能够起到抛砖引玉的作用, 来帮助大家更加方便的使用docker. 应用打包 制作过RPM.GEM等软件包的同学可能很清楚,每一个软件包依赖于哪个库的哪个版本, 往往需要明确的写在依赖列表里.而依赖又往往分为编译时依赖和运行时依赖. 在传统的基础设施环境下,为了保证所生成的软件包在其

前端也应该了解点 docker 知识:docker 的理念与场景

我觉着你是看了题目点进来的.前端和 docker 这俩八竿子打不着的有毛关系?那接下来我们就扯一扯,看看能不能把它俩扯一块. 首先得达成共识,现在的前端已经不是以前的狭义的前端,如果指狭义的前端,那真是半毛钱关系都没有.但你我不可否认的是,现在是大前端的时代.什么是大前端,详细的应该大老板来给解释下,但是这里还是简单的去说一下: 前端有了 Node.js,扩展到了服务端的边界,未来有更多的可能. 前端现在也逐渐的正规化,工程化,编译,测试,发布逐渐完善. 我们是工程师,技术工种,抛开限定,多了解

阿里云的典型应用场景有哪些

阿里云典型应用场景 云服务器 ECS 应用非常广泛,既可以单独使用作为简单的 Web 服务器,也可以与其他阿里云产品(如 OSS.CDN 等)搭配提供强大的多媒体解决方案.以下是云服务器ECS的典型应用场景. 企业官网.简单的 Web 应用 网站初始阶段访问量小,只需要一台低配置的云服务器 ECS 即可运行应用程序.数据库.存储文件等.随着网站发展,您可以随时提高 ECS 的配置和增加数量,无需担心低配服务器在业务突增时带来的资源不足问题. 多媒体.大流量的 APP 或网站 云服务器 ECS 与

阿里云播放器SDK的正确打开方式 | 版本差异与三大典型应用场景(二)

阿里云播放器SDK(ApsaraVideo for Player SDK)是阿里视频云端到云到端服务的重要一环,除了支持点播和直播的基础播放功能外,还深度融合视频云业务,支持视频的加密播放.安全下载.首屏秒开.低延时等业务场景,为用户提供简单.快速.安全.稳定的视频播放服务.本文衔接上文,从版本.功能和典型应用场景等几个方面来介绍阿里云播放器SDK. 不同版本的播放器SDK 阿里云播放器SDK提供基础播放器.高级播放器和UI播放器三层框架满足不同用户.不同业务场景需求,开发者可根据自己的业务需求

细说社交化经销商服务的十大典型应用场景

这期云服务百言堂将用友优普运营经理沙猛介绍社交化的经销商服务.沙猛介绍道,用友从为企业提供财务软件的1.0时代.管理软件的2.0时代,到现在提供社会化商业服务平台的3.0时代,每一个时代的背景都是来源自企业用户的实际需求. 据了解,社会化商业背景下,传统企业需要整合包括营销.经销商.供应商资源,以及实体资源.制造资源等在内的企业资源,并通过整合这些资源更好地服务消费者. 其中,经销商服务的社交化是企业数字化转型中一个重要方向,利用互联网技术将企业成千上万的经销商进行聚合,建立经销商生态,将服务触

Redis开发运维实践开发者设计规范之典型使用场景参考

4.6 典型使用场景参考 下面是Redis适用的一些场景: 1. 取最新 N 个数据的操作 比如典型的取你网站的最新文章,通过下面方式,我们可以将最新的 5000条评论的ID放在Redis的List集合中,并将超出集合部分从数据库获取. 使用LPUSH latest.comments命令,向 list集合中插入数据 插入完成后再用 LTRIM latest.comments 0 5000 命令使其永远只保存最近5000个 ID 然后我们在客户端获取某一页评论时可以用下面的逻辑 FUNCTION

【Spring】Redis的两个典型应用场景--good

  原创 BOOT Redis简介 Redis是目前业界使用最广泛的内存数据存储.相比memcached,Redis支持更丰富的数据结构,例如hashes, lists, sets等,同时支持数据持久化.除此之外,Redis还提供一些类数据库的特性,比如事务,HA,主从库.可以说Redis兼具了缓存系统和数据库的一些特性,因此有着丰富的应用场景.本文介绍Redis在Spring Boot中两个典型的应用场景. 场景1:数据缓存 第一个应用场景是数据缓存,最典型的当属缓存数据库查询结果.对于高频读

zookeeper典型应用场景一览

ZooKeeper典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用. 应用中用到的一些配置信息放到ZK上进行集中管理.这类场景通常是这样:应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个Watcher,这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配置信息的

ZooKeeper 典型应用场景一览

ZooKeeper 典型应用场景一览 数据发布与订阅(配置中心) 发布与订阅模型,即所谓的配置中心,顾名思义就是发布者将数据发布到ZK节点上,供订阅者动态获取数据,实现配置信息的集中式管理和动态更新.例如全局的配置信息,服务式服务框架的服务地址列表等就非常适合使用. 1. 应用中用到的一些配置信息放到ZK上进行集中管理.这类场景通常是这样:应用在启动的时候会主动来获取一次配置,同时,在节点上注册一个Watcher,这样一来,以后每次配置有更新的时候,都会实时通知到订阅的客户端,从来达到获取最新配