什么是Docker和Docker容器?深入了解Docker!

在下面的博客中,我将详细解释——什么是 Docker 以及它是如何工作的。

在继续之前,让我总结一下到目前为止的学习:

  • 虚拟机很慢并且需要很长时间才能启动。
  • 容器速度快,启动速度快,因为它使用主机操作系统并共享相关库。
  • 与虚拟机不同,容器不会浪费或阻塞主机资源。
  • 容器具有针对它们正在运行的应用程序的独立库和二进制文件。
  • 容器由容器化引擎处理。
  • Docker 是可用于创建和运行容器的容器化平台之一。

现在,在这次回顾之后,让我带你前进。

什么是 Docker 和 Docker 容器?

什么是 Docker,为什么需要 Docker?– Docker 是一个容器化平台,它将您的应用程序及其所有依赖项以 docker 容器的形式打包在一起,以确保您的应用程序在任何环境中都能无缝运行。

什么是容器?– Docker Container 是一个标准化单元,可以动态创建以部署特定的应用程序或环境。从操作系统的角度来看,它可以是 Ubuntu 容器、CentOs 容器等来完全满足要求。此外,它可以是面向应用程序的容器,如 CakePHP 容器或 Tomcat-Ubuntu 容器等。

让我们通过一个例子来理解它:

一家公司需要开发一个 Java 应用程序。为此,开发人员将设置一个安装了 tomcat 服务器的环境。应用程序开发完成后,需要由测试人员进行测试。现在测试人员将再次从头开始设置 tomcat 环境来测试应用程序。应用程序测试完成后,将部署在生产服务器上。同样,生产环境需要一个安装了 tomcat 的环境,以便它可以托管 Java 应用程序。如果您看到相同的 tomcat 环境设置已完成三次。我在下面列出了这种方法的一些问题:

1)时间和精力的损失。

2) 在不同的设置中可能存在版本不匹配,即开发人员和测试人员可能已经安装了 tomcat 7,但是系统管理员在生产服务器上安装了 tomcat 9。 

现在,我将向您展示如何使用 Docker 容器来防止这种损失。 

在这种情况下,开发人员将使用 Ubuntu 之类的基础镜像创建一个 tomcat docker 镜像(一个镜像只不过是部署相同配置的多个容器的蓝图),该镜像已经存在于 Docker Hub 中(Hub 有一些基础镜像免费提供)。现在这个镜像可以被开发者、测试者和系统管理员用来部署tomcat环境了。这就是这个容器解决问题的方式。

我希望你能和我一起读这篇文章。如果您还有任何疑问,请随时发表评论,我很乐意为您提供帮助。

但是,现在您会认为这也可以使用虚拟机来完成。但是,如果您选择使用虚拟机,则会遇到问题。 让我们看一下两者之间的比较,以更好地理解这一点。

让我带你看一下上面的图表。Virtual Machine 和 Docker Container 在以下三个参数上进行比较:

  • 大小 – 此参数将比较虚拟机和 Docker 容器在它们使用的资源上。
  • 启动 – 此参数将根据它们的启动时间进行比较。
  • 集成 – 此参数将比较它们与其他工具轻松集成的能力。

我将按照上面列出参数的顺序。所以第一个参数是“Size”。

观看以下视频以了解有关 Docker 容器及其使用原因的更多信息。

尺寸

下图解释了虚拟机和 Docker 容器如何利用分配给它们的资源。

探索课程

考虑上图中描述的情况。我有一个具有 16 GB RAM 的主机系统,我必须在其上运行 3 个虚拟机。要并行运行虚拟机,我需要在虚拟机之间分配我的 RAM。假设我按以下方式分配它:

  • 我的第一个虚拟机需要 6 GB 的 RAM,
  • 我的第二个虚拟机需要 4 GB 的 RAM,并且
  • 6 GB 到我的第三个虚拟机。

在这种情况下,即使使用情况如下,我也不会再留下 RAM:

  • 我的第一个 VM 仅使用4 GB的 RAM – 分配6 GB – 2 GB未使用和阻塞
  • 我的第二个 VM 仅使用3 GB的 RAM – 分配4 GB – 1 GB 未使用和阻塞
  • 我的第三个 VM 仅使用2 GB的 RAM – 分配6 GB – 4 GB未使用和阻塞

这是因为一旦将一块内存分配给虚拟机,该内存就会被阻塞并且无法重新分配。我将总共浪费7 GB ( 2 GB + 1 GB + 4 GB ) 的 RAM,因此无法设置新的虚拟机。这是一个主要问题,因为 RAM 是一种昂贵的硬件。

那么,我该如何避免这个问题呢?

如果我使用 Docker,我的 CPU 将准确分配容器所需的内存量。

  • 我的第一个容器将只使用4 GB的 RAM – 分配4 GB – 0 GB未使用和阻塞
  • 我的第二个容器将仅使用3 GB的 RAM – 分配3 GB – 0 GB未使用和阻塞
  • 我的第三个容器将只使用2 GB的 RAM – 分配2 GB – 0 GB未使用和阻塞

由于没有未使用的已分配内存 (RAM),因此我使用 Docker Container 节省了7 GB ( 16 – 4 – 3 – 2 ) 的 RAM。我什至可以从剩余的 RAM 中创建额外的容器并提高我的工作效率。

所以这里 Docker Container 显然胜过虚拟机,因为我可以根据需要有效地使用我的资源。

启动

