作者:刘旭晖 Raymond 转载请注明出处

Email:colorant at 163.com

BLOG:http://blog.csdn.net/colorant/

是什么

简单的说Docker是一个构建在LXC之上的,基于进程容器(Processcontainer)的轻量级VM解决方案

拿现实世界中货物的运输作类比,为了解决各种型号规格尺寸的货物在各种运输工具上进行运输的问题,我们发明了集装箱

Docker的初衷也就是将各种应用程序和他们所依赖的运行环境打包成标准的container/image,进而发布到不同的平台上运行

从理论上说这一概念并不新鲜,各种虚拟机Image也起着类似的作用

Docker container和普通的虚拟机Image相比,最大的区别是它并不包含操作系统内核.

普通虚拟机将整个操作系统运行在虚拟的硬件平台上,进而提供完整的运行环境供应用程序运行,Docker则直接在宿主平台上加载运行应用程序.本质上他在底层使用LXC启动一个Linux Container,通过cgroup等机制对不同的container内运行的应用程序进行隔离,权限管理和quota分配等

每个container拥有自己独立的各种命名空间(亦即资源)包括:

PID进程, MNT文件系统, NET网络, IPC, UTS主机名

LXC有什么不同

基本上你可以认为目前的DockerLXC的一个高级封装,提供了各种辅助工具和标准接口方便你使用LXC,你可以依靠LXC和各种脚本实现与docker类似的功能,就像你不使用APT/yum等工具也可以自己搞定软件包安装一样,你使用他们的关键原因是方便易用!

实际使用中,你一般不用关心底层LXC的细节,同时也不排将来docker实现基于非LXC方案的可能性

LXC的基础上, Docker额外提供的Feature包括:标准统一的打包部署运行方案,历史版本控制,Image的重用,Image共享发布等等

Container构建方案

除了LXCDocker的核心思想就体现在它的运行容器构建方案上

为了最大化重用Image,加快运行速度,减少内存和磁盘footprint, Docker container运行时所构造的运行环境,实际上是由具有依赖关系的多个Layer组成的。例如一个apache的运行环境可能是在基础的rootfs image的基础上,叠加了包含例如Emacs等各种工具的image,再叠加包含apache及其相关依赖libraryimage,这些imageAUFS文件系统加载合并到统一路径中,以只读的方式存在,最后再叠加加载一层可写的空白的Layer用作记录对当前运行环境所作的修改。

有了层级化的Image做基础,理想中,不同的APP就可以既可能的共用底层文件系统,相关依赖工具等,同一个APP的不同实例也可以实现共用绝大多数数据,进而以copy on write的形式维护自己的那一份修改过的数据等

历史和生态环境

Docker项目从启动到现在不过一年多时间,发展势头还是很迅猛的

2013.01做为dotcloud内部项目开始启动

2013.03.27正式作为public项目发布

2014.1BLACK DUCK评选为201310大开源新项目“TOP 10 OPEN SOURCE ROOKIE OF THE YEAR

目前的状态( 2014.3 )

Docker 0.8.1

10000+ github stars(top 50)

350+ contributors

1500+ fork

具体应用方面,可以看到百度至少在201310月份就已经成功使用Docker支持其BAE平台的Paas服务

安装运行和使用

Docker虽然是号称build onceruneverywhere。但是实际上还是受其引擎依赖关系的限制的,目前的版本具体来说对系统要求:

  • Linux Kernel 3.8+
  • LXCsupport
  • 64bitOS
  • AUFS

以上要求,以ubuntu为例,需要12.04配合3.8kernel升级,或者ubuntu 13.04+

ubuntu12.04上,基本安装步骤如下

sudoapt-get update sudo apt-get install linux-image-generic-lts-raringlinux-headers-generic-lts-raring

sudoapt-key adv --keyserver keyserver.ubuntu.com --recv-keys36A1D7869245C8950F966E92D8576A8BA88D21E9

sudosh -c "echo deb http://get.docker.io/ubuntudocker main\ > /etc/apt/sources.list.d/docker.list"

sudoapt-get update

sudoapt-get install lxc-docker

如果你在安装之前想要先体验一下docker的基本操作命令等的话,可以尝试一下这个在线的live教程https://www.docker.io/gettingstarted/#h_tutorial

