Docker,它是什么,目的是什么

mfr*_*het 90 docker

我几天前听说过Docker,想过去.

但事实上,我不知道这个"容器"的目的是什么?

什么是容器?

它可以取代专用于开发的虚拟机吗?

简单来说,在公司中使用Docker的目的是什么?主要优势?

Jer*_*yal 100

VM Machine:例如,使用VM Machine软件,可以在Windows中安装Ubuntu.他们都会在同一时间跑.它就像在操作系统中构建一个具有CPU,RAM,磁盘,网卡等核心组件的PC,并将它们组装起来就好像它是一台真正的PC一样工作.这样,虚拟PC成为实际PC内的"客户",其实际PC及其操作系统称为主机.

容器:它与上面相同,但它不是使用整个操作系统,而是减少了虚拟操作系统的"不必要"组件,以创建它的最小版本.这导致了LXC(Linux容器)的创建.它比VM Machines更快.

Docker:与虚拟机和容器不同,docker容器不需要或包含单独的操作系统.相反,它依赖于Linux内核的功能并使用资源隔离.
Docker的目的:它的主要重点是自动化软件容器内的应用程序部署以及Linux上操作系统级虚拟化的自动化.它比标准容器更轻巧,并在几秒钟内启动. GGG

(请注意,Docker不需要客户操作系统)

  • VM代表“虚拟机”。无需将其称为“ VM Machine”,因为它将变为“ Virtual Machine machine”。:) (7认同)

BMi*_*tch 28

[注意,这个答案主要关注Linux容器,可能不完全适用于其他操作系统.]

什么是容器?

它是一个应用程序:容器是一种运行彼此隔离的应用程序的方法.容器不是虚拟化硬件来运行多个操作系统,而是依靠虚拟化操作系统来运行多个应用程序.这意味着您可以在与VM相同的硬件上运行更多容器,因为您只运行了一个操作系统副本,并且您不需要为应用的每个实例预分配内存和CPU内核.就像任何其他应用程序一样,当容器需要CPU或内存时,它会分配它们,然后在完成后释放它们,允许其他应用程序稍后使用这些相同的有限资源.

他们利用内核命名空间:默认情况下,每个容器都将接收以下命名空间的环境:

  • 挂载:/容器中的文件系统将/与主机上的不同.
  • PID:进程ID,容器中的pid 1是您启动的应用程序,从主机查看时此pid将有所不同.
  • 网络:默认情况下,容器使用自己的环回接口(127.0.0.1)和专用IP运行.Docker使用Linux桥接网络等技术将多个容器连接在一起.
  • IPC:进程间通信
  • UTS:这包括主机名
  • 用户:您可以选择将所有用户ID偏移到主机的ID

除非您明确删除该隔离,否则这些命名空间中的每一个还会阻止容器查看主机或其他容器中的文件系统或进程之类的内容.

和其他Linux安全工具一样:容器还利用SELinux,AppArmor,Capabilities和Seccomp等其他安全功能来限制容器内的用户(包括root用户)逃脱容器或对主机产生负面影响.

将应用程序与其依赖项打包以实现可移植性:将应用程序打包到容器中不仅需要将应用程序本身,而且将运行该应用程序所需的所有依赖项组装到可移植映像中.此映像是用于创建容器的基本文件系统.因为我们只是隔离应用程序,所以此文件系统不包括虚拟化整个操作系统所需的内核和其他OS实用程序.因此,容器的映像应该比等效虚拟机的映像小得多,从而可以更快地部署到网络中的节点.因此,容器已成为将应用程序部署到云和远程数据中心的流行选择.

它可以取代专用于开发的虚拟机吗?

这取决于:如果您的开发环境正在运行Linux,并且您不需要访问硬件设备,或者可以直接访问物理硬件,那么您将发现可以直接迁移到Linux容器.docker容器的理想目标是基于Web的API(例如REST应用程序)之类的应用程序,您可以通过网络访问这些应用程序.

简单来说,在公司中使用Docker的目的是什么?主要优势?

Dev或Ops:Docker通常以两种路径之一进入环境.开发人员正在寻找一种方法来更快地开发和本地测试他们的应用程序,以及希望在比硬件更少的硬件上运行更多工作负载的操作.

