在这本综合指南中,我解释了什么是 Docker、它的演变、Linux 的基本核心概念以及它是如何工作的。
当涉及到基于容器的实现时,Docker 已经成为事实上的标准。Docker 是基于容器的编排的基础,从小规模实施到大规模企业应用程序。
Docker 很快在 DevOps 中获得了如此多的普及和采用,因为它是为可移植性而开发的,并且是为现代微服务架构而设计的。
在这篇博客中,您将了解到,
在这里,我们的想法是让你的基础知识正确,以了解Docker的真正含义以及它是如何工作的。
Docker 是一个流行的开源项目,用 go 编写,由 Dotcloud(一家 PaaS 公司)开发。
它是一个容器引擎,它使用 Linux 内核功能(如命名空间和控制组)在操作系统上创建容器。因此,您可以将其称为操作系统级虚拟化。
Docker 最初是建立在 Linux 容器 (LXC) 之上的。后来,Docker 用其容器运行时 libcontainer(现在是 runc 的一部分)取代了 LXC。我已经在文章末尾解释了 LXC 和容器的核心概念。
你可能会问 Docker 与 Linux 容器 (LXC) 有何不同,因为所有的概念和实现看起来都相似?
除了作为一种容器技术之外,Docker 还具有定义完善的包装器组件,使打包应用程序变得容易。在 Docker 之前,运行容器并不容易。这意味着,它通过将所有应用程序系统要求打包到一个容器中来完成将应用程序与基础架构分离的所有工作。
例如,如果您有一个 Java jar 文件,则可以在任何安装了 java 的服务器上运行它。同样,使用 Docker 将包含所需应用程序的容器打包后,可以在安装了 Docker 的任何其他主机上运行它。
我们将通过执行一些Docker命令和参数来启动并运行容器。
Docker 是一种为有效管理容器而开发的技术或工具。
那么,我可以在没有 Docker 的情况下运行容器吗?
是的!答案是肯定的。您可以使用 LXC 技术在 Linux 服务器上运行容器。此外,像 Podman 这样的最新工具提供了与 Docker 类似的工作流程。
Docker 具有高效的工作流,可将应用程序从开发人员的笔记本电脑移动到测试环境,再迁移到生产环境。当您查看将应用程序打包到 Docker 映像中的实际示例时,您将对它有更多了解。
您知道启动 docker 容器只需不到一秒钟的时间吗?
它的速度非常快,可以在任何具有兼容 Linux 内核的主机上运行。(也支持 Windows)
注意:您无法在 Linux 主机上运行 Windows 容器,因为 Windows 不支持 Linux 内核。您可以从此处阅读有关 Windows 容器的信息
Docker 使用写入时复制并集文件系统作为其映像存储。因此,当对容器进行更改时,只会使用写入模型上的副本将更改写入磁盘。
使用写入时复制,您将拥有所有容器的优化共享存储层。
这是 Docker 上的谷歌趋势数据。你可以看到它在过去五年里一直是一个爆炸性的话题。
这是 Datadog 的调查结果,它显示了 Docker 采用率的上升。
来源: datadog.com
以下部分将介绍 Docker 体系结构及其相关组件。我们还将研究每个组件如何协同工作以使 Docker 工作。
自成立以来,Docker 架构已经发生了几次变化。
以下是 Docker 发生的一些值得注意的架构更改
OCI:Open Container Initiative 是容器运行时和规范的开放行业标准。
当 Docker 最初推出时,它有一个单体架构。现在它分为以下三个不同的组件。
Docker 和其他大型组织为标准的容器运行时和管理层做出了贡献。因此,现在是云原生基金会的一部分,贡献者来自所有组织。containerd
runc
注意:安装 Docker 时,将安装所有这些组件。您不必单独安装它。为了说明,我们将其显示为不同的组件。
现在让我们看一下每个 Docker 组件。
Docker 引擎由 docker 守护程序、API 接口和 Docker CLI 组成。Docker 守护程序 (dockerd) 作为 systemd 服务持续运行。它负责构建 docker 映像。
若要管理映像和运行容器,请调用 API。dockerd
docker-containerd
containerd
是另一个系统守护程序服务,负责下载 docker 映像并将其作为容器运行。它公开其 API 以接收来自服务的指令dockerd
runc
是负责创建容器所需的命名空间和 cgroup 的容器运行时。然后,它会在这些命名空间中运行容器命令。runc 运行时是按照 OCI 规范实现的。
阅读这篇由 3 部分组成的优秀博客文章系列,了解有关容器运行时的更多信息。
我们已经看到了 Docker 的核心构建块。
现在,让我们使用 Docker 组件来了解 Docker 工作流。
以下官方高级 docker 架构图显示了常见的 Docker 工作流。
图片来源:docs.docker.com
Docker 生态系统由以下四个组件组成
Docker 具有客户端-服务器体系结构。Docker Daemon () 或服务器负责与容器相关的所有操作。dockerd
守护程序通过 CLI 或 REST API 从 Docker 客户端接收命令。Docker 客户端可以与守护程序位于同一主机上,也可以存在于任何其他主机上。
缺省情况下,docker 守护程序侦听 UNIX 套接字。如果您有任何远程访问 docker API 的用例,则需要通过主机端口公开它。其中一个用例是将 Docker 作为 Jenkins 代理运行。docker.sock
如果要在 Docker 中运行 Docker,可以从主机使用 Docker。docker.sock
镜像是 Docker 的基本构建块。它包含用于运行应用程序的操作系统库、依赖项和工具。
可以使用应用程序依赖项预生成映像,以创建容器。例如,如果要将 Nginx Web 服务器作为 Ubuntu 容器运行,则需要使用 Nginx 二进制文件和运行 Nginx 所需的所有操作系统库创建一个 Docker 映像。
Docker 有一个用于构建映像的概念。Dockerfile:每行包含一个命令(指令)的文本文件。Dockerfile
下面是 Dockerfile 的示例。
docker 映像以分层方式组织。a 上的每条指令都会在图像中添加一个图层。映像的最顶层是容器。Dockerfile
每个映像都是从基础映像创建的。
例如,如果您可以使用 Ubuntu 的基本映像并使用 Nginx 应用程序创建另一个映像。基础映像可以是父映像,也可以是从父映像构建的映像。查看他的 docker 文章以了解更多信息。
你可能会问这个基础镜像(父镜像)是从哪里来的?有 docker 实用程序可以创建初始父基础映像。它采用所需的操作系统库,并将它们烘焙到基础映像中。您不必这样做,因为您将获得 Linux 发行版的官方基础映像。
映像的顶层是可写的,并由正在运行的容器使用。图像中的其他图层是只读的。
它是 Docker 映像的存储库(存储)。
注册表可以是公共的,也可以是私有的。例如,Docker Inc 提供名为 Docker Hub 的托管注册表服务。它允许您从中心位置上传和下载图像。
注意:默认情况下,安装 docker 时,它会从公共 Docker 中心查找映像,除非在 Docker 设置中指定自定义注册表。
如果您的存储库是公共的,则其他 Docker Hub 用户可以访问您的所有映像。您还可以在 Docker Hub 中创建专用注册表。
Docker 中心的作用类似于 git,您可以在其中在笔记本电脑上本地构建映像,提交它,然后推送到 Docker 中心。
提示:在企业网络/项目中使用 docker 时,请设置自己的 docker 注册表,而不是使用公共 docker hub。所有云提供商都有自己的容器注册表服务。
Docker 容器是从现有映像创建的。它是图像的可写层。
如果您尝试将映像层和容器关联起来,以下是基于 ubuntu 的映像的外观。
来源: docs.docker.com
您可以将应用程序打包到容器中,提交它,并使其成为黄金映像,以便从中构建更多容器。
容器可以启动、停止、提交和终止。如果在未提交容器的情况下终止容器,则所有容器更改都将丢失。
理想情况下,容器被视为不可变对象,不建议对正在运行的容器进行更改。相反,仅出于测试目的对正在运行的容器进行更改。
两个或多个容器可以链接在一起,形成分层应用程序架构。然而,随着 Kubernetes 等容器编排工具的出现,使用 Docker 托管高度可扩展的应用程序变得容易。
containerd 负责管理容器,runc 负责使用来自 containerd 的输入运行容器(在容器内创建命名空间、cgroup 和运行命令)
Docker 引擎由 docker 守护程序、rest 接口和 docker CLI 组成。Docker 守护进程是 systemd dockerd 服务,负责构建 docker 镜像并将 docker 指令发送到 containerd 运行时。
到现在为止,您应该已经很好地了解了 Docker 是什么以及它是如何工作的。
Docker 的最大特性是协作。可以将 Docker 映像推送到存储库,然后下拉到任何其他主机,以从该映像运行容器。
此外,Docker 中心有数千个由用户创建的映像,您可以根据应用程序要求将这些映像下拉到主机。此外,它主要用于 kubernetes 等容器编排工具
如果要为生产工作负载运行 Docker,请确保遵循 Docker 映像的建议做法。