启动时,虚拟机需要很长时间才能启动,因为客户操作系统需要从头开始,然后加载所有二进制文件和库。这是耗时的,并且在需要快速启动应用程序时会证明非常昂贵。对于 Docker 容器,由于容器在您的主机操作系统上运行,您可以节省宝贵的启动时间。与虚拟机相比,这是一个明显的优势。

考虑一种情况,我想在我的系统上安装两个不同版本的 Ruby。如果我使用虚拟机,我需要设置 2 个不同的虚拟机来运行不同的版本。在不同的客户操作系统上运行时,它们中的每一个都将拥有自己的一组二进制文件和库。而如果我使用 Docker 容器,即使我将创建 2 个不同的容器,每个容器都有自己的一组二进制文件和库,我将在我的主机操作系统上运行它们。直接在我的主机操作系统上运行它们使我的 Docker 容器更轻巧且更快。

所以 Docker Container 显然基于 Startup 参数再次从虚拟机中获胜。

现在,最后让我们考虑最后一个参数,即积分。

集成呢?

使用虚拟机集成不同的工具也许是可能的,但即使是这种可能性也会带来很多复杂性。

我只能在虚拟机中运行有限数量的 DevOps 工具。如上图所示,如果我想要许多 Jenkins 和 Puppet 实例,那么我需要启动许多虚拟机,因为每个虚拟机只能运行这些工具的一个实例。设置每个 VM 都会带来基础架构问题。如果我决定设置多个 Ansible、Nagios、Selenium 和 Git 实例,我也会遇到同样的问题。在每个 VM 中配置这些工具也是一项繁重的任务。

这就是 Docker 来拯救的地方。使用 Docker Container,我们可以设置许多 Jenkins、Puppet 等实例,它们都运行在同一个容器中或运行在不同的容器中,它们可以通过运行一些命令来相互交互。我还可以通过创建这些容器的多个副本来轻松扩展。所以配置它们不会有问题。

总而言之,毫不夸张地说,与虚拟机相比,这是一个更明智的选择。

前者旨在使开发人员和系统管理员都受益,使其成为许多 DevOps 工具链的一部分。开发人员可以编写代码而无需担心测试或生产环境,系统管理员无需担心基础设施,因为 Docker 可以轻松扩展和缩减部署在服务器上的系统数量。

什么是 Docker 引擎?

现在我将带您了解作为系统核心的 Docker 引擎。

Docker Engine 只是安装在主机上的应用程序。它像一个客户端-服务器应用程序一样工作,它使用:

  • 服务器是一种  称为守护进程的长期运行程序
  • 命令行界面 (CLI) 客户端
  • REST API 用于 CLI 客户端和 Docker Daemon 之间的通信

如上图所示,在 Linux 操作系统中,有一个可以从终端访问的客户端和一个运行守护进程的主机。我们通过将命令从 CLI 客户端传递到守护程序来构建我们的图像并运行容器。


但是,在 Windows/Mac 的情况下,Docker 主机内还有一个额外的工具箱组件。这个 Docker Toolbox 是一个安装程序,可以在您的 Windows/iOS 上快速轻松地安装和设置 Docker 环境。此工具箱安装 Docker Client、Machine、Compose(仅限 Mac)、Kitematic 和 VirtualBox。

现在让我们了解三个重要的术语,即Docker ImagesDocker ContainersDocker Registry

什么是 Docker 镜像?

可以将 Docker Image 与用于创建 Docker 容器的模板进行比较。它们是 Docker 容器的构建块。这些 Docker 镜像是使用 build 命令创建的。这些只读模板用于使用 run 命令创建容器。我们将在“Docker 命令博客”中深入探讨 Docker 命令。 

Docker 让人们(或公司)通过 Docker 镜像创建和共享软件。此外,您不必担心您的计算机是否可以在 Docker 映像中运行该软件——Docker 容器始终可以运行它。 

我可以使用来自docker-hub的现成 docker 镜像,也可以根据我的要求创建一个新镜像。在 Docker 命令博客中,我们将了解如何创建自己的镜像。

什么是 Docker 容器?

Docker 容器是从 Docker 镜像创建的现成应用程序。或者您可以说它们正在运行图像的实例,并且它们包含运行应用程序所需的整个包。这恰好是该技术的最终效用。 

什么是 Docker 注册表?

最后,Docker Registry 是存储 Docker 镜像的地方。Registry 可以是用户的本地存储库,也可以是公共存储库,如 Docker Hub,允许多个用户协作构建应用程序。即使同一组织内有多个团队,也可以通过将容器上传到 Docker Hub 来交换或共享容器,Docker Hub 是一个类似于 GitHub 的云存储库。

什么是 Docker 架构?

Docker 架构包括一个 Docker 客户端——用于触发 Docker 命令、一个 Docker 主机——运行 Docker 守护进程和一个 Docker Registry——存储 Docker 映像。在 Docker Host 中运行的 Docker Daemon 负责镜像和容器。

  • 要构建 Docker 映像,我们可以使用 CLI(客户端)向 Docker 守护进程(在 Docker_Host 上运行)发出构建命令。然后,守护进程将根据我们的输入构建映像并将其保存在注册表中,注册表可以是 Docker 中心或本地存储库
  • 如果我们不想创建镜像,那么我们可以从 Docker hub 中拉取一个镜像,该镜像可能是由其他用户构建的
  • 最后,如果我们必须创建我的 Docker 映像的运行实例,我们可以从 CLI 发出运行命令,这将创建一个容器。

前面提到的是这项技术的一个简单功能!