我一直在重读Docker文档,试图理解Docker和完整VM之间的区别。它是如何设法提供一个完整的文件系统、隔离的网络环境等而不那么沉重的?

为什么将软件部署到Docker映像(如果这是正确的术语)比简单地部署到一致的生产环境更容易?


当前回答

容器将库和软件包与系统隔离,以便您可以安装相同软件和库的不同版本而不发生冲突。它使用最小的存储空间和内存,使用相同的基本操作系统内核和可用的库几乎没有开销,如果可能的话,差异很小。您可以直接或间接地将硬件暴露给容器,以便可以使用加速(如gpu)进行计算。

在实践中,您可以使用预制容器的docker。您可以安装它们并在一条线上运行它们。安装tensorflow gpu和docker run-it tensorflow gpu一样简单。虽然我没有偶然发现许多lxd(lxc容器)的预制容器,但我发现它们更容易定制,更稳定和性能更好。

容器和VM都可以用来分配负载。但由于容器几乎没有开销,因此容器管理软件专注于创建容器集群,以便您轻松地将它们(从而将负载)分配给金属机器。

真实生活示例:

假设您需要50多种类型的计算环境和50种类型的服务,如mysql、网络托管和基于云的服务(如jenkins和对象存储),并且您有50多种不同的裸机服务器。这是一个典型的学院环境。您需要高效地使用资源,并且需要高可用性。当一台服务器停机时,用户应该不会遇到任何问题。为了解决这个问题,您所做的基本上是在所有服务器上安装所有类型的容器。并将负载分配给所有金属机器。当一种类型的容器需要更多时,可以在一台或多台裸机上自动生成更多容器。因此,许多不同的用户可以连续灵活地使用不同的服务和环境。

在该设置中,假设有100名学生同时使用该系统。其中95人使用服务器进行基本服务,如检查GPA、课程、图书馆数据库等,但其中5人正在进行5种不同类型的工程模拟。您将看到49台裸机服务器完全专用于工程仿真,每台服务器都有5种不同类型的计算容器,每种计算容器都与之相匹配,但与20%的硬件资源使用相平衡。当你为基本任务增加2500名学生时,这将使用所有裸机的5%。其余部分将用于计算。

因此,提供这种灵活性优势的容器最重要的区别特征是:

准备好部署预制容器,几乎没有开销,可快速繁殖具有实时可调整配额

使用.cpu_allowencess、.ram_allowances或直接cgroup。Kubernetes为您提供所有这些服务。在摆弄了docker和lxd之后,你可能想看看它。

其他回答

Docker是这样介绍自己的:

Docker是推动集装箱运输的公司,也是唯一容器平台提供程序,以解决混合云。今天的企业面临着数字化的压力转换,但受现有应用程序和同时合理化日益多样化的投资组合云、数据中心和应用程序架构。Docker启用应用程序和基础架构之间的真正独立性开发人员和IT运营人员释放他们的潜力并创建一个模型以实现更好的协作和创新。

所以Docker是基于容器的,这意味着你有可以在当前机器上运行的图像和容器。它不包括像VM这样的操作系统,而是像Java、Tomcat等一组不同的工作包。

如果你了解容器,你就会了解Docker是什么,以及它与VM的区别。。。

那么,什么是容器?

容器映像是一个轻量级、独立的可执行包一个包含运行它所需的一切的软件:代码,运行时、系统工具、系统库、设置。两者都可用基于Linux和Windows的应用程序、容器化软件将始终运行无论环境如何,都是一样的。容器隔离软件从其环境来看,例如发展和分段环境,帮助减少运行团队之间的冲突同一基础设施上的不同软件。

如下图所示,每个容器都有一个单独的包,并且在一台机器上运行,共享该机器的操作系统。。。它们安全且易于运输。。。

Docker不是一种虚拟化方法。它依赖于实际实现基于容器的虚拟化或操作系统级虚拟化的其他工具。为此,Docker最初使用的是LXC驱动程序,然后转移到libcontainer,现在改名为runc。Docker主要致力于自动化应用程序容器内的应用程序部署。应用程序容器设计用于打包和运行单个服务,而系统容器设计用于运行多个进程,如虚拟机。因此,Docker被认为是容器化系统上的容器管理或应用程序部署工具。

为了了解它与其他虚拟化的区别,我们来了解一下虚拟化及其类型。那么,更容易理解两者之间的区别。

虚拟化

在其构想形式中,它被认为是一种逻辑上划分大型机以允许多个应用程序同时运行的方法。然而,当公司和开源社区能够提供一种以某种方式处理特权指令的方法,并允许多个操作系统在一个基于x86的系统上同时运行时,情况发生了巨大变化。

管理程序

