Doker是什么?

Docker的英文原意为码头工人,官方社区是这样说的:

Docker - Build, Ship, and Run Any App, Anywhere

能这样理解,doker可以在任意地点建立,交付,run任何应用。

Doker是DotCloud公司基于LXC(linux container)用golang开发的容器引擎,是Paas产品。源码托管于Github,2013年3月首个发行版问世,docker也就此开始火起来,当然也是虚拟化产品。
直白一点来说:

Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、bare metal、OpenStack 集群和其他的基础应用平台。

再直白一点就是:

dokcer是一个开源的应用容器引擎 让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也能实现虚拟化。

其设计宗旨按我个人理解就是三条:
快!
快!
还是快!
快速交付、托管,快速测试部署,缩短代码writing和running的周期
docker亮点:(根据官网来说):

  1. 轻量级:在一台机器上运行的所有容器共享相同的操作系统内核,这使得容器的部署变的迅捷,并能够更有效地利用内存。在分层文件系统中构建,使他们能够共享公共文件,使磁盘使用和镜像下载更有效。

  2. 开源:Doker遵循开源标准,容器可以跑在大部分linux发行版和所有的windows系统上面。

  3. 安全:容器之间相互隔离,容器与底层架构隔离,同时为应用程序提供了额外的保护层。

  4. 兼容性非常好(这点是个人看法)Docker的容器与平台和硬件都无关,基本上能说是:是台计算机就能跑Docker容器,笔记本,服务器,云主机都ok。
    #Docker架构
    ##Doker架构图
    ###Docker与虚拟机的架构对比

  5. Doker架构
    这里写图片描述
    容器包括应用程序和该应用程序所需的所有依赖,但共享与其他容器的内核。它们作为一个独立的进程跑在物理机操作系统的userspace,他们也不会依赖于任何特定的基础设施 - Dokcer可以跑在任何计算机上,在任何基础设施上,在任何云上。
    2.虚拟机架构
    这里写图片描述
    每个虚拟机都包括应用程序,所需的二进制文件和库和一个完整的客户操作系统 - 所有这些基本是几十GB的大小。

3。从这个角度看Docker的架构虚拟机都有差不多的资源分配和资源隔离机制,但是Docker的架构比虚拟机便携和高效。docker的架构比虚拟机的架构少了一层操作系统,docker容器只需要应用和所需的库就ok,而vm则需要自己的操作系统。

