Docker初识

来源:互联网 发布:查看caj格式文件软件 编辑:程序博客网 时间:2024/06/07 06:08
1.为什么Docker?
    分布式!
     Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协议开源。 
     云计算时代的到来: AWS的成功, 引导开发者将应用转移到云上, 解决了硬件管理的问题,然而软件配置和管理相关的问题依然存在 。Docker可以简化部署多种应用实例工作。
     是近十年来软件工程领域最大的革命,Docker可完全存贮软件的开发、测 试、运维等软件的方方面面。
     从生产力来讲,以Docker为代表的容器技术把虚拟化的轻量级性以及(云计算)计算中心对硬件资源的价值发挥到极致,从投入和产出的角度来讲,有足够的理由选择Docker。
2. Docker依赖于虚拟化技术
    与传统云计算虚拟化技术有何区别呢?
    以Vmware为例,其虚拟化是重量级别的。首先安全Vmware,然后在其上面安装具体的操作系统,比如Ubuntu,需要1G左右,对内存空间的要求很大。只要启动该系统,就有一块常驻内存占用,这样大大的浪费了内存资源。
    而以Docker为代表的容器技术做虚拟化的时候,以内核中的特性为支撑完成虚拟化的。涉及linux内核的namespace、cgroups等,可实现空间隔离和CPU、内存等计算资源的分配、控制和记录等,可以构建不同的用户空间。UserSpace是基于Kernel的,有很多的UserSpace,既有很多的操作系统用户空间。而程序的运行只关心用户空间,所以linux内核的namespace、cgroups等技术时,可以在一台服务器,依靠多进程的方式实现分布式,每个进程作为一个机器,而且其对应用程序是透明的,即应用程序本身感知不到这是使用了Docker虚拟化技术虚拟出来的机器,就像在真实的物理机感觉是一样的。所以,基于Docker技术就可以通过进程的方式来做操作系统的用户空间,每个进程是个操作系统,其开销几乎不计,在一台机器上运行多款操作系统实例时,这可以榨干硬件的潜能, 包括CPU、内存、IO等。
Docker是目前容器虚拟化的代表,创建速度快;直接通过内核和硬件交互,共享Kernel,几乎没有性能损耗,此外,其资源的消耗也是很小的,比如8G内存的PC,可以很轻松的在一台机器上构建10-20台机器。
支持Windows和Mac,但是需要工具boot2Docker。

3. 基本问题
1)在一台物理机上,运行docker,相当于运行很多操作系统的用户空间,即可以把一台机器分布式去使用,涉及网络、文件、CPU、IO等?
2)不同的容器间通信机制是什么?
LXC技术:
namespace的隔离机制:每个容器都有自己的命名空间,各容器间不会相互影响,每个容器都拥有各自的网络空间、进程资源的虚拟环境,成为独立的运行单位。namespace的隔离机制可以达到这种效果其中pid、net、ipc、mnt、uts、user等namespace将container的进程、网络、消息、文件系统、UTS("UNIX Time-sharing System")和用户空间隔离开。

1) pid namespace

不同用户的进程就是通过pid namespace隔离开的,且不同 namespace 中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace。同时由于允许嵌套,因此可以很方便的实现 Docker in Docker。

2) net namespace

有了 pid namespace, 每个namespace中的pid能够相互隔离,但是网络端口还是共享host的端口。网络隔离是通过net namespace实现的, 每个net namespace有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个container的网络就能隔离开来。docker默认采用veth的方式将container中的虚拟网卡同host上的一个docker bridge: docker0连接在一起。

3) ipc namespace

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

4) mnt namespace

类似chroot,将一个进程放到一个特定的目录执行。mnt namespace允许不同namespace的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同chroot不同,每个namespace中的container在/proc/mounts的信息只包含所在namespace的mount point。

5) uts namespace

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

6) user namespace

每个container可以有不同的 user 和 group id, 也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。

cgroups的资源控制机制,对容器使用内核中资源的控制、记录、限制。cgroups关联CPU和Memory限制某个或者某些进程的分配资源。Cgroup是将任意进程进行分组化管理的Linux内核功能。cgroup本身提供将进程进行分组化管理的功能和接口的基础结构。Android操作系统也就凭借着这个技术,为每个应用程序分配不同的cgroup,将每个程序进行隔离,达到了一个应用程序不会影响其他应用程序环境的目的。

cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,即可实现对该进程的资源控制。groups可以限制blkio、cpu、cpuacct、cpuset、devices、freezer、memory、net_cls、ns九大子系统的资源,以下是每个子系统的详细说明:

  1. blkio 这个子系统设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb等等。
  2. cpu 这个子系统使用调度程序为cgroup任务提供cpu的访问。
  3. cpuacct 产生cgroup任务的cpu资源报告。
  4. cpuset 如果是多核心的cpu,这个子系统会为cgroup任务分配单独的cpu和内存。
  5. devices 允许或拒绝cgroup任务对设备的访问。
  6. freezer 暂停和恢复cgroup任务。
  7. memory 设置每个cgroup的内存限制以及产生内存资源报告。
  8. net_cls 标记每个网络包以供cgroup方便使用。
  9. ns 名称空间子系统。
chroot,是对文件系统的隔离。内核有很多用户空间时,那么这些用户空间的根目录及文件结构树是什么???由于是基于一个物理设备,真实的根目录只有一个,所以所有的容器都是挂载在真实物理根目录的子目录,而挂载进去之后如何设计自己的目录(树状结构)。chroot只有一个真实的物理文件系统,其他的是挂载在其上的虚拟文件系统。
chroot 在 Linux 系统中发挥了根目录的切换工作,同时带来了系统的安全性等好处。

4. Docker镜像
    docker镜像是由文件系统叠加而成,最低端是一个引导文件系统,即bootfs,Docker不会和引导文件系统有什么交互的。当一个容器启动后,它会被移到内存中,而bootfs会被umount,留出更多的内存供initrd磁盘镜像使用。Docker镜像的第二层是rootfs,位于引导文件之上,rootfs可以是一种或者多种操作系统。
    传统的linux引导过程中,rootfs会先以只读的方式加载,当引导结束并完成了完整性检查后,它才会被切换为读写模式。
    但是在Docker里面呢?rootfs永远只能是只读,docker利用联合加载(union mount)技术又会在rootfs上加载更多的只读文件系统。docker将这样的文件系统称为镜像,一个镜像可以放到另一个镜像的顶部。最底部的镜像叫做基础镜像。当从一个镜像启动容器时,docker会在该镜像的最顶层加载一个读写文件系统,而在docker中运行的程序就是在这个读写层中执行的。中间的镜像是只读的,不会便捷化,当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶层添加一个读写层。这个读写层加上其下面的镜像层以及一些配置数据,就构成了一个容器。可见,容器是镜像的分层架构。
    

6. Docker架构




http://www.infoq.com/cn/articles/docker-kernel-knowledge-namespace-resource-isolation
http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation
http://www.infoq.com/cn/articles/docker-kernel-knowledge-cgroups-resource-isolation
http://www.cnblogs.com/yjf512/p/3298582.html
http://www.infoq.com/cn/articles/docker-core-technology-preview
 http://www.infoq.com/cn/articles/docker-source-code-analysis-part1










0 0
原创粉丝点击