查看原文
其他

狂爱docker,需要付出什么“代价”才能得到它?

2015-11-18 张春源 DBAplus社群




11月16日,由希云docker开源免费实训课程专家张春源老师在“中间件用户组”进行了一次关于“狂爱docker,需要付出什么“代价”才能得到它?”的线上主题分享。小编特别整理出其中精华内容,供大家学习交流。


嘉宾简介



  • 就职于希云cSphere,希云docker开源免费实训课程专家。

  • 国内最早期的Docker实践者,在生产环境拥有一年多的Docker容器管理经历。

  • 深刻理解Docker对于开发、测试以及运维的价值。

  • 擅长利用Docker构建整个DevOps自动化平台。

  • 热爱专研Dockerfile,以及docker周围的技术,对CoreOS有深入研究。



演讲实录


docker为什么如此火热?


个人觉得,搞技术的最终都是要去解决生活中的问题,光搞技术带不来什么价值。所以我们先来回顾一下:第一艘集装箱船是美国于1957年用一艘货船改装而成的。它的装卸效率比常规杂货船大10倍,停港时间大为缩短,并减少了运输装卸中的货损。从此,集装箱船得到迅速发展。




集装箱的优点:

  • 节省劳动力,减少运输费用

  • 减少货物损耗和损坏,保证货物质量

  • 集装箱装卸效率高

  • 规格标准化,易运输


现在集装箱已经为我们的生活带来的很大的变化,集装箱更是运输行业的一次重大革命。




docker中文意思是码头工人,他的职责应该是管理集装箱--容器containers.所以火热的应该是容器技术,而docker是容器技术的代表。Coreos官方也推出了rkt来运行容器。既然是容器技术如此火热,那么容器技术有哪些特点,让企业和IT人员如此热爱?


1.可以提升研发和测试的效率,生成运行环境更容易

2.更容易实现devops

3.研发以镜像作为交付,让环境一致化

4.开发,测试,运维协作更容易

5.一次构建(build),多处运行

...等等优势




什么是docker,给企业带来哪些价值?


以上的优势都是由·linux内核和cgroup带来的。docker是基于linux内核的虚拟化技术,所以对系统的内核版本有要求,是因为低版本的内核不支持namespace,因为共用宿主机内核,所以容器container的性能接近于native的性能。通过5大namesapce实现了运行环境的隔离(第6个user namespace现在已在试验版本中),又通过cgroup实现了资源限制。


举个例子来说一下用docker后的工作流程应该是:


需求:开发一个php的wordpress博客。


1.运维和开发协同写Dockerfile,生成php的的镜像。


2.开发拿到php的镜像,拉倒本地后启动php容器,进行开发。


3.开发完毕,研发把代码和php的镜像结合,打包成一个应用镜像(app image),交付到测试环境。


4.测试人员得到通知,那到app image 创建测试环境,不通过研发继续改,通过后给镜像打个状态(testing pass)。


5.运维人员拿到镜像,传入不同的运行参数,上线,上线,上线!


注:java项目类似。

下图是6个namespace所实现功能的列表:




docker架构


docker就是C/S架构


1.在linux系统上安装docker,所输入的类似docker images、 docker ps等命令,都是docker client端。


2.执行命令后都是由docker daemon来进行处理,这就是docker server端

对docker的架构非常好理解,运维人员对docker架构熟悉即可。


Dockerfile,image,container的关系


用一张图来描述它们之间的关系:




1.首先我们从dockerhub官方镜像仓库中往下pull一个基础镜像centos。


2.然后写一个Dockerfile文件,基于基础镜像centos来构建其他镜像。


3.然后通过docker build命令进行加载Dockerfile文件中的内容,构建镜像。


4.构建镜像完成以后,我们可以通过docker run命令来启动容器。


5.然后我们可以对容器进行start,stop,restart,rm等等操作。


6.也可以把一个容器commit成一个镜像。


7.最后可以把自己构建的镜像push到镜像仓库,可供其他人下载使用。


推荐构建镜像的时候通过Dockerfile来进行build,除非图形界面操作太多的情况,可以使用把容器commit成镜像


docker存储


docker的存储包括2个方面:


  • 容器和镜像存储

  • 文件数据存储


容器和镜像的存储也就是docker所支持的storage driver:

  • AUFS

  • Overlay

  • Devicemapper

分别来说一下,这3种存储的特点:


在了解存储特点的时候,我们需要了解一下docker镜像,docker镜像是通过写时复写机制实现了分层,也就是说一个镜像是都多个层(layer)构成。


