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

时间:2015-01-22 12:56:18

标签: docker

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

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

什么是容器?

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

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

5 个答案:

答案 0 :(得分:84)

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

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

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

(请注意,如果Docker没有客户操作系统)

答案 1 :(得分:25)

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

  

什么是容器?

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

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

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

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

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

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

  

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

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

  

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

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

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

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

答案 2 :(得分:4)

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

我出错了, enter image description here

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

enter image description here

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

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

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

这是一个存储在您的硬盘驱动器上的单个文件,您可以在某个时间使用此映像来创建称为容器的东西。 enter image description here

一个容器是一个镜像的实例,你可以把它想象成一个正在运行的程序,它有自己的独立硬件资源集,所以它有自己的小集或它自己的小内存空间有它的拥有自己的网络技术空间和自己的硬盘空间。

现在让我们检查您何时发出以下命令: sudo docker run 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 服务器联系 Docker Hub 并下载 hello world 文件并将其存储在您的计算机上的图像缓存中,现在可以在未来的某个时刻快速重新运行,而无需从码头集线器。

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

什么是容器: enter image description here 容器是一个进程或一组进程,它们有一组专门分配给它的资源,在下面的图表中,无论何时我们考虑一个容器,我们都会有一些正在运行的进程向内核发送系统调用,内核将查看传入的系统调用并将其定向到硬盘驱动器的特定部分、RAM、CPU 或它可能需要的任何其他东西,并且这些资源中的每一个的一部分都可用于该单个过程。

答案 3 :(得分:0)

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

  

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

什么是容器?

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

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

  

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

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

VM运行完整的“ guest”操作系统,并通过虚拟机管理程序虚拟访问主机资源。这意味着VM通常为环境提供的资源超出其实际所需的资源。通常,VM为环境提供的资源比大多数应用程序所需的资源更多。因此,容器是一种较轻的技术。两者解决了不同的问题。

  

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

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

此外,由于Docker容器为只读容器,因此它们实施了关键的DevOps原则:生产服务应保持不变

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

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

答案 4 :(得分:0)

几天前,同样的问题引起了我的注意,现在让我们用非常简单的语言来理解。

  

在当前的应用程序体系结构和开发过程中一切正常的情况下,为什么人们会考虑docker和容器!

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

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

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

  2. 如果两个系统组件在OS中的应用程序中需要具有不同版本的库/依赖项(如果由于库和依赖项版本而导致应用程序出现异常行为,则每次都需要重新查看问题)。

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

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

  4. 我们还具有不同的环境,例如开发,测试和生产。如果一个开发人员愿意使用一个操作系统,而另一个开发人员可以使用其他操作系统,则在这种情况下,我们无法保证在这两种不同的情况下,我们的应用程序将以相同的方式运行。

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

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

  

现在我们考虑docker,因为它的目的是   容器化应用程序并自动执行应用程序的部署,并非常容易地运送它们。

enter image description here

码头工人如何解决上述问题-

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

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

  

因此,容器是具有所有依赖项和   库与自己的过程网络捆绑在一起   接口安装

     

所有容器使用相同的OS资源   因此,他们花费更少的时间来启动和利用CPU   硬件成本较低的情况下有效地进行。

我希望这会有所帮助。