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

Docker, what is it and what is the purpose

几天前听说过Docker,想过去。

但其实我也不知道这个"container"的目的是什么?

什么是容器?

是否可以替代开发专用的虚拟机?

简而言之,在公司使用 Docker 的目的是什么?主要优势?

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

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

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

(请注意,在 Docker 的情况下不需要访客 OS)

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

What is a container ?

这是一个应用程序:容器是运行应用程序彼此隔离的一种方式。容器不是将硬件虚拟化为 运行 多个操作系统,而是依赖于将操作系统虚拟化为 运行 多个应用程序。这意味着你可以 运行 在相同的硬件上比 VM 更多的容器,因为你只有一份 OS 运行ning,你不需要预分配内存和 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 用户)能够逃脱容器或对主机产生负面影响。

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

Can it replace a virtual machine dedicated to development ?

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

What is the purpose, in simple words, of using Docker in companies ? The main advantage ?

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

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

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

让我尝试提供与 possible 一样简单的答案:

But in fact, I don't know what is the purpose of this "container"?

什么是容器?

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

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

Can it replace a virtual machine dedicated to development?

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

VM 运行 是一个完整的“来宾”操作系统,可以通过管理程序虚拟访问 host 资源。这意味着 VM 通常会为环境提供比其实际需要更多的资源。一般来说,VM 为环境提供的资源多于 most 应用程序所需的资源。因此,容器是一种lighter-weight技术。两者解决不同的问题。

What is the purpose, in simple words, of using Docker in companies? The main advantage?

容器化 hand-in-hand 与 micros 服务。组成较大应用程序的较小服务通常在 Docker 容器中进行测试和 运行。这使得连续测试更容易。

另外,因为 Docker 容器是 read-only 它们强制执行一个关键的 DevOps 原则:生产服务应该保持不变

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

  • 服务隔离度高
  • 出色的可管理性,因为容器包含应用程序所需的一切
  • 实现技术的封装(在容器中)
  • 与虚拟机相比,资源利用效率更高(由于 light-weight os 虚拟化)
  • 快速部署

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

Why one would think about docker and containers when everything seems fine with current process of application architecture and development !!

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

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

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

  2. 如果两个系统组件需要library/dependency不同版本在OS中的应用(那需要每次都重新看由于库和依赖项版本问题导致应用程序出现意外行为的情况。

  3. 最重要的是,如果新人加入团队,我们发现设置新环境非常困难,人必须遵循大量的说明并且运行 数百条命令,最终搭建环境,费时费力。

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

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

所有这些都让我们在开发测试运输的过程中生活困难应用程序。

所以我们需要处理兼容性问题并允许我们在不影响其他组件的情况下对任何系统组件进行更改和修改。

Now we think about docker because it's purpose is to containerise the applications and automate the deployment of applications and ship them very easily.

docker如何解决以上问题-

  1. 我们可以运行每个服务组件(nodeJs、MongoDB、Redis、RabbitMQ)在不同的容器中有自己的dependencieslibraries 在相同的 OS 但环境不同。

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

So containers are isolated environments with all dependencies and libraries bundled together with their own process and networking interfaces and mounts.

All containers use the same OS resources therefore they take less time to boot up and utilise the CPU efficiently with less hardware costs.

希望对您有所帮助。

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

我收到错误,

现在我绝对可以去解决这个安装那个程序然后尝试再次安装 redis,我有点陷入无休止的循环尝试在你安装和 运行ning 时尝试进行所有波纹管故障排除软件。

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

Docker 客户端、服务器、机器、图像、集线器、组合都是项目工具软件的一部分,它们聚集在一起形成一个平台,在这个平台上,围绕创建和 运行 宁一个叫做容器的东西,现在,如果你 运行 命令 docker 运行 redis 一个叫做 docker 的东西 CLI 连接到一个叫做 Docker 的东西Hub,它下载了一个名为图像的文件。

图像是一个包含所有依赖项和所有配置的文件 运行 一个非常具体的程序,例如 redis 这就是图像您刚刚下载的那个应该 运行.

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

容器是图像的一个实例,您可以把它想象成一个 运行ning 程序,它有自己独立的硬件资源集,所以它有自己的小集合或它的自己的小 space 内存有自己的小 space 网络技术和自己的小 space 硬盘驱动器 space。

现在让我们检查下何时发出以下命令: sudo docker 运行 你好世界

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

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

docker 服务器做的第一件事是检查它是否已经有一个本地副本,比如你个人机器上的 hello world 图像或那个 hello world file.So 的副本docker 服务器查看了称为图像缓存的东西。

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

因此,由于图像缓存为空,docker 服务器决定使用名为 Docker hub 的免费服务。 Docker 集线器是免费 public 图片的存储库,您可以免费下载这些图片并 运行 在您的个人计算机上。所以 Docker 服务器连接到 Docker Hub 并下载了 hello world 文件并将其存储在您计算机上的图像缓存中,现在可以在某个时候重新 运行未来非常快,无需从 docker 中心重新下载。

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

什么是容器: 容器是一个进程或一组进程,它们具有专门分配给它的一组资源,下图是一个图表,无论何时我们想到一个容器,我们都有一些 运行ning 进程发送一个对内核的系统调用,内核将查看传入的系统调用并将其定向到硬盘驱动器的非常特定的部分,RAM,CPU 或它可能需要的任何其他部分以及每个部分这些资源中的一部分可用于该单一进程。

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

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

将我的 Web 应用程序 docker 化的原因?

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启动应用程序

 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 应用程序,最后是第三个容器中的节点快递服务器。

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

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

最后,让所有这些项目都能说话的部分是网络。是的,这听起来很简单,但请理解 Docker 中的每个容器都不知道每个容器的存在。他们是完全孤立的。因此,除非我们在 Docker 中设置网络,否则他们将不知道如何相互连接。