了解 Docker

我已经使用 Docker 来构建 Web 项目的开发/交付流程已有几个月了。 我为 Habrakhabr 读者提供了有关 docker 的介绍性文章的翻译 - 《了解码头工人》.

什么是码头工人?

Docker 是一个用于开发、交付和操作应用程序的开放平台。 Docker 旨在更快地交付您的应用程序。 使用 docker,您可以将应用程序与基础设施解耦,并将基础设施视为托管应用程序。 Docker 可帮助您更快地交付代码、更快地测试、更快地交付应用程序,并减少编写代码和运行代码之间的时间。 Docker 通过轻量级容器虚拟化平台来实现这一点,使用可帮助您管理和托管应用程序的进程和实用程序。

从本质上讲,docker 允许您运行几乎任何应用程序,并安全地隔离在容器中。 安全隔离允许您同时在同一主机上运行多个容器。 容器的轻量级性质,无需虚拟机管理程序的额外负担即可运行,使您可以充分利用硬件。

容器虚拟化平台和工具在以下情况下非常有用:

  • 将您的应用程序(以及您使用的组件)打包到 docker 容器中;
  • 将这些容器分发并交付给您的团队进行开发和测试;
  • 将这些容器部署在数据中心和云中的生产站点上。

我可以使用 docker 做什么?

快速发布您的应用程序

Docker 非常适合组织开发周期。 Docker 允许开发人员运行带有应用程序和服务的本地容器。 随后允许您集成持续集成和部署工作流程的过程。

例如,您的开发人员在本地编写代码并与同事共享他们的开发堆栈(一组 Docker 映像)。 当他们准备好时,他们会将代码和容器推送到测试站点并运行任何必要的测试。 从测试站点,他们可以将代码和图像发送到生产环境。

更容易布置和展开

基于 Docker 容器的平台可以轻松移植您的有效负载。 Docker 容器可以在本地计算机上运行,​​无论是真实计算机还是数据中心或云中的虚拟机。

Docker 的可移植性和轻量级特性使您可以轻松地动态管理工作负载。 您可以使用 docker 来部署或关闭您的应用程序或服务。 docker 的速度使得这一切可以近乎实时地完成。

更高的负载和更多的有效载荷

Docker 轻量且快速。 它为基于管理程序的虚拟机提供了一种弹性、经济高效的替代方案。 它在高负载环境中特别有用,例如,在创建自己的云或平台即服务时。 但当您想要充分利用现有资源时,它对于中小型应用程序也很有用。

主要 Docker 组件

Docker 由两个主要组件组成:

  • Docker:一个开源虚拟化平台;
  • Docker Hub:我们用于分发和管理 Docker 容器的平台即服务。

笔记! Docker 在 Apache 2.0 许可证下分发。

Docker架构

Docker 使用客户端-服务器架构。 Docker 客户端与 Docker 守护进程进行通信,后者承担创建、运行和分发容器的负担。 客户端和服务器都可以在同一系统上运行,您可以将客户端连接到远程docker守护进程。 客户端和服务器通过套接字或 RESTful API 进行通信。

了解 Docker

Docker 守护进程

如图所示,守护进程在主机上运行。 用户不直接与服务器交互,而是使用客户端进行交互。

Docker客户端

Docker客户端,即docker程序,是Docker的主要接口。 它接收来自用户的命令并与 docker 守护进程交互。

码头工人内部

要了解 docker 的组成部分,您需要了解三个组件:

  • 图片
  • 注册表
  • 集装箱

意象

Docker 镜像是只读模板。 例如,映像可能包含带有 Apache 的 Ubuntu 操作系统及其上的应用程序。 图像用于创建容器。 Docker 可以轻松创建新映像、更新现有映像,或者您也可以下载其他人创建的映像。 镜像是 docker 构建的组件。

注册

Docker 注册表存储镜像。 您可以从公共和私人注册表下载或上传图像。 公共 Docker 注册表是 Docker中心。 那里存储了大量的图像。 如您所知,图像可以由您创建,也可以使用其他人创建的图像。 注册表是一个分发组件。

集装箱

容器类似于目录。 容器包含应用程序运行所需的一切。 每个容器都是从图像创建的。 可以创建、启动、停止、迁移或删除容器。 每个容器都是隔离的,并为应用程序提供安全的平台。 容器是工作的组成部分。

那么 Docker 是如何工作的呢?

到目前为止我们知道:

  • 我们可以创建我们的应用程序所在的图像;
  • 我们可以从图像创建容器来运行应用程序;
  • 我们可以通过 Docker Hub 或其他镜像仓库来分发镜像。

让我们看看这些组件如何组合在一起。

图像如何发挥作用?

我们已经知道图像是创建容器的只读模板。 每个图像由一组级别组成。 Docker 使用 联合文件系统 将这些级别组合成一张图像。 联合文件系统允许来自不同文件系统(不同分支)的文件和目录透明地重叠,创建一个连贯的文件系统。

