多克,这是什么,目的是什么

我几天前听说了 Docker 的事,想过去看看。

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

什么是容器?

它能够取代专门用于开发的虚拟机吗?

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

52929 次浏览

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

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

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

(注意,对于 Docker,不需要 Guest OS)

[注意,这个答案集中在 Linux 容器上,可能不完全适用于其他操作系统。]

什么是容器?

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

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

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

这些名称空间中的每一个都阻止容器查看主机或其他容器上的文件系统或进程之类的内容,除非您显式地删除该隔离。

和其他 linux 安全工具 : 容器还利用其他安全特性,如 SELinux、 AppArmar、 Capability 和 Seccomp,以限制容器内的用户(包括 root 用户)逃离容器或对主机造成负面影响。

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

它能够取代专门用于开发的虚拟机吗?

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

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

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

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

可伸缩性 : 我将提到的容器的最后一个关键好处是,它们是为水平可伸缩性而设计的。当您有重负载下的无状态应用程序时,由于容器的图像尺寸较小,开销也较小,因此扩展容器要容易得多,也快得多。因为这个原因,你可以看到很多大型网络公司都在使用容器,比如 Google 和 Netflix。

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

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

什么是容器?

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

容器与映像的不同之处在于容器是 图像的运行时实例-类似于对象是类的运行时实例,如果您熟悉 OOP 的话。

它能够取代专门用于开发的虚拟机吗?

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

VM 运行一个完整的“来宾”操作系统,通过虚拟机监控程序对主机资源进行虚拟访问。这意味着虚拟机经常为环境提供比实际需要更多的资源。通常,虚拟机提供的资源比大多数应用程序所需要的资源都要多。因此,容器是一种轻量级技术。两者解决不同的问题。

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

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

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

使用它们的一些普遍好处:

  • 服务的高度隔离
  • 由于容器包含了应用程序所需的一切,因此具有很好的可管理性
  • 实现技术的封装(在容器中)
  • 与虚拟机相比,有效利用资源(由于操作系统虚拟化的重量较轻)
  • 快速部署

几天前,同样的问题也出现在我的脑海里,我进入其中后发现,让我们用非常简单的语言来理解。

当应用程序体系结构和开发的当前流程看起来一切都很好的时候,为什么还要考虑 Docker 和容器呢! !

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

现在,如果我们忘记了码头或其他容器化应用程序的替代方案的存在,我们将在 应用程序开发和发货流程中面临以下问题。

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

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

  3. 最重要的是,如果新人加入团队,我们发现很难设置新的环境,人们必须遵循大量的指示和运行数百个命令,最终设置环境,这需要时间和精力。

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

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

发展中测试航运的应用过程中,这些都使我们的生活变得困难。

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

现在我们考虑 Docker,因为它的目的是 将应用程序包装起来,自动化应用程序的部署,并非常容易地发布它们。

enter image description here

Docker 如何解决上述问题

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

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

因此,容器是具有所有依赖项和 图书馆与它们自己的 程序和 < strong > 网络绑定在一起 接口 坐骑.

所有容器使用相同的操作系统资源 因此,他们需要更少的时间来启动和利用 CPU 有效率地降低硬件成本。

我希望这能有所帮助。

为什么使用 docker: Docker 使安装和运行软件变得非常容易,而不用担心安装或依赖性。Docker 确实让你在任何给定的计算机上安装和运行软件变得非常简单和直接,不仅仅是你的计算机,还包括网络服务器或任何基于云的计算平台。例如,当我去安装我的计算机重新使用下面的命令 Wget < a href = “ http://download.redis.io/redis-stable.tar.gz”rel = “ norefrer”> http://download.redis.io/redis-stable.tar.gz

我弄错了, enter image description here

现在我完全可以去解决这个安装程序的故障,然后再次尝试安装 redis,我有点陷入了没完没了的循环,试图做所有下面的故障排除,因为你我正在安装和运行软件。

enter image description here

现在让我向您展示如何轻松地运行 read,就好像您正在使用 Docker 一样。只要运行命令 码头修理工,这个命令将安装 docker 没有任何错误。 enter image description here Docker 是什么: 要了解什么是码头,你必须了解码头生态系统。 enter image description here

