虚拟机还是Docker?

如何理解您需要 Docker 而不是 VM? 您需要确定您到底想要隔离什么。 如果你想隔离一个有保证资源和虚拟硬件的系统,那么选择应该落在虚拟机上。 如果您需要将正在运行的应用程序隔离为单独的系统进程,则需要 Docker。

那么Doc​​ker容器和VM有什么区别呢?

虚拟机(VM) 是一台拥有所有虚拟设备和虚拟硬盘的虚拟计算机,上面安装了新的独立操作系统以及虚拟设备驱动程序、内存管理和其他组件。 也就是说,我们获得了物理硬件的抽象,允许您在一台计算机上运行许多虚拟计算机。
安装的虚拟机可能会以不同的方式占用磁盘空间:

  • 固定硬盘空间,可以更快地访问虚拟硬盘并避免文件碎片;
  • 动态内存分配。 安装其他应用程序时,将为它们动态分配内存,直到达到分配给它的最大数量。

服务器上的虚拟机越多,占用的空间就越大,并且还需要应用程序运行所需的环境的持续支持。

码头工人 是一款用于构建基于容器的应用程序的软件。 容器和虚拟机具有类似的优点,但工作方式不同。 容器占用的空间更少,因为与虚拟机相比,过度使用主机系统的共享资源,因为与 VM 不同,它提供操作系统级别的虚拟化,而不是硬件级别的虚拟化。 此方法提供更少的内存占用、更快的部署和更轻松的扩展。

容器通过向主机系统提供必要的接口,提供了一种更有效的封装应用程序的机制。 此功能允许容器共享系统核心,其中每个容器作为主操作系统的单独进程运行,主操作系统拥有自己的一组内存区域(自己的虚拟地址空间)。 由于每个容器的虚拟地址空间都是自己的,因此属于不同内存区域的数据无法更改。
Docker 的原生操作系统是 Linux(Docker 也可以在 Windows 和 MacOS 上使用),它利用了它的主要优点,这使得它能够组织分割内核。 Windows 上 Docker 容器的启动将在 Linux 虚拟机内进行。 容器共享主机系统的操作系统,其主要操作系统是Linux。

容器——它是如何工作的?

容器 是应用程序级别的抽象,结合了代码和依赖项。 容器总是从镜像创建,添加可写的顶层并初始化各种参数。 由于容器有自己的写入层,并且所有更改都存储在该层中,因此多个容器可以共享对同一主映像的访问。

每个容器都可以通过主解决方案 docker-compose.yml 中包含的 docker-compose 项目中的文件进行配置。 在那里您可以设置各种参数,例如容器名称、端口、标识符、资源限制、其他容器之间的依赖关系。 如果您没有在设置中指定容器名称,那么 Docker 每次都会创建一个新容器,并随机为其分配一个名称。

当容器从映像启动时,Docker 会将读/写文件系统安装在下面任何层的顶部。 这是我们希望 Docker 容器运行的所有进程都将运行的地方。

当Docker第一次启动一个容器时,初始的读/写层是空的。 当发生变化时,它们会被应用到该层; 例如,如果要修改一个文件,该文件将从下面的只读层复制到读写层。
该文件的只读版本仍然存在,但现在隐藏在副本下。 卷用于存储数据,与容器的生命周期无关。 创建容器时会初始化卷。

镜像与容器是如何关联的?

图片 - 每个容器的主要元素。 镜像是根据添加到项目中的 Dockerfile 创建的,是一组相互层叠并分组在一起的文件系统(层),仅供读取; 最大层数为127。

每个镜像的核心是一个基础镜像,它由 FROM 命令指定 - 生成 Dockerfile 镜像时的入口点。 每层都是只读层,由一个修改文件系统的命令表示,写入 Dockerfile。
为了将这些层组合成单个映像,Docker 使用高级多层联合文件系统(AuFS 构建在 UnionFS 之上),允许来自不同文件层的不同文件和目录透明地重叠,创建关联的文件系统。

层包含元数据,允许您在运行时和构建时存储有关每个层的相关信息。 每层都包含到下一层的链接,如果该层没有链接,则这是图像中的最顶层。

Dockerfile 可能包含以下命令:

  • FROM - 图像形成的入口点;
  • MAINTAINER - 图像所有者的姓名;
  • RUN——镜像组装过程中的命令执行;
  • ADD - 将主机文件复制到新镜像中,如果指定URL文件,Docker会将其下载到指定目录;
  • ENV——环境变量;
  • CMD——开始基于镜像创建新容器;
  • ENTRYPOINT - 该命令在容器启动时执行。
  • WORKDIR是执行CMD命令的工作目录。
  • USER - 设置从映像创建的容器的 UID。
  • VOLUME - 将主机目录安装到容器。
  • EXPOSE 是容器中监听的一组端口。

UnionFS 是如何工作的?

联合FS — 适用于 Linux 和 FreeBSD 的服务堆栈文件系统 (FS)。 该FS实现了写时复制(Copy-On-Write,COW)机制。 UnionFS的工作单元是一层,每一层都应被视为一个独立的成熟文件系统,具有从根本身开始的目录层次结构。 UnionFS 为其他文件系统创建联合挂载,并允许您透明地将来自不同文件系统(称为分支)的文件和目录合并到单个链接文件系统中,这对用户透明。

具有相同路径的目录的内容将一起显示在生成的文件系统的一个组合目录(同一命名空间中)中。

UnionFS 根据以下原则组合层:

  • 其中一层成为顶级层,第二层及后续层成为较低层;
  • 用户可以“从上到下”访问图层对象,即如果请求的对象位于“上”层,则返回该对象,无论“下”层中是否存在同名对象; 否则,返回“底层”对象; 如果请求的对象既不存在也不存在,则返回错误“No such file or directory”;
  • 工作层是“顶层”,即所有用户更改数据的操作都只反映在顶层,而不影响下层的内容。

Docker 是在应用程序工作中使用容器的最常见技术。 它建立在 Linux 内核提供的 cgroup 和命名空间之上,已成为该领域的标准。

Docker 允许我们快速部署应用程序,并通过在所有容器之间共享操作系统内核(作为单独的操作系统进程运行)来充分利用文件系统。

来源: habr.com

添加评论