docker 轻量级的原因之一是因为它使用了这样的层。 当您更改图像(例如更新应用程序)时,会创建一个新层。 因此,无需像虚拟机那样替换整个映像或重建它,只需添加或更新该层。 而且您不必分发整个新映像,只需分发更新,从而使分发映像变得更加轻松快捷。

每个图像的核心都是基础图像。 例如,ubuntu(Ubuntu 的基础映像)或 fedora(Fedora 发行版的基础映像)。 您还可以使用图像作为创建新图像的基础。 例如,如果您有 apache 映像,则可以将其用作 Web 应用程序的基础映像。

笔记! Docker 通常从 Docker Hub 注册表中提取镜像。

可以从这些基础镜像创建 Docker 镜像;我们将创建这些镜像的步骤称为指令。 每条指令都会创建一个新的图像或级别。 说明如下:

  • 运行命令
  • 添加文件或目录
  • 创建环境变量
  • 有关启动此映像的容器时要运行的内容的说明

这些指令存储在一个文件中 Dockerfile。 Docker 读到了这个 Dockerfile,当您构建图像时,执行这些指令并返回最终图像。

docker 注册表如何工作?

注册表是 docker 镜像的存储库。 创建镜像后,您可以将其发布到公共 Docker Hub 注册表或您的个人注册表。

使用 docker 客户端,您可以搜索已发布的镜像并将其下载到您的 docker 机器上以创建容器。

Docker Hub 提供公共和私有镜像存储库。 每个人都可以从公共存储库搜索和下载图像。 私人存储的内容不包含在搜索结果中。 只有您和您的用户才能接收这些映像并从中创建容器。

容器如何工作?

容器由操作系统、用户文件和元数据组成。 众所周知,每个容器都是从镜像创建的。 这个镜像告诉docker容器里有什么,启动什么进程,容器什么时候启动,以及其他配置数据。 Docker 镜像是只读的。 当 docker 启动容器时,它会在映像之上创建一个读/写层(使用前面所述的联合文件系统),应用程序可以在其中运行。

容器启动时会发生什么?

或者使用该程序 docker,或者使用RESTful API,docker客户端告诉docker守护进程启动容器。

$ sudo docker run -i -t ubuntu /bin/bash

我们来看看这个命令。 使用命令启动客户端 docker,有选项 run,表示将推出一个新容器。 运行容器的最低要求是以下属性:

  • 使用哪个图像来创建容器。 在我们的例子中 ubuntu
  • 容器启动时要运行的命令。 在我们的例子中 /bin/bash

当我们运行这个命令时,幕后会发生什么?

Docker 按顺序执行以下操作:

  • 下载 ubuntu 镜像: docker 检查镜像可用性 ubuntu 在本地计算机上,如果不存在,则从以下位置下载 Docker中心。 如果有镜像,则使用它来创建容器;
  • 创建一个容器: 当接收到镜像后,docker使用它来创建一个容器;
  • 初始化文件系统并挂载只读级别: 在文件系统中创建容器并将镜像添加到只读级别;
  • 初始化网络/网桥: 创建一个网络接口,允许docker与宿主机进行通信;
  • 设置IP地址: 查找并设置地址;
  • 启动指定进程: 启动您的应用程序;
  • 处理并生成应用程序的输出: 连接并记录应用程序的标准输入、输出和错误流,以便您可以跟踪应用程序的执行情况。

您现在有了一个工作容器。 您可以管理您的容器,与您的应用程序交互。 当您决定停止应用程序时,请删除容器。

使用的技术

Docker是用Go编写的,并使用Linux内核的一些特性来实现上述功能。

命名空间

Docker使用技术 namespaces 组织隔离的工作空间,我们称之为容器。 当我们启动一个容器时,docker 会为该容器创建一组命名空间。

这创建了一个隔离层,容器的每个方面都在自己的命名空间中运行,并且无法访问外部系统。

docker 使用的一些命名空间列表:

  • 进程号: 隔离进程;
  • 净: 用于管理网络接口;
  • 工控机: 管理IPC资源。 (ICP:进程间通信);
  • mnt: 管理挂载点;
  • 世界标准时间: 隔离内核并控制版本生成(UTC:Unix 分时系统)。

对照组

Docker也使用了技术 cgroups 或对照组。 隔离运行应用程序的关键是只向应用程序提供您想要提供的资源。 这确保了容器将成为好邻居。 控制组允许您共享可用的硬件资源,并在必要时设置限制和限制。 例如,限制容器可能的内存量。

联合文件系统

Union File Sysem 或 UnionFS 是一种通过创建层来工作的文件系统,使其非常轻量且快速。 Docker 使用 UnionFS 创建用于构建容器的块。 Docker 可以使用 UnionFS 的多种变体,包括:AUFS、btrfs、vfs 和 DeviceMapper。

容器格式

Docker 将这些组件组合成一个包装器,我们称之为容器格式。 默认格式称为 libcontainer。 Docker 还支持 Linux 上的传统容器格式,使用 LXC。 未来,Docker可能会支持其他容器格式。 例如,与 BSD Jails 或 Solaris Zones 集成。

来源: habr.com

添加评论