或Devops:理想目标之一是立即从CI/CD部署工具利用Docker,编译应用程序并立即构建部署到开发,CI,prod等的映像.容器通常会缩短移动应用程序的时间从代码签入到可用于测试,使开发人员更有效率.如果设计得当,可以在生产中部署由开发人员和CI工具测试和批准的相同图像.由于该映像包含所有应用程序依赖性,因此显着降低了在开发中工作的生产中断的风险.

可扩展性:我将提到的容器的最后一个关键优势是它们的设计考虑了水平可伸缩性.当您在无负载的情况下拥有无状态应用程序时,由于图像尺寸较小且开销较少,因此容器更容易扩展并且更快.出于这个原因,您会看到许多大型网络公司(如Google和Netflix)正在使用容器.

  • +1 我完全同意你的回答,尤其是“它可以取代虚拟机吗”部分。我在其他地方看到很多评论强调 Docker 不是虚拟机,但是,根据经验,对于许多用例,它同样有效,甚至是更好的替代方案。但是,当您说“可以直接访问物理硬件”时,您是什么意思? (2认同)
  • @tyress 如果您的主机是 Linux,您可以将设备直接挂载到 Linux 容器中。我已经看到它用声音设备完成,但可以添加 /dev 中的任何内容。这绕过了一些容器隔离,但对桌面应用程序等特定任务有意义。 (2认同)

Siy*_*lav 10

几天前我也遇到了同样的问题,进入之后我发现了什么,让我们用非常简单的词来理解。

在当前的应用程序架构和开发过程中一切似乎都很好时,为什么人们会想到 docker 和容器!

举个例子,我们正在开发一个使用 nodeJs、MongoDB、Redis、RabbitMQ 等服务的应用程序[你可以想到任何其他服务]。

现在,如果我们忘记了 docker 或其他容器化应用程序的替代品的存在,我们将在应用程序开发和运输过程中面临以下这些问题。

  1. 服务(nodeJs、mongoDB、Redis、RabbitMQ 等)与操作系统的兼容性(即使在找到与操作系统兼容的版本之后,如果发生与版本相关的意外情况,我们需要再次重新审视兼容性并修复它)。

  2. 如果两个系统组件在操作系统中的应用程序中需要具有不同版本库/依赖项(由于库和依赖项版本问题,每次都需要重新查看应用程序的意外行为)。

  3. 最重要的是,如果新人加入团队,我们发现设置新环境非常困难,人们必须遵循大量指令并运行数百条命令才能最终设置环境,并且需要时间和精力。

    人们必须确保他们使用的是正确版本的操作系统并检查服务与操作系统的兼容性。每个开发人员每次设置时都必须遵循这一点。

  4. 我们也有不同的环境,如开发、测试和生产。如果一个开发人员习惯使用一种操作系统,而另一种人习惯使用其他操作系统,在这种情况下,我们不能保证我们的应用程序在这两种不同情况下的行为方式相同.

所有这些都使我们在开发测试交付应用程序的过程中遇到困难。

所以我们需要一些东西来处理兼容性问题,并允许我们在任何系统组件中进行更改和修改而不影响其他组件。

现在我们考虑 docker,因为它的目的是将应用程序容器化并自动化应用程序的部署并非常轻松地传送它们。

在此处输入图片说明

docker 如何解决以上问题——

  1. 我们可以在不同的容器中运行每个服务组件(nodeJs、MongoDB、Redis、RabbitMQ),在相同的操作系统中但具有不同的环境,它们具有自己的依赖项

  2. 我们只需要运行一次 docker 配置,然后我们所有的团队开发人员就可以开始使用简单的 docker run 命令,我们在这里节省了很多时间和精力:)

因此,容器是隔离的环境,所有依赖项和库都与它们自己的进程网络接口安装捆绑在一起。

所有容器都使用相同的操作系统资源,因此它们启动所需的时间更少,并以更少的硬件成本有效地利用 CPU。

我希望这会有所帮助。


Lor*_*ord 6