Aufs是Another Union File System的缩写,支持将多个目录挂载到同一个虚拟目录下。


如下图:




已构建的镜像会设置成只读模式,read-write写操作是在read-only上的一种增量操作,固不影响read-only层。


举例:现在构建一个php的镜像,如果想基于php镜像构建app镜像,只需要继承(from)php镜像即可,而app镜像不影响php的镜像,只是在php的基础上继续叠加层。


Overlay是一个叠加文件系统,用于叠合多个文件系统形成一个新的文件系统,使用方式如下:


mount -t overlay overlay -olowerdir=/lower, upperdir=/upper, workdir=/work /merged


overlayfs通过Linux内核VFS层的灵活性能够将对文件A的修改变成对B的修改,利用这种灵活性来完成文件系统叠加的效果!


Overlay只有2层:


lower:通常是只读的,镜像文件存储到lower层,如果想对lower层的文件做修改,需要把lower层的文件copy到upper才能更新,这也就是实现了CoW机制,但如果lower层有一个非常大的文件需要进行修改,这样的场景下就不推荐使用overlay。不过overlay需要3.18的内核才行。


Devicemapper是在linux kernel2.6提供的一种从逻辑设备到物理设备的映射框架机制。


devicemapper的精简配置模块实现了镜像的分层,这个模块使用了2个设备,1个用于存储元数据(metadata),1个用于存储数据(data)。data就是一个资源池,为其他块设备(容器)提供资源;metadata存储了虚拟设备和物理设备的映射关系。


CoW机制是在块存储级别发生,通过对已有设备创建快照的方式创建新的设备,这些新的快设备在写入内容之前并不会分配资源。docker使用devicemapper存储驱动,所有的容器和镜像都有自己的块设备,所以在任何时候都能创建快照提供新的容器和镜像。


devicemapper是基于块粒度的CoW,这个粒度要小于overlay的,并且如果底层有一个文件需要修改,devicemapper只需要copy那个需要更改的块就可以了,无需全部copy。


以上内容已明白,Docker镜像是由一系列的只读层叠加而成,当启动一个容器时,Docker加载镜像的所有只读层,并在最上面加入一个读写层,这样就形成了我们所说的容器。


分层的实现方式,可以提高镜像的构建,存储和分发并可以节省存储空间,但是还是不存在一些问题不能满足,比如:


  • 容器中的数据如果想进行保存和修改,在宿主机上无法操作

  • 容器之间的数据无法共享

  • 容器中的数据会随着容器被删除而删除掉


那么针对以上这些问题,出现了docker volume


2.文件数据存储VFS,vfs不支持写时复写。


docker volume是独立于联合文件系统,通过VFS文件系统而实现。


  • volume可以在容器间进行数据共享和重用

  • 对volume目录下的文件进行修改,可以在容器中马上生效

  • 删除容器后不删除volume,即使没用容器在使用volume也不会被删除

  • 可以重复挂载


提示:运行DB类的容器,需要把数据库目录下文件通过docker -v挂载到宿主机目录下。


总结:

如果我们想利用docker,那么我们需要付出哪些代价:


  • 运维需要熟悉使用docker

  • 运维需要写Dockerfile

  • 研发协同运维编写Dockerfile生成镜像

  • 测试,了解docker即可,无需深入

  • 研发在项目代码中放一个Dockerfile和.dockerignore文件


另外,应用docker目前推荐跑web类应用,推荐是微服务架构的业务。


“DBA+社群”将陆续在各大城市群进行线上专题分享活动,以后每周一、周三晚上为【DBA+专业群】的固定时间,每周二、周四晚上为【DBA+各城市群】的固定时间,每周五晚上为【DAMS架构师精英群】的固定时间,欢迎大家积极加入我们。无论是内容还是形式,有好的建议我们都会积极采纳。


未入群的小伙伴们可先关注DBA+社群微信公众号:dbaplus,回复“我要入群”获得各城市群二维码,再加入你所在的城市微群。


关注DBA+社群微信公众号:dbaplus


回复“上海沙龙”,获取DBA+社群数据库技术沙龙·上海站PPT;

回复“广州沙龙”,获取DBA+社群数据库技术沙龙·广州站PPT;

回复“OOW大会”,获取2015 Oracle OpenWorld大会PPT;

回复“2015GOPS”,获取2015 GOPS:全球运维大会·上海站PPT;

回复“DCon2015”,获取DCon 2015大会演讲PPT。





扫码关注

DBAplus社群

超越DBA圈子,连接的不仅仅是DBA


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存