Docker官方文档: https://docs.docker.com/
一、docker架构
C/S架构,主要由 client / daemon / containers / images 组成。
二、docker三要素
三要素:1)Image镜像 2)Container容器 3)Repository仓库
1) Docker镜像
镜像是容器构建的基石,是基于联合文件系统的一种层式结构。
联合文件系统(UnionFS)是一种分层、轻量级、高性能的文件系统。它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一虚拟文件系统下。Union文件系统是Docker镜像的基础。
典型的Linux文件系统由bootfs和rootfs两部分组成,bootfs(boot file system)主要包含 bootloader和kernel,bootloader主要是引导加载kernel,当kernel被加载到内存中后 bootfs就被umount了。 rootfs (root file system) 包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件,rootfs就是不同操作系统的发行版。
Docker容器的文件系统类似于Linux虚拟化栈。Docker镜像是由文件系统叠加而成。最底端是一个引导文件系统,即bootfs, 很像典型的Linux/Unix的引导文件系统。当一个容器启动时,首先加载bootfs用于引导重要文件,当容器启动后,bootfs引导文件系统会被卸载(unmount)。
传统的Linux引导过程中,root文件系统会最先以只读的方式加载,当引导结束并完成了完整性检查之后,rootfs将会从read-only改为read-write。
Docker的镜像加载时,在bootfs自检完毕之后并不会把rootfs的read-only改为read-write。而是利用联合加载union mount(UnionFS的一种挂载机制)将一个或多个read-only的rootfs加载到之前的read-only的rootfs层之上。在加载了这么多层的rootfs之后,仍然让它看起来只像是一个文件系统,在Docker的体系里把union mount的这些read-only的rootfs叫做Docker的镜像。
每个只读镜像层都是只读的,以后永远不会变化。当创建一个新容器时,Docker会构建出一个镜像栈,并在栈的最顶端添加一个读写层。这个读写层再加上其下面的镜像层以及一些配置数据,就构成了一个容器。容器的这种特点加上镜像分层框架( image-layering framework), 使我们可以快速构建镜像并运行包我们自己的应用程序和服务的容器。
docker本地镜像保存在 /var/lib/docker ,容器保存在 /var/lib/docker/containers 。
总结:Docker镜像(image)就是一个只读的模板。 镜像可以用来创建Docker容器,一个镜像可以创建很多容器。
镜像分层优势
共享资源:通过引入分层技术,可以增加镜像复用度,减少磁盘占用;同时可以实现差分上传下载,加快镜像pull、push性能。
2) Docker容器
Docker利用容器(container)独立运行的一个或者一组应用。容器是利用镜像创建的运行实例(相对于Java中的类和对象的概念)。容器可以被启动、开始、停止、删除。每个容器都是互相隔离的,保证安全的平台。可以把容器看做是一个简易版的Linux环境 (包括root用户名权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
容器的定义和镜像几乎是一模一样的,也是一堆层的统一视角, 唯一区别的是容器的最上面那一层是可读可写的。
3) Repository仓库
仓库(repository)是集中存放镜像文件的场所 。最大的公开仓库是docker hub( https://hub.docker.com/), 存放了数量庞大的镜像供用户下载。国内的公开仓库包括阿里云、网易云等。
Docker Hub中有两种类型的仓库:用户仓库(user repository)和顶层仓库(top-level repository)。用户仓库的镜像都是由Docker用户创建的,而顶层仓库则是由Docker内部的人来管理的。
i. 用户仓库的命名由用户名和仓库名两部分组成,如:jamtur01/puppet。用户名:jamtur01,仓库名:puppet。
ii. 顶层仓库只包含仓库名部分,如ubuntu仓库。顶层仓库由Docker公司和由选定的能提供优质基础镜像的厂商(如Fedora团队提供了fedora镜像)管理,用户可以基于这些基础镜像构建自己的镜像。
仓库(repository)和仓库注册服务器(registry)是有区别的。仓库注册服务器上往往放着很多个仓库,每个仓库中又包含了很多个镜像,每个镜像有不同的标签(tag)。使用示例:仓库名:TAG号。这里仓库的概念与Git类似,registry可以理解为github这样的托管服务
三、LXC与docker的关系
LXC为Linux Container的简写。Linux Container是一种轻量级的虚拟化的手段。是一种操作系统层次上的资源的虚拟化。
docker并不是LXC替代品,docker底层使用了LXC来实现,LXC将linux进程沙盒化,使得进程之间相互隔离,并且能够控制各进程的资源分配。
在LXC的基础之上,docker提供了一系列更强大的功能。
四、容器在内核中支持2种重要技术
docker本质就是宿主机的一个进程,docker是通过namespace实现资源隔离,通过cgroup实现资源限制,通过写时复制技术(copy-on-write)实现了高效的文件操作(类似虚拟机的磁盘比如分配500g并不是实际占用物理磁盘500g)
1)namespaces 名称空间
如果想要查看当前进程下有哪些 namespace 隔离,可以查看文件 /proc/[pid]/ns
2)control Group 控制组
cgroup的特点是:
cgroup的api以一个伪文件系统的实现方式,用户的程序可以通过文件系统实现cgroup的组件管理
cgroup的组件管理操作单元可以细粒度到线程级别,另外用户可以创建和销毁cgroup,从而实现资源载分配和再利用
所有资源管理的功能都以子系统的方式实现,接口统一子任务创建之初与其父任务处于同一个cgroup的控制组
四大功能:
资源限制:可以对任务使用的资源总额进行限制
优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
任务控制:cgroup可以对任务执行挂起、恢复等操作