管理程序负责创建来宾虚拟机运行的虚拟环境。它监督宾客系统,并确保在必要时为宾客分配资源。管理程序位于物理机和虚拟机之间,并向虚拟机提供虚拟化服务。为了实现它,它拦截虚拟机上的来宾操作系统操作,并模拟主机操作系统上的操作。

虚拟化技术(主要是云技术)的快速发展进一步推动了虚拟化的使用,允许在虚拟机管理程序(如Xen、VMware Player、KVM等)的帮助下,在单个物理服务器上创建多个虚拟服务器,并将硬件支持纳入商品处理器(如Intel VT和AMD-V)。

虚拟化类型

虚拟化方法可以根据其模拟客户操作系统的硬件和模拟客户操作环境的方式进行分类。主要有三种类型的虚拟化:

仿真准虚拟化基于容器的虚拟化

仿真

仿真(也称为完全虚拟化)完全在软件中运行虚拟机OS内核。此类型中使用的管理程序称为类型2管理程序。它安装在主机操作系统的顶部,负责将来宾操作系统内核代码转换为软件指令。翻译完全由软件完成,不需要硬件参与。仿真使运行任何支持被仿真环境的未修改操作系统成为可能。这种虚拟化的缺点是额外的系统资源开销,与其他类型的虚拟化相比,这会导致性能下降。

此类别中的示例包括VMware Player、VirtualBox、QEMU、Bochs、Parallels等。

准虚拟化

准虚拟化(Paravirtualization)也称为第1类虚拟机管理程序,直接在硬件或“裸机”上运行,并直接向其上运行的虚拟机提供虚拟化服务。它帮助操作系统、虚拟化硬件和真实硬件协作以实现最佳性能。这些虚拟机监控程序通常占地面积很小,本身不需要大量资源。

此类别中的示例包括Xen、KVM等。

基于容器的虚拟化

基于容器的虚拟化,也称为操作系统级虚拟化,支持在单个操作系统内核中执行多个独立的执行。它具有最佳的性能和密度,并具有动态资源管理功能。这种类型的虚拟化提供的隔离虚拟执行环境被称为容器,可以被视为一组可跟踪的进程。

通过添加到Linux内核2.6.24版本中的命名空间特性,容器的概念成为可能。容器将其ID添加到每个进程,并将新的访问控制检查添加到每个系统调用。它由clone()系统调用访问,该系统调用允许创建先前全局命名空间的单独实例。

命名空间可以以多种不同的方式使用,但最常见的方法是创建一个独立的容器,该容器对容器外部的对象没有可见性或访问权限。在容器内运行的进程似乎在正常的Linux系统上运行,尽管它们与位于其他命名空间中的进程共享底层内核,其他类型的对象也是如此。例如,当使用命名空间时,容器内的根用户不会被视为容器外的根用户,从而增加了额外的安全性。

Linux控制组(cgroups)子系统是实现基于容器的虚拟化的下一个主要组件,用于对进程进行分组并管理其总资源消耗。它通常用于限制容器的内存和CPU消耗。由于容器化的Linux系统只有一个内核,并且内核对容器具有完全的可见性,因此只有一个级别的资源分配和调度。

Linux容器有多种管理工具,包括LXC、LXD、systemd nspawn、lmctfy、Warden、Linux VServer、OpenVZ、Docker等。

容器与虚拟机

与虚拟机不同,容器不需要启动操作系统内核,因此可以在不到一秒钟的时间内创建容器。这一特性使基于容器的虚拟化比其他虚拟化方法更为独特和可取。

由于基于容器的虚拟化几乎不会或根本不会增加主机的开销,因此基于容器的虚化具有接近本机的性能

对于基于容器的虚拟化,与其他虚拟化不同,不需要额外的软件。

主机上的所有容器共享主机的调度程序,从而节省了额外的资源。

与虚拟机映像相比,容器状态(Docker或LXC映像)的大小较小,因此容器映像易于分发。

容器中的资源管理是通过cgroups实现的。Cgroups不允许容器消耗比分配给它们的资源更多的资源。然而,到目前为止,主机的所有资源在虚拟机中都是可见的,但无法使用。这可以通过同时在容器和主机上运行top或htop来实现。所有环境的输出看起来都很相似。

更新:

Docker如何在非Linux系统中运行容器?

如果由于Linux内核中的可用特性,容器是可能的,那么显而易见的问题是非Linux系统如何运行容器。Docker for Mac和Windows都使用Linux虚拟机来运行容器。Docker工具箱用于在Virtual Box VM中运行容器。但是,最新的Docker在Windows中使用Hyper-V,在Mac中使用Hypervisor.framework。

现在,让我详细描述Docker for Mac如何运行容器。

Docker for Mac使用https://github.com/moby/hyperkit为了模拟hypervisor功能,Hyperkit在其核心中使用hypervisor.framework。Hypervisor.framework是Mac的本地管理程序解决方案。Hyperkit还使用VPNKit和DataKit分别命名网络和文件系统。

