当涉及到基于容器的实现时,Docker 已经成为事实上的标准。Docker 是基于容器的编排的基础,从小规模实施到大规模企业应用程序。
Docker 很快在 DevOps 中获得了如此多的普及和采用,因为它是为可移植性而开发的,并且是为现代微服务架构而设计的。
1.什么是 Docker?
2.了解 Docker,了解 Docker 的优势以及不同于其他容器技术的原因
3.Docker 核心架构及其关键组件
4.容器演进和 Linux 容器的基本概念
5.什么是容器,哪些 Linux 功能使其工作?
6.进程、容器和 VM 之间的区别
一、什么是 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命令和参数来启动并运行容器。
1.1 Docker 和容器之间的区别
Docker 是一种为有效管理容器而开发的技术或工具。
那么,我可以在没有 Docker 的情况下运行容器吗?
是的!答案是肯定的。您可以使用 LXC 技术在 Linux 服务器上运行容器。此外,像 Podman 这样的最新工具提供了与 Docker 类似的工作流程。
关于 Docker 你应该知道的事情:
Docker 不是 LXC
Docker 不是虚拟机解决方案。
Docker 不是配置管理系统,也不是 Chef、Puppet、Ansible 等的替代品。
Docker 不是一种平台即服务技术。
Docker 不是一个容器。
1.2 是什么让 Docker 如此出色?
Docker 具有高效的工作流,可将应用程序从开发人员的笔记本电脑移动到测试环境,再迁移到生产环境。当您查看将应用程序打包到 Docker 映像中的实际示例时,您将对它有更多了解。
您知道启动 docker 容器只需不到一秒钟的时间吗?
它的速度非常快,可以在任何具有兼容 Linux 内核的主机上运行。(也支持 Windows)
**注意:**您无法在 Linux 主机上运行 Windows 容器,因为 Windows 不支持 Linux 内核。您可以从此处阅读有关 Windows 容器的信息
Docker 使用写入时复制并集文件系统作为其映像存储。因此,当对容器进行更改时,只会使用写入模型上的副本将更改写入磁盘。
使用写入时复制,您将拥有所有容器的优化共享存储层。
二、Docker 核心架构
以下部分将介绍 Docker 体系结构及其相关组件。我们还将研究每个组件如何协同工作以使 Docker 工作。
自成立以来,Docker 架构已经发生了几次变化。
以下是 Docker 发生的一些值得注意的架构更改
Docker 在 2014 年从 LXC 迁移到 libcontainer
runc – 用于启动符合所有 OCI 规范的容器的 CLI。
containerd – Docker 在 2016 年将其容器管理组件分离到 containerd
OCI:Open Container Initiative 是容器运行时和规范的开放行业标准。
当 Docker 最初推出时,它有一个单体架构。现在它分为以下三个不同的组件。
Docker 引擎 (dockerd)
docker-containerd (容器)
docker-runc (运行时)
Docker 和其他大型组织为标准的容器运行时和管理层做出了贡献。因此,现在是云原生基金会的一部分,贡献者来自所有组织。containerd``runc
**注意:**安装 Docker 时,将安装所有这些组件。您不必单独安装它。为了说明,我们将其显示为不同的组件。
2.1 Docker 引擎
Docker 引擎由 docker 守护程序、API 接口和 Docker CLI 组成。Docker 守护程序 (dockerd) 作为 systemd 服务持续运行。它负责构建 docker 映像。
若要管理映像和运行容器,请调用 API。dockerd``docker-containerd
2.2 docker-containerd (容器)
containerd是另一个系统守护程序服务,负责下载 docker 映像并将其作为容器运行。它公开其 API 以接收来自服务的指令dockerd
2.3 docker-runc
runc是负责创建容器所需的命名空间和 cgroup 的容器运行时。然后,它会在这些命名空间中运行容器命令。runc 运行时是按照 OCI 规范实现的。
阅读这篇由 3 部分组成的优秀博客文章系列,了解有关容器运行时的更多信息。
三、Docker 是如何工作的?
我们已经看到了 Docker 的核心构建块。
现在,让我们使用 Docker 组件来了解 Docker 工作流。
3.1 Docker 组件
以下官方高级 docker 架构图显示了常见的 Docker 工作流。
Docker 生态系统由以下四个组件组成
Docker 守护程序 (dockerd)
Docker 客户端
Docker 镜像
Docker 注册表
Docker 容器
3.2 什么是 Docker 守护程序?
Docker 具有客户端-服务器体系结构。Docker Daemon () 或服务器负责与容器相关的所有操作。dockerd
守护程序通过 CLI 或 REST API 从 Docker 客户端接收命令。Docker 客户端可以与守护程序位于同一主机上,也可以存在于任何其他主机上。
缺省情况下,docker 守护程序侦听 UNIX 套接字。如果您有任何远程访问 docker API 的用例,则需要通过主机端口公开它。其中一个用例是将 Docker 作为 Jenkins 代理运行。docker.sock
如果要在 Docker 中运行 Docker,可以从主机使用 Docker。docker.sock
3.3 什么是 Docker 镜像?
镜像是 Docker 的基本构建块。它包含用于运行应用程序的操作系统库、依赖项和工具。
可以使用应用程序依赖项预生成映像,以创建容器。例如,如果要将 Nginx Web 服务器作为 Ubuntu 容器运行,则需要使用 Nginx 二进制文件和运行 Nginx 所需的所有操作系统库创建一个 Docker 映像。
3.4 什么是 Dockerfile?
Docker 有一个用于构建映像的概念。Dockerfile:每行包含一个命令(指令)的文本文件。Dockerfile
下面是 Dockerfile 的示例。
docker 映像以分层方式组织。a 上的每条指令都会在图像中添加一个图层。映像的最顶层是容器。Dockerfile
每个映像都是从基础映像创建的。