###宏观架构图:
刚从openstack过来,还不大适应这种架构图(来自:http://dockerpool.com/static/books/docker_practice/underly/arch.html)
这里写图片描述
###详细架构图:
(来自http://www.infoq.com/cn/articles/docker-source-code-analysis-part1/):
这里写图片描述
Doker是基于LNC的容器引擎,先了解下LNC
##LXC介绍
###几种虚拟化架构对比
参考:http://www.cnblogs.com/wang_yb/p/3923040.html

  • LXC:LXC 是非常轻量级的, 它将 VM 的进程也伪装成 HOST 的进程
    | p1(HOST), p2(VM), p3(VM), p4(HOST)… |
    |:----------------------------------?
    | Linux Kernel |
    |硬件|

  • KVM:KVM也是现在比较热的虚拟化技术,像开源巨头之一的Openstack就是基于KVM开发的,但KVM需要CPU支持,这个结构和传统的虚拟化技术很类似, 有一点不同的是, KVM和Linux Kernel是紧密结合的,所以Linux Kernel能够更好的管理 VMs, VM的性能会比传统的虚拟化技术更好。
    |VM1 VM2 VM3 … … |
    |:-------------------------------------------------------?
    |KVM|
    |Linux Kernel|
    |硬件|

  • XEN:比较早的一个虚拟化技术,到现在还占据着虚拟化市场的较大份额,支持全虚拟支持半虚拟,在不支持CPU-VT的主机上只能实现半虚拟。Xen的虚拟化原理是在 Linux Kernel和硬件之间加入一层 Xen代码, 有Xen来管理Linux Kernel和其它的VM。
    |Linux Kernel VM1 VM2 VM3 … … |
    |:----------------------?
    |XEN|
    |硬件|

  • 传统的虚拟化技术 (VirtualBox, VMware):VM是由虚拟化软件(VirtualBox, VMWare…)来管理的, Linux Kernel不能直接管理到各个VM。
    |Linux Kernel VM1 VM2 VM3 … … |
    |:------------------------?
    |VirtualBox or VMWare or … |
    | 硬件 |

LXC架构

Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。LXC可以在操作系统层次上为进程提供虚拟的执行环境,一个虚拟的执行环境就是一个容器,同时可以为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,限制可以使用的内存大小(包括内存和是swap空间),提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、uts)。

  • 与传统虚拟化技术相比,它的优势在于:
    • (1)与宿主机使用同一个内核,性能损耗小;
    • (2)不需要指令级模拟;
    • (3)不需要即时(Just-in-time)编译;
    • (4)容器可以在CPU核心的本地运行指令,不需要任何专门的解释机制;
    • (5)避免了准虚拟化和系统调用替换中的复杂性;
    • (6)轻量级隔离,在隔离的同时还提供共享机制,以实现容器与宿主机的资源共享。
  • lxc结构:

LXC 项目由一个 Linux 内核补丁和一些用户空间(userspace) 工具组成。这些工具使用由补丁增加的内核新特性,提供一套简化的工具来维护容器。
LXC 在资源管理方面依赖 Linux 内核的 cgroups (Control Groups) 系统,cgroups 系统是 Linux 内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。它最初由 Google 的工程师提出,后来被整合进 Linux 内核。Cgroups也能理解成linux的一种隔离机制。cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有 cgroups 就没有 LXC。cgroups 文件系统结构如下图:

cgroups文件结构

详细请点击这里

  • LXC隔离主要依靠三个隔离机制(namespace chroot cgroup)
  • namespace(命名空间)
    架构:
    这里写图片描述
    如果有一定Doker基础这篇文章namespace介绍的更为详尽
    namespace的隔离功能有主要依靠这六个namespace分别是Mount namespaces、šUTS namespaces、IPC namespaces、PID namespaces、Network namespaces、User namespaces
    • Mount namespaces:类似chroot,将一个进程放到一个特定的目录执行。mnt namespace允许不同namespace的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。(chroot:改变根目录实现隔离)

    • UTS (UNIX Time-sharing System)namespaces:允许每个container拥有独立的hostname和domain name, 使其在网络上可以被视作一个独立的节点而非Host上的一个进程。

    • IPC(interprocess communication) namespaces:container中进程交互还是采用linux常见的进程间交互方法IPC, 包括常见的信号量、消息队列和共享内存。然而同VM不同,container 的进程间交互实际上还是host上具有相同pid namespace中的进程间交互,因此需要在IPC资源申请时加入namespace信息 - 每个IPC资源有一个唯一的 32bit ID。

    • PID namespaces:linux通过命名空间管理进程pid,对于同一进程(同一个task_struct),在不同的命名空间中,看到的pid号不相同,每个pid命名空间有一套自己的pid管理方法,所以在不同的命名空间中调用getpid(),看到的pid号是不同的。pid命名空间是一个父子关系的结构,系统初始只有一个pid命名空间,后面如果在fork进程的时候,加上新建pid命名空间的选项,那么这个新的命名空间的父命名空间就是初始的那个命名空间。详细请点此处

    • Network namespaces:一个Network Namespace提供了一份独立的网络环境,就跟一个独立的系统一样。一个物理设备只能存在于一个Network Namespace中,可以从一个Namespace移动另一个Namespace中。虚拟网络设备(virtual network device)提供了一种类似管道的抽象,可以在不同的Namespace之间建立隧道。利用虚拟化网络设备,可以建立到其他Namespace中的物理设备的桥接。当一个Network Namespace被销毁时,物理设备会被自动移回init Network Namespace,即系统最开始的Namespace。

    • User namespaces:将本地的虚拟user-id映射到真实的user-id

#Docker能干嘛?

1. 加速本地开发

通过Docker能够快速搭建好开发和运行环境,并且该环境可以直接传递给测试和产品部署

2. 自动打包和部署应用

3. 创建轻量、私有的PasS环境

4. 自动化测试和持续集成部署。

###持续集成(Continuous Integration)

5. 部署并扩展Web应用、数据库和后端服务

6. 创建安全沙盒

首先,沙盒是什么东西?沙盒为一些不可靠的程序提供试验而不影响系统运行的环境,有时也被称作沙箱。Docker利用namespace和cgroup等隔离机制使得空间相对独立、安全。

7. 轻量级的桌面虚拟化

第2、3、5点都比较容易理解,此处不再赘述

以上引用自Docker中文交流群,群号:437104773
具体是哪位大神说的我忘了,在此深表歉意

参考:
http://coolshell.cn/articles/17010.html
http://dockone.io/article/76
http://baike.baidu.com/link?url=J6onhMM7O27WuLo3q4Ff3hbcZF9gVSlzRKvcKuaICzHUDuVu8LU9Z0ZHhXoN5pCzw6H56rqLS7uiQSWYC6SM-a
http://www.docker.org.cn/book/docker/16_what-is-docker.html
http://www.infoq.com/cn/articles/docker-future
http://blog.chinaunix.net/uid-20788636-id-4479145.html
http://blog.csdn.net/preterhuman_peak/article/details/40857117#t3
http://www.cnblogs.com/wang_yb/p/3923040.html

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