Docker在Mac上运行的Linux VM是只读的。但是,您可以通过运行以下命令来实现:

screen~/Library/Containers/com.docker.docker/Data/vms/0/tty。

现在,我们甚至可以检查此VM的内核版本:

#uname-aLinux linuxkit-025000000001 4.9.93-linuxkit-aufs#1 SMP 6月6日星期三16:86_64 Linux。

所有容器都在此VM内运行。

hypervisor.framework有一些限制。因为Docker没有在Mac中公开docker0网络接口。因此,您无法从主机访问容器。目前,docker0仅在VM中可用。

Hyper-v是Windows中的本机管理程序。他们还试图利用Windows 10的功能以本机方式运行Linux系统。

好答案。为了获得容器与VM的图像表示,请查看下面的一个。

来源

关于:-

“为什么将软件部署到docker映像比简单部署到一致的生产环境?"

大多数软件都部署到许多环境中,通常至少部署以下三种环境:

个人开发者PC共享开发人员环境单个测试仪PC共享测试环境QA环境UAT环境负载/性能测试实时登台生产档案文件

还需要考虑以下因素:

根据工作的性质,开发人员,甚至测试人员,都将拥有微妙的或完全不同的PC配置开发人员通常可以在公司或企业标准化规则无法控制的PC上进行开发(例如,在自己的机器上开发的自由职业者(通常是远程开发的),或未“受雇”或“签约”以某种方式配置其PC的开源项目的贡献者)某些环境将由负载平衡配置中的固定数量的多台计算机组成许多生产环境将根据流量级别动态(或“弹性”)创建和销毁基于云的服务器

正如你所看到的,一个组织的服务器总数很少是一位数,通常是三位数,而且很容易更高。

这一切都意味着,仅仅因为巨大的容量(即使是在绿地场景中),首先创建一致的环境就已经足够困难了,但鉴于服务器数量众多、新服务器的添加(动态或手动)、o/s供应商、防病毒供应商、浏览器供应商等的自动更新,由开发人员或服务器技术人员执行的手动软件安装或配置更改等。让我重复一遍-保持环境一致几乎是不可能的(没有双关语)(好吧,对于纯粹主义者来说,这是可以做到的,但这需要大量的时间、精力和纪律,这正是为什么VM和容器(例如Docker)最初被设计出来的原因)。

因此,请更像这样思考您的问题:“鉴于保持所有环境一致性的极端困难,即使考虑到学习曲线,将软件部署到docker映像中是否更容易?”。我想你会发现答案总是“是”——但只有一种方法可以找到,在Stack Overflow上发布这个新问题。

他们都很不同。Docker是轻量级的,使用LXC/libcontainer(它依赖于内核命名空间和cgroups),并且没有机器/硬件仿真,如管理程序、KVM。Xen,它们很重。

Docker和LXC更多地用于沙箱、容器化和资源隔离。它使用主机操作系统(目前只有Linux内核)的克隆API,为IPC、NS(装载)、网络、PID、UTS等提供命名空间。

内存、I/O、CPU等呢。?这是使用cgroups来控制的,在cgroups中,您可以创建具有特定资源(CPU、内存等)规范/限制的组,并将进程放入其中。在LXC之上,Docker提供了一个存储后端(http://www.projectatomic.io/docs/filesystems/)例如,联合安装文件系统,您可以在不同的安装名称空间之间添加层和共享层。

这是一个强大的功能,其中基本映像通常是只读的,只有当容器修改层中的某些内容时,才会将某些内容写入读写分区(也称为写时复制)。它还提供了许多其他包装,如图像的注册和版本控制。

对于普通的LXC,您需要附带一些rootfs或共享rootfs,当共享时,这些更改会反映在其他容器上。由于这些新增功能,Docker比LXC更受欢迎。LXC在嵌入式环境中很受欢迎,用于围绕暴露于外部实体(如网络和UI)的进程实现安全性。Docker在需要一致生产环境的云多租户环境中非常流行。

一个普通的虚拟机(例如VirtualBox和VMware)使用一个虚拟机管理程序,相关技术要么有专用的固件,成为第一个操作系统(主机操作系统或客户操作系统0)的第一层,要么有一个在主机操作系统上运行的软件,为客户操作系统提供硬件仿真,如CPU、USB/附件、内存、网络等。截至2015年,VM在高安全性多租户环境中仍然很受欢迎。

Docker/LXC几乎可以在任何便宜的硬件上运行(只要你有更新的内核,少于1 GB的内存也可以),而正常的VM需要至少2 GB的内存等,才能使用它进行任何有意义的操作。但主机操作系统上的Docker支持在Windows(截至2014年11月)等操作系统中不可用,在Windows、Linux和Mac上可以运行各种类型的VM。

这是docker/rightscale的照片: