Docker,它是啥,目的是啥

Posted

技术标签:

【中文标题】Docker,它是啥,目的是啥【英文标题】:Docker, what is it and what is the purposeDocker,它是什么,目的是什么 【发布时间】:2015-03-21 06:41:02 【问题描述】:

我几天前听说过 Docker,想了解一下。

但其实我不知道这个“容器”的目的是什么?

什么是容器?

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

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

【问题讨论】:

How is Docker.io different from a normal virtual machine? 的可能重复项 我觉得更容易shivab.com/blog/docker/2019/01/10/… 【参考方案1】:

VM: 使用虚拟机 (VM) 软件,例如,Ubuntu 可以安装在 Windows 中。他们会同时运行。这就像在一个操作系统中构建一台 PC,其核心组件如 CPU、RAM、磁盘、网卡等,并将它们组装起来就像一台真正的 PC 一样工作。这样一来,虚拟 PC 就成为了实际 PC 中的“客人”,而实际 PC 的操作系统称为主机。

容器: 与上面相同,但不是使用整个操作系统,而是削减了虚拟操作系统的“不必要”组件以创建它的最小版本。这导致了 LXC(Linux 容器)的创建。因此,它应该比 VM 更快、更高效。

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

(请注意,在 Docker 的情况下不需要客户操作系统)

【讨论】:

我尝试寻找有关 docker 的开发部署工作流程的资源,但我似乎找不到任何东西。举个例子,我有一个带有 laravel+angular4 的 Lampp 环境。我是否将某个文件分享给我的队友?如果将应用程序源代码(php html js/ts)放在容器中,如何编辑它?我们还能在源代码上使用 git/svn 吗? VM 代表“虚拟机”。无需将其称为“VM Machine”,因为它会变成“Virtual machine”。 :) 一个 docker 中如何存在不同的操作系统或操作系统版本?如果没有 guestOS 级别,我看不出这怎么可能。我知道 Ubuntu20.04 的 docker 可以安装在 16.04 的主机上。从这个解释中,我不明白这是怎么发生的【参考方案2】:

[请注意,此答案侧重于 Linux 容器,可能并不完全适用于其他操作系统。 ]

什么是容器?

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

它们利用内核命名空间:默认情况下,每个容器都会收到一个环境,其中包含以下命名空间:

装载:文件系统,容器中的/ 与主机上的/ 不同。 PID:进程id,容器中的pid 1是你启动的应用,从宿主机看这个p​​id会不一样。 网络:默认情况下,容器使用自己的环回接口 (127.0.0.1) 和私有 IP 运行。 Docker 使用 Linux 桥接网络等技术将多个容器连接到各自的私有局域网中。 IPC:进程间通信 UTS:这包括主机名 用户:您可以选择将所有用户 ID 与主机的 ID 偏移

这些命名空间中的每一个也会阻止容器查看主机或其他容器中的文件系统或进程等内容,除非您明确移除该隔离。

和其他 linux 安全工具:容器还利用 SELinux、AppArmor、Capabilities 和 Seccomp 等其他安全功能来限制容器内的用户(包括 root 用户)能够逃离容器或对主机产生负面影响。

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

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

视情况而定:如果您的开发环境运行 Linux,并且您不需要访问硬件设备,或者可以直接访问物理硬件,那么您会发现相当直接地迁移到 Linux 容器。 Docker 容器的理想目标是基于 Web 的 API(例如 REST 应用)等应用程序,您可以通过网络访问这些应用程序。

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

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

或 Devops:理想的目标之一是立即从 CI/CD 部署工具中利用 Docker,编译应用程序并立即构建部署到开发、CI、产品等的映像. 容器通常会减少将应用程序从代码签入到可用于测试的时间,从而提高开发人员的效率。如果设计得当,经过开发人员和 CI 工具测试和批准的同一映像可以部署在生产中。由于该映像包含所有应用程序依赖项,因此可以显着降低在开发中工作的产品出现问题的风险。

可扩展性:我要提到的容器的最后一个主要优点是它们在设计时考虑了水平可扩展性。当您在重负载下拥有无状态应用程序时,容器更容易和更快地横向扩展,因为它们的图像大小更小并且开销更低。因此,您会看到许多大型网络公司(例如 Google 和 Netflix)都在使用容器。

【讨论】:

+1 我完全同意您的回答,尤其是“它可以替换虚拟机”部分。我在其他地方看到很多 cmets 强调 Docker 不是虚拟机,但是从经验来看,对于许多用例来说,它的效果一样好,甚至是更好的选择。但是,当您说“可以直接访问物理硬件”时,您是什么意思? @tyress 如果您的主机是 Linux,您可以将设备直接挂载到 Linux 容器中。我已经看到它是用声音设备完成的,但是 /dev 中的任何东西都可以添加。这绕过了一些容器隔离,但对于桌面应用等特定任务是有意义的。 这太棒了。我没想到。 Docker 是一种实现容器的工具,同时提供了所需的生态系统的其余部分,例如 docker hub 上的注册表和嵌入 VM 以运行 Linux 容器的桌面环境。 @iruvar Unix 分时,这里主要是主机名:unix.stackexchange.com/questions/183717/whats-a-uts-namespace【参考方案3】:

前几天我脑子里也有同样的问题,进入之后我发现了什么,让我们用非常简单的语言来理解。

当当前的应用程序架构和开发流程看起来一切正常时,为什么还要考虑 docker 和容器!!

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