Docker 客户端,服务器,机器,图片,集线器,组合都是项目工具软件的片段聚集在一起形成了一个平台,在这个平台上,生态系统围绕着创建和运行一个叫做容器的东西,现在如果你运行命令 码头运行重排,一个叫做 Docker CLI 的东西伸向一个叫做 Docker 集线器的东西,它下载了一个叫做图片的文件。

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

这是一个单独的文件,存储在你的硬盘驱动器上,在某个时候你可以使用这个映像来创建一个叫做容器的东西。 enter image description here

一个容器就是一个映像的实例你可以把它想象成一个运行中的程序它有自己独立的硬件资源所以它有自己的小集合或者自己的小内存空间有自己的小网络空间也有自己的小硬盘空间。

现在让我们检查一下什么时候给出下面的命令: Sudo Docker 运营 Hello-world

上面的命令会启动 Docker 客户端或者 Docker CLI Docker CLI 负责接收你的命令对它们进行一些处理然后把命令传递给一个叫 Docker 服务器的东西而 Docker 服务器负责繁重的工作当我们运行 Docker run hello-world 命令时, enter image description here 这意味着我们要启动一个新的容器使用的图像名为 hello world,hello world 图像中有一个小程序,其唯一的目的或唯一的工作是打印出你在终端看到的消息。

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

Docker 服务器做的第一件事就是检查它是否已经有了一个本地副本,比如你的个人机器上的 hello world 图像或者 hello world 文件的副本。所以 docker 服务器查看了一个叫做图像缓存的东西。 enter image description here

现在,因为你和我刚刚在我们的个人电脑上安装了 Docker 图像缓存目前是空的,我们没有已经下载过的图像。

因为映像缓存是空的,所以 Docker 服务器决定使用一个名为 Docker hub 的免费服务。Docker Hub 是一个免费的公共图像库,您可以在个人电脑上免费下载和运行这些图像。所以多克服务器联系了 Docker Hub,下载了 hello world 文件,并将其存储在你的计算机上的图像缓存中,现在它可以在未来的某个时候很快地重新运行,而不必从多克中心重新下载。

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

什么是容器: enter image description here 一个容器是一个进程或者一组进程,它们有一组专门分配给它的资源,下面是一个图表,每当我们想到一个容器,我们有一些正在运行的进程,它们向内核发送一个系统调用,内核就会查看传入的系统调用,并将它指向硬盘驱动器的一个非常特定的部分,内存,CPU 或者其他任何它可能需要的东西,每个资源的一部分被提供给那个单独的进程。

上面有很多很好的答案,我觉得很有帮助。

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

修改 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

不过,下面的问题是开放时,选择多克化

一个简单的弹簧启动应用程序

 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 ?

如果您以前没有任何与 Docker 的经验,这个答案将涵盖作为开发人员所需的基本知识。

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

只需看看建立一个环境需要多长时间,在这个环境中,React 作为前端、节点和针对后端的 Express API,这也需要 Mongo。这只是个开始。然后,当你的团队不断壮大,并且有多个开发人员在同一前端和后端工作,因此他们需要在本地环境中设置相同的资源以进行测试时,你如何保证每个开发人员都会运行相同的环境资源,更不用说相同的版本了?所有这些场景都很好地发挥了 Docker 的优势,其价值来自于使用特定设置、环境甚至资源版本设置 容器。只需键入几个命令,就可以让 Docker 自动安装、安装和运行您的资源。

让我们简要回顾一下主要组成部分。集装箱基本上就是应用程序或特定资源所在的位置。例如,您可以将 Mongo 数据库放在一个容器中,然后将前端 React 应用程序放在第三个容器中,最后将节点表达服务器放在第三个容器中。

然后您有一个 形象,它是从容器构建的。这些映像包含容器在跨任何系统构建容器时完全相同的方式所需的所有信息。就像食谱一样。

然后是 数量,它保存容器的数据。因此,如果应用程序位于静态且不变的容器上,则更改的数据位于卷上。

最后,让所有这些项目说话的片段是 网络。是的,这听起来很简单,但要明白 Docker 中的每个容器都不知道每个容器的存在。他们被完全隔离了。所以除非我们在 Docker 建立网络,否则他们不会知道如何连接彼此。