1 什么是docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中发布,也可以实现虚拟化,容器完全使用沙箱机制,相互之间不会有任何接口。

什么是容器?容器是与系统其他部分隔离开的一系列进程。运行这些进程所需的所有文件都由容器镜像提供。

什么是容器镜像?容器镜像是软件的一个轻量的、独立的、可执行的包,包括了执行它所需要的所有东西:代码、运行环境、系统工具、系统库、设置。

1.1 Docker工作模型

  • 应用 + 依赖文件:构成一个容器
  • Docker Engine:;docker-engine就是运行在主机上的一个守护进程(daemon);通常提到Docker的时候,都指的是Docker-engine。Docker是C/S的架构,daemon就是它的serve。daemon可以监听在某一个socket端口上,也可以监听到unix本地socket之上,而client也可以操作本机的daemon和远程的daemon。

什么是守护进程?守护进程(daemon)是一个在后台运行并且不受任何终端控制的进程;它在执行进程中的产生信息也不在任何终端上显示;守护进程周期性地执行某种任务或等待处理某些发生的事件,Linux的大多数服务器就是用守护进程实现的。

2 Docker的基本概念

本节参考自此贴

2.1 镜像(Image)

Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资 源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境 变量、用户等)。

2.1.1 镜像的结构

Docker 镜像里面是一层层文件系统,叫做 Union FS(联合文件系统)。Union FS可以将几层目录挂载到一起,形成一个目录结构和 linux 的目录结构一样虚拟文件系统。docker 通过这些文件再加上宿主机的内核提供了一个 linux 的虚拟环境。每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限:

  • 只读(readonly)
  • 读写(readwrite)
  • 写出(whiteout-able)

但是 docker 镜像中每一层文件系统都是只读的

Docker镜像文件系统如下图

2.1.2 镜像文件系统建立过程

Linux 文件系统

  • bootfs (boot file system)
    • boot loader:主要用于引导加载 kernel,当 kernel 被加载到内存中后 bootfs 会被 umount 掉。
    • kernel
  • rootfs (root file system)
    • dev/
    • proc/
    • bin/
    • etc/

两部分组成,如下图。

Linux在 加载 bootfs 时

  • 先将 rootfs 设为 read-only
  • 在系统自检之后将 rootfs 改为 read-write,
  • 然后就可以在 rootfs 上进行读写操作了。

Docker文件系统

Docker 在 bootfs 自检完毕之后并不会把 rootfs 的 read-only 改为 read-write而是利用 union mount(UnionFS 的一种挂载机制)将 image 中的其他的 layer 加载到之前的 read-only 的 rootfs层之上,每一层 layer 都是 rootfs 的结构,并且是read-only 的。只有当创建一个容器,也就是将 Docker 镜像进行实例化,系统会分配一层空的 read-write 的 rootfs ,用于保存我们做的修改。一层 layer 所保存的修改是增量式的,就像 git 一样。

2.2 容器 Container

镜像( Image )和容器( Container )的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体

容器的实质是进程,可以被创建、启动、停止、删除、暂停。但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间。因此容器可以拥有自己的 root 文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。

按照 《Docker 最佳实践》的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。

数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器删除或者重新运行之后,数据却不会丢失。

2.3 仓库 Repository

镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注