Py学习  »  Hassan Ahmed Touraj Ebrahimi  »  全部回复
回复总数  3
5 年前
回复了 Hassan Ahmed Touraj Ebrahimi 创建的主题 » VM的Guesto和Docker的Basic Image有什么区别?

我经常在生产环境和舞台上使用Docker。当你习惯了它,你会发现它对于构建一个多容器和隔离的环境非常强大。

Docker是基于LXC(Linux容器)开发的,在许多Linux发行版,尤其是Ubuntu中都能完美运行。

Docker容器是孤立的环境。你可以在发布 top 从Docker映像创建的Docker容器中的命令。

例如,您可以创建一个Docker映像,配置Docker文件,并告诉它,例如,当它运行时,wget'this',apt get'that',运行'some shell script',设置环境变量等等。

在微服务项目和架构中,Docker是一项非常可行的资产。您可以通过Docker、Docker swarm、Kubernetes和Docker Compose实现可伸缩性、弹性和弹性。

关于Docker的另一个重要问题是Docker Hub及其社区。 例如,我使用Prometheus、Grafana、Prometheus JMX Exporter和Docker实现了一个监控卡夫卡的生态系统。

为此,我下载了zookeeper、kafka、Prometheus、Grafana和jmx collector的配置Docker容器,然后使用YAML文件为其中一些容器或其他容器安装了我自己的配置,我更改了Docker容器中的一些文件和配置,并在一台机器上使用多容器Docker构建了一个监控kafka的完整系统,该系统具有隔离性、可扩展性和弹性,该体系结构可以轻松地移动到多个服务器中。

除了Docker Hub网站,还有另一个名为quay的网站。io,您可以使用它在那里拥有自己的Docker images仪表板,并在其中拉/推。您甚至可以将Docker图像从Docker Hub导入quay,然后在自己的机器上从quay运行它们。

注意:首先学习Docker似乎既复杂又困难,但当你习惯了它,你就不能没有它工作。

我记得第一次使用Docker的时候,我发出了错误的命令,或者错误地删除了我的容器以及所有的数据和配置。

5 年前
回复了 Hassan Ahmed Touraj Ebrahimi 创建的主题 » VM的Guesto和Docker的Basic Image有什么区别?

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

为了了解它与其他虚拟化有什么不同,我们来看看虚拟化及其类型。那么,就更容易理解其中的区别了。

虚拟化

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

管理程序

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

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

虚拟化的类型

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

  • 模仿
  • 半虚拟化
  • 基于容器的虚拟化

模仿

Emulation

这类示例包括VMware Player、VirtualBox、QEMU、Bochs、Parallels等。

半虚拟化

半虚拟化,也称为1型虚拟机监控程序,直接在硬件或裸机上运行,并直接向其上运行的虚拟机提供虚拟化服务。它帮助操作系统、虚拟化硬件和真实硬件协作以实现最佳性能。这些虚拟机监控程序通常占用的空间很小,而且本身不需要大量资源。

这一类的例子包括Xen、KVM等。

Paravirtualization

基于容器的虚拟化

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

Container-based virtualization

容器的概念是由Linux内核2.6.24版中添加的名称空间特性实现的。容器向每个进程添加其ID,并向每个系统调用添加新的访问控制检查。可以通过 克隆() 允许创建以前全局命名空间的单独实例的系统调用。

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

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

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

容器与虚拟机

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

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

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

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

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

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

更新:

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

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

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

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

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

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

现在,我们甚至可以检查这个虚拟机的内核版本:

# uname -a Linux linuxkit-025000000001 4.9.93-linuxkit-aufs #1 SMP Wed Jun 6 16:86_64 Linux .

所有容器都在这个虚拟机中运行。

虚拟机监控程序有一些限制。框架因为Docker不会暴露 docker0 Mac中的网络接口。因此,您无法从主机访问容器。到目前为止, docker0 仅在虚拟机内部可用。

Hyper-v是Windows中的本机虚拟机监控程序。他们还试图利用Windows 10的功能在本地运行Linux系统。

5 年前
回复了 Hassan Ahmed Touraj Ebrahimi 创建的主题 » VM的Guesto和Docker的Basic Image有什么区别?

Docker最初使用 LinuX Containers (LXC),但后来切换到 runC (原名 libcontainer ),它在与其主机相同的操作系统中运行。这允许它共享大量主机操作系统资源。此外,它使用分层文件系统( AuFS )并管理网络。

AuFS是一个分层文件系统,因此您可以将只读部分和写入部分合并在一起。可以将操作系统的公共部分设置为只读(并在所有容器中共享),然后为每个容器提供自己的写入挂载。

假设你有一个1GB的容器图像;如果你想使用一个完整的虚拟机,你需要有1GB x数量的虚拟机。使用Docker和AuFS,您可以在所有容器之间共享1GB的大部分空间,如果您有1000个容器,您可能仍然只有略多于1GB的空间用于容器操作系统(假设它们都运行相同的操作系统映像)。

一个完整的虚拟化系统会得到自己分配给它的一组资源,并进行最少的共享。你得到了更多的隔离,但它要沉重得多(需要更多的资源)。有了Docker,隔离度会降低,但容器是轻量级的(需要的资源更少)。因此,您可以轻松地在主机上运行数千个容器,而且它甚至不会闪烁。试着用Xen这样做,除非你有一个非常大的主机,否则我认为这是不可能的。

一个完整的虚拟化系统通常需要几分钟才能启动,而Docker/LXC/runC容器则需要几秒钟,通常甚至不到一秒钟。

每种类型的虚拟化系统都有其优缺点。如果你想在保证资源的情况下实现完全隔离,那么一个完整的虚拟机就是最好的选择。如果您只是想将进程彼此隔离开来,并想在一台大小合理的主机上运行大量进程,那么Docker/LXC/runC似乎是一个不错的选择。

有关更多信息,请查看 this set of blog posts 这很好地解释了LXC的工作原理。

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

部署一致的生产环境说起来容易做起来难。即使你使用像这样的工具 Chef Puppet ,主机和环境之间总会有操作系统更新和其他变化。

Docker使您能够将操作系统快照到共享映像中,并使其易于部署到其他Docker主机上。本地、开发、qa、产品等:都是相同的图像。当然,你可以用其他工具来实现这一点,但不是那么容易或快速。

这是伟大的测试;假设有数千个测试需要连接到数据库,每个测试都需要数据库的原始副本,并将对数据进行更改。实现这一点的经典方法是在每次测试后使用自定义代码或类似的工具重置数据库 Flyway -这可能非常耗时,并且意味着测试必须连续运行。但是,使用Docker,您可以创建数据库的映像,并在每个测试中运行一个实例,然后并行运行所有测试,因为您知道它们都将针对数据库的同一快照运行。由于这些测试是并行运行的,并且是在Docker容器中运行的,所以它们可以同时在同一个盒子上运行,并且应该完成得更快。试着用一个完整的虚拟机。

从评论中。。。

有趣的我想我仍然对“快照操作系统”的概念感到困惑。如果不制作操作系统的图像,人们如何做到这一点?

好吧,看看我能不能解释一下。您从一个基本映像开始,然后进行更改,并使用docker提交这些更改,它将创建一个映像。此图像仅包含与基础的差异。当你想运行你的图像时,你还需要一个底座,它使用一个分层文件系统将你的图像分层在底座上:如上所述,Docker使用AuFS。AUF将不同的层合并在一起,你就能得到你想要的;你只需要运行它。您可以继续添加越来越多的图像(层),它将继续只保存差异。因为Docker通常建立在一个 registry ,您很少需要自己“快照”整个操作系统。