常用命令

分类列一下常用的CLI命令

  • 仓库相关

search/ pull / push / login etc.

例:docker pull ubuntu从仓库下载ubuntuimage

  • Images操作相关

images/ rmi / build / export  / import / save /load etc.

例:docker images -t以树形结构列出当前本地Image

  • 运行相关

run / start / stop / restart / attach /kill etc.

docker run -i -t ubuntu /bin/bash启动ubuntu image,并交互式的运行shell

  • 杂项

Docker diff  / commit

Dockerinfo / ps / inspect / port / logs / top / history etc.

具体docker命令的使用参见http://docs.docker.io/en/latest/reference/commandline/

常见问题

  • 使用Non root用户

目前版本的docker由于使用Socket进行通讯,因此需要root用户权限sudo xxx,或者将需要使用Dockerclient的用户加入docker用户组

sudogpasswd -a ${USER} docker

  • 网络相关问题

当你在网关背后需要通过代理连接dockerindex数据库时,可以手动加上http_proxy环境变量来启动dockerdaemon

HTTP_PROXY=http://proxy_server:portdocker -d &

更好的做法是修改/etc/default/docker ( on ubuntu ),添加exporthttp_proxy=proxy_server:port

同样,docker container如果无法自动正确的从host环境中获得DNS的配置,则需要手动指定DNS服务器地址,这可以通过docker -run --dns=xxx来实现,也可以修改/etc/default/docker添加例如DOCKER_OPTS="-dns8.8.8.8"

  • 特权模式

在正常情况下container内部你没有权限操作device设备,而当前版本中,container内部部分文件例如/etc/hosts;/etc/hostname; /etc/resolve.conf等文件是动态通过mount动态以只读的形式加载上来的,理论上说你应该找到合适的方法去保证这些自动生成并加载的文件的正确性(例如通过--dns设置resolve.conf ),但是如果由于特殊原因你需要手动修改,那么你可以通过特权模式启动docker clientdocker run --privileged,然后你可以卸载这些文件,自己再创建新的版本

  • 过多的层级依赖关系

Layer的方式实现APP和相关librarycheap reusefast updateDocker的关键所在,不过受目前AUFS文件系统的限制,默认Layer的层级最多只能达到127(曾经只有42),在实际使用中有多种情况可能导致你的container的层级关系快速增长到这个极限值,撇开这么多layer叠加以后AUFS的效率不谈,更多情况下是你无法再更新构建你的image

  1. 使用Dockerfile构建Image时,每条指令都会给最终的Image增加一层layer依赖关系.
  2. 以修改,提交,再修改再提交的方式不停的调整,更新你的Image
  3. 从仓库中下载的别人的Image已经包含众多的层级依赖关系,而你需要进一步更新以创建你自己的版本

前两者在一定程度上还是你自己可能把控的,最后一种情况就没办法了。这个问题最终必将影响Docker的实际可用性,目前的解决方案包括:

  • 使用Dockerfile,尽可能合并多个操作:例如使用"&&"";"合并运行多个shell命令;将多个shell命令写成脚本,在dockerfile中添加并运行这个脚本
  • 通过ExportImport Image,丢弃所有历史信息和依赖关系,创建一个全新的image

将来可能的解决方案包括:

  • Dockerfile中添加对多步操作的合并提交的支持
  • 外部的image Flat工具的支持,目标是能够保留历史信息等
  • AUFS的其它Storage解决方案

Future development

虽然Docker目前默认使用LXCAUFS,但是Docker的核心思想本身,并不强制绑定这两者,0.8版本已经可以使用BTRFS,而整个Docker框架也改成了插件式的架构,便于添加替换各个功能模块

例如更多的Storage方案的支持,规避AUFS当前的问题,除了LXC以外更多的虚拟化方案等