如果我们忘记了 docker 或其他容器化应用程序替代方案的存在,现在我们将在 应用程序开发和交付过程中遇到以下问题

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

    如果两个系统组件在 OS 中的应用程序中需要 具有不同版本的库/依赖项(每次都需要重新检查,以防应用程序由于库和依赖项版本问题而出现意外行为)。

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

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

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

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

因此我们需要能够处理兼容性问题并允许我们在任何系统组件中进行更改和修改而不影响其他组件的东西。

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

docker如何解决以上问题-

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

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

所以 容器 是具有所有依赖项和 与自己的进程网络捆绑在一起的库 接口坐骑

所有容器使用相同的操作系统资源 因此它们启动和利用 CPU 的时间更少 以更少的硬件成本实现高效。

我希望这会有所帮助。

【讨论】:

那么什么时候使用docker?当您独自工作并且不需要进行自动测试时?【参考方案4】:

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

我有错误,

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

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

Docker 客户端、服务器、机器、图像、集线器、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 或它可能需要的任何其他东西,并且这些资源中的一部分可供该单一资源使用过程。

【讨论】:

【参考方案5】:

让我尝试提供尽可能简单的答案:

但其实我不知道这个“容器”的目的是什么?

什么是容器?

简单地说:一个包含软件的包。更具体地说,一个应用程序及其所有依赖项捆绑在一起。常规的、非 dockerised 的应用程序环境直接与操作系统挂钩,而 Docker 容器是操作系统的抽象层。

容器与图像的不同之处在于容器是图像的运行时实例 - 类似于在您熟悉 OOP 的情况下对象是类的运行时实例。

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

VM 和 Docker 容器都是虚拟化技术,因为它们在系统基础架构之上提供抽象。

VM 运行完整的“客户”操作系统,通过管理程序对主机资源进行虚拟访问。这意味着 VM 为环境提供的资源通常比它实际需要的多。一般来说,VM 为环境提供的资源比大多数应用程序需要的多。因此,容器是一种重量较轻的技术。两者解决不同的问题。

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

容器化与微服务齐头并进。构成较大应用程序的较小服务通常在 Docker 容器中进行测试和运行。这使得连续测试更容易。

此外,由于 Docker 容器是只读的,它们强制执行一个关键的 DevOps 原则:生产服务应该保持不变

使用它们的一些一般好处:

服务的高度隔离 容器包含应用所需的一切,因此可管理性极佳 实现技术的封装(在容器中) 与 VM 相比,资源利用率更高(由于轻量级操作系统虚拟化) 快速部署

【讨论】:

【参考方案6】:

上面有很多很好的答案,我发现它们真的很有帮助。

下面我草拟了一个更简单的答案:

Docker 化我的 Web 应用程序的原因?

a. One OS for multiple applications ( Resources are shared )

b. Resource manangement ( CPU / RAM) is efficient.

c. Serverless Implementation made easier -Yes, AWS ECS with Fargate, But serverless can be achieved with Lamdba

d. Infra As Code - Agree, but IaC can be achieved via Terraforms

e. "It works in my machine" Issue 

不过,在选择 dockerization 时,以下问题仍然存在

一个简单的spring boot应用程序

 a. Jar file with size ~50MB 

 b. creates a Docker Image ~500MB 

 c. Cant I simply choose a small ec2 instance for my microservices.

财务收益(降低单个实例成本)?

a. No need to pay for individual OS subscription

b. Is there any monetary benefit like the below implementation? 

c. let say select t3.2xlarge ( 8 core / 32 GB) and start 4-5 docker images ?

【讨论】:

【参考方案7】:

如果您之前没有任何 Docker 经验,此答案将涵盖作为开发人员所需的基础知识。

Docker 已成为 DevOps 的标准工具,因为它是提高运营效率的有效应用程序。当您了解创建 Docker 的原因以及它为何如此受欢迎时,主要是因为它能够减少设置运行和开发应用程序的环境所需的时间。

看看设置一个环境需要多长时间,你有 React 作为前端,一个节点和 Express API 作为后端,这也需要 Mongo。而这仅仅是开始。那么当你的团队发展壮大时,有多个开发人员在同一个前端和后端工作,因此他们需要在本地环境中设置相同的资源进行测试,你怎么能保证每个开发人员都运行相同的环境资源呢?相同的版本?所有这些场景都很好地发挥了 Docker 的优势,它的价值来自于使用特定设置、环境甚至资源版本设置 容器。只需键入一些命令,即可让 Docker 自动设置、安装和运行您的资源。

让我们简要介绍一下主要组件。 容器基本上是您的应用程序或特定资源所在的位置。例如,您可以将 Mongo 数据库放在一个容器中,然后将前端 React 应用程序放在第三个容器中。

然后你就有了一个图像,它来自于容器的构建。镜像包含容器在任何系统中以完全相同的方式构建容器所需的所有信息。这就像一个食谱。

然后你就有了volumes,它保存着你的容器的数据。因此,如果您的应用程序位于静态且不变的容器上,则发生变化的数据位于卷上。

最后,让所有这些项目说话的部分是网络。是的,这听起来很简单,但要理解 Docker 中的每个容器都不知道每个容器的存在。他们是完全隔离的。所以除非我们在 Docker 中建立网络,否则他们不会知道如何连接到另一个。

【讨论】:

以上是关于Docker,它是啥,目的是啥的主要内容,如果未能解决你的问题,请参考以下文章

CentOS Docker 映像的目的是啥? [复制]

“docker exec”命令的“-i”和“-t”选项的目的是啥?

Docker是啥?

k8s和docker区别是啥?

Docker和云计算的关系是啥?

Docker和云计算的关系是啥?