为什么使用 docker:Docker 使安装和运行软件变得非常容易,而无需担心设置或依赖关系。Docker 确实让您可以轻松、直接地在任何给定计算机上安装和运行软件,而不仅仅是您的计算机,还可以在 Web 服务器或任何基于云的计算平台上安装和运行软件。例如,当我使用以下命令 wget http://download.redis.io/redis-stable.tar.gz在计算机中安装 redis 时

我遇到错误, 在此输入图像描述

现在我绝对可以去解决这个安装该程序的问题,然后再次尝试安装redis,当你安装和运行软件时,我有点陷入尝试执行以下所有故障排除的无限循环。

在此输入图像描述

现在让我向您展示运行 read 是多么容易,就好像您正在使用 Docker 一样。只需运行命令docker run -it redis,该命令将安装 docker,不会出现任何错误。 在此输入图像描述 什么是 docker:要了解什么是 docker,您必须了解 docker 生态系统。 在此输入图像描述

Docker 客户端、服务器、机器、图像、Hub、Compose 都是项目、工具、软件,它们组合在一起形成一个平台,其中围绕创建和运行称为容器的东西的生态系统,现在如果您运行命令 docker run redis 称为docker CLI 的东西就达到了到一个叫做 Docker Hub 的东西,它下载了一个叫做镜像的文件。

映像是一个包含运行特定程序所需的所有依赖项和所有配置的单个文件,例如redis,这就是您刚刚下载的映像应该运行的内容。

这是存储在硬盘驱动器上的单个文件,在某些时候您可以使用此映像来创建称为容器的东西。 在此输入图像描述

容器是图像的一个实例,您可以将其视为一个正在运行的程序,拥有自己独立的一组硬件资源,因此它有自己的一小部分,或者它自己的小内存空间有自己的小空间网络技术和自己的硬盘空间也很小。

现在让我们检查一下您何时发出以下命令: sudo docker run hello-world

上面的命令将启动 docker 客户端或 docker CLI,Docker CLI 负责从你那里获取命令,对它们进行一些处理,然后将命令传递给称为 docker 服务器的东西,而 docker 服务器位于当我们运行命令 Docker run hello-world 时,负责繁重的工作, 在此输入图像描述 这意味着我们想要使用名为 hello world 的图像启动一个新容器,hello world 图像内部有一个小标题程序,其唯一目的或唯一工作是打印出您在终端。

现在,当我们运行该命令并将其发送到 docker 服务器时,后台很快就会发生一系列操作。Docker 服务器发现我们正在尝试使用名为 hello world 的映像启动一个新容器。

docker 服务器做的第一件事是检查它是否已经有一个本地副本,例如您的个人计算机上的 hello world 图像或 hello world 文件的副本。因此,docker 服务器查看了称为图像缓存的东西。 在此输入图像描述

现在,因为你和我刚刚在我们的个人计算机上安装了 Docker,所以镜像缓存当前为空,我们没有之前已经下载过的镜像。

因此,由于图像缓存为空,docker 服务器决定使用名为 Docker hub 的免费服务。Docker Hub 是一个免费公共镜像存储库,您可以免费下载并在个人计算机上运行。因此,Docker 服务器连接到 Docker Hub,下载了 hello world 文件,并将其存储在您的计算机上的图像缓存中,现在可以在未来的某个时间非常快速地重新运行,而无需从以下位置重新下载它:码头工人中心。

之后docker服务器将使用它创建一个容器的实例,我们知道容器是一个镜像的实例,它的唯一目的是运行一个非常特定的程序。因此,docker 服务器实际上从图像缓存中获取该图像文件并将其加载到内存中,以从中创建一个容器,然后在其中运行一个程序。该单个程序的目的是打印出您看到的消息。

什么是容器: 在此输入图像描述 容器是一个进程或一组进程,它们有一组专门分配给它的资源,下图显示,每当我们考虑容器时,我们都会有一些正在运行的进程,这些进程向内核发送系统调用,内核将查看传入的系统调用并将其定向到硬盘驱动器、RAM、CPU 或它可能需要的任何其他部分的非常特定的部分,并且每个资源的一部分可供该单一资源使用过程。