快速理解Docker - 容器级虚拟化解决方案相关推荐

  1. ***快速理解Docker - 容器级虚拟化解决方案

    原文链接:http://blog.csdn.net/colorant/article/details/20608157 云计算(cloudcomputing)是基于互联网的相关服务的增加.使用和交付模 ...

  2. 转载: 快速理解Docker - 容器级虚拟化解决方案

    转载自: http://blog.csdn.net/colorant/article/details/20608157 是什么 简单的说Docker是一个构建在LXC之上的,基于进程容器(Proces ...

  3. 理解Docker容器

    < 理解Docker&容器 > 理解 Docker 一.概述 " Docker 是全球领先的软件容器平台 ".开发人员利用 Docker 可以消除协作编码时&q ...

  4. 【k8s】理解Docker容器的进程管理(PID1进程(容器内kill命令无法杀死)、进程信号处理、僵尸进程)

    文章目录 概述 1. 容器的PID namespace(名空间) 2. 如何指明容器PID1进程 3. 进程信号处理 4. 孤儿进程与僵尸进程管理 5. 进程监控 6. 总结 参考 概述 简介: Do ...

  5. 【Microsoft Azure 的1024种玩法】六十八.基于Azure云平台使用Azure Virtual machines快速搭建Docker容器

    [简介] Docker 是一个开放源代码软件,主要应用于开发应用.交付应用.运行应用,Docker 可以将应用程序及其依赖项打包到可以在任何 Linux.Windows 或 macOS 计算机上运行的 ...

  6. Docker容器的虚拟化网络

    文章目录 1 虚拟化网络 2 单节点容器间通信 3 不同节点容器间通信 4 Docker容器网络 5 Docker的四种网络模式 5.1 host模式 5.2 container模式 5.3 none ...

  7. 10张图带你深入理解Docker容器和镜像--云平台技术栈07

    导读:之前发布了云平台技术栈(ps:点击可查看),本文主要说一下其中的Docker! 翻译:杨润青 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(container)和镜像(image ...

  8. 10张图带你深入理解Docker容器和镜像

    本文用图文并茂的方式介绍了容器.镜像的区别和Docker每个命令后面的技术细节,能够很好的帮助读者深入理解Docker. 这篇文章希望能够帮助读者深入理解Docker的命令,还有容器(containe ...

  9. docker -v 覆盖了容器中的文件_10分钟让你理解 docker 容器中的 uid 和 gid

    默认情况下,容器中的进程以 root 用户权限运行,并且这个 root 用户和宿主机中的 root 是同一个用户.听起来是不是很可怕,因为这就意味着一旦容器中的进程有了适当的机会,它就可以控制宿主机上 ...

最新文章

  1. Python 技术篇-通过管道命令获取cmd执行的结果,获取os.system()、subprocess.Popen()执行命令返回的结果
  2. 详解TF-Ranking:Google开源的排序框架,应用于邮件检索、推荐系统等场景
  3. extjs获取焦点和失去焦点_[NBA夏联]焦点单三连红,NBA夏季联赛同样精彩
  4. 11.4 iftop:动态显示网络接口流量信息
  5. JVM插桩之三:javaagent介绍及javassist介绍
  6. python中@staticmethod_Python中的@staticmethod和@classmethod的区别
  7. java自动随机字符_java随机字符生成工具
  8. Matplotlib 中文用户指南 3.5 密致布局指南
  9. Apache Lucene 3.x推荐教程
  10. 专业书籍阅读-Earth System Science Data Resources
  11. paip.提升性能---- 网站并发数的总结.txt
  12. 阿里云解决方案架构师李晨:百万级价签系统的实时洞察与创新实践
  13. java毕设查重,已经毕业的给毕设查重的人一点建议
  14. Excel教程数据透视表系列案例二十二
  15. 修改MFC程序的图标
  16. 【分享】地产集团公司LOGO设计
  17. 虚拟机上的hadoop localhost:8088,localhost:50070均不能访问
  18. 《变革中的思索》连载三:展望个人电脑的未来之路
  19. h5+js+ajax+百度翻译API:实现翻译功能
  20. 嫁人就要嫁程序员,钱多话少死得早!

热门文章

  1. 【Android 应用开发】Android屏幕适配解析 - 详解像素,设备独立像素,归一化密度,精确密度及各种资源对应的尺寸密度分辨率适配问题
  2. 多个VSTO解决方案间传输变量
  3. 升级python2至python3解决依赖关系
  4. 普及组2008NOIP 排座椅(贪心+排序)
  5. 1.DBCP和CP30的区别
  6. 问候Maven3(笔记一)
  7. CentOS 命令【备忘】
  8. Golang下的Log处理
  9. Hadoop–Task 相关
  10. jquery技巧总结 学习