我一直在反复阅读Docker文档,试图理解Docker和完整虚拟机之间的区别。它如何在不过重的情况下提供完整的文件系统、隔离的网络环境等等。
为什么将软件部署到Docker镜像(如果这是正确的术语)比仅仅部署到一致的生产环境更容易呢?
我一直在反复阅读Docker文档,试图理解Docker和完整虚拟机之间的区别。它如何在不过重的情况下提供完整的文件系统、隔离的网络环境等等。
为什么将软件部署到Docker镜像(如果这是正确的术语)比仅仅部署到一致的生产环境更容易呢?
来源: https://azure.microsoft.com/zh-cn/blog/containers-docker-windows-and-trends/
有三种不同的设置可以提供一个运行应用程序的堆栈(这将帮助我们认识到容器是什么,并使其比其他解决方案更强大):
1) Traditional Servers(bare metal)
2) Virtual machines (VMs)
3) Containers
1) 传统服务器堆栈由运行操作系统和应用程序的物理服务器组成。
优点:
充分利用原始资源
隔离性
缺点:
2) 虚拟机堆栈由运行操作系统和管理虚拟机、共享资源和网络接口的hypervisor组成。每个虚拟机都运行一个客户操作系统、一个应用程序或一组应用程序。
优点:
缺点:
3) 容器设置与其他堆叠的关键区别在于基于容器的虚拟化使用主机操作系统的内核来运行多个隔离的客户实例。这些客户实例称为容器。主机可以是物理服务器或VM。
优点:
缺点:
通过将容器设置与其前身进行比较,我们可以得出结论,容器化是到目前为止最快、最有效的、最安全的设置。容器是运行应用程序的隔离实例。Docker会以一种方式启动容器,使图层在默认存储驱动程序(覆盖驱动程序)中获得运行时内存,这些驱动程序在几秒钟内运行并创建写时复制层,一旦我们提交到容器中,它就会生成执行容器的电力。对于虚拟机,这将需要约一分钟才能将一切加载到虚拟化环境中。这些轻量级实例可以轻松替换、重建和移动。这使我们能够镜像生产和开发环境,并在CI/CD过程中提供极大的帮助。容器可以提供的优势是如此令人信服,以至于它们肯定会留下来。
关于:
“为什么将软件部署到Docker镜像比部署到一致的生产环境更容易?”
大多数软件都部署到许多环境中,通常至少需要以下三个环境:
还有以下因素需要考虑:
正如您所看到的,组织的总服务器数量很少是单个数字,通常是三位数甚至更高。
这就意味着即使在一个绿野场景下,由于数量上的原因,创建一致的环境已经足够困难,但是考虑到服务器数量众多、新服务器的添加(动态或手动)、来自操作系统供应商、反病毒软件供应商、浏览器供应商等的自动更新,以及由开发人员或服务器技术人员执行的手动软件安装或配置更改等,保持它们的一致性几乎是不可能的。让我重申一下 - 保持环境一致几乎是不可能的(好吧,对于纯粹主义者来说,这可以做到,但它涉及巨大的时间、精力和纪律,这正是为什么虚拟机和容器(例如Docker)首先被设计出来的原因)。有许多答案更详细地解释了两者之间的区别,但这是我非常简短的解释。
一个重要的区别是VM使用单独的内核来运行操作系统。这就是它沉重,启动时间长,消耗更多的系统资源的原因。
Docker中的容器与主机共享内核,因此它很轻便,可以快速启动和停止。
在虚拟化中,资源在设置开始时分配,因此当虚拟机在许多时间处于空闲状态时,资源没有完全利用。在Docker中,容器不会被分配固定数量的硬件资源,根据需要自由使用资源,因此它具有高度可伸缩性。
Docker使用UNION文件系统 .. Docker使用写时复制技术来减少容器消耗的内存空间。在这里阅读更多内容
使用虚拟机,我们有一个服务器,上面有一个宿主操作系统,然后还有一个超级监视器。在这个超级监视器之上运行,我们可以在该服务器上放置许多客户操作系统及其应用程序和相关的二进制文件和库。这使得整个客户操作系统变得非常笨重。此外,在每台物理机器上实际上可以安装的内容也存在一定限制。
另一方面,Docker容器有所不同。我们有服务器和宿主操作系统。但是,不再需要超级监视器,而是使用Docker引擎。在这种情况下,我们没有带来整个客户操作系统,只带了一个非常薄的操作系统层,并且容器可以通过与宿主操作系统通信以获取内核功能。这使得容器非常轻量级。
容器中只包含应用程序代码以及其所需的任何二进制文件和库。如果需要,这些二进制文件和库可以在不同的容器之间共享。通过这种方式,我们能够实现许多功能。它们有更快的启动时间。你不能像那样在几秒钟内启动单个虚拟机。同样,关闭也很快。因此,我们可以快速地扩展和缩小规模,稍后我们将看到这一点。
每个容器都认为自己正在运行自己的操作系统副本。它有自己的文件系统、注册表等,这是一种谎言。它实际上是被虚拟化了。
来源:《Kubernetes实战》。
我在生产环境和测试环境中广泛使用了Docker。当您熟悉它后,您会发现它非常强大,可以构建多个容器和隔离的环境。
Docker是基于LXC(Linux容器)开发的,并且在许多Linux发行版中表现完美,特别是Ubuntu。
Docker容器是隔离的环境。当您在从Docker镜像创建的Docker容器中发出 top 命令时,您可以看到它。
此外,由于dockerFile配置,它们非常轻巧和灵活。
例如,您可以创建一个Docker镜像并配置DockerFile,告诉它例如运行时wget 'this',apt-get 'that',run 'some shell script',设置环境变量等。
在微服务项目和架构中,Docker是非常有价值的资产。您可以通过Docker、Docker swarm、Kubernetes和Docker Compose实现可扩展性、弹性和弹性。
关于Docker的另一个重要问题是Docker Hub及其社区。
例如,我使用Prometheus、Grafana、Prometheus-JMX-Exporter和Docker实现了监控kafka的生态系统。
为了做到这一点,我下载了配置好的zookeeper、kafka、Prometheus、Grafana和jmx-collector的Docker容器,然后使用YAML文件挂载了自己的一些配置,或者对其他文件和配置进行了更改,并且构建了一个完整的kafka监控系统,使用多个容器的Dockers在单台机器上实现了隔离、可扩展性和弹性,这种架构可以轻松地移动到多台服务器。
除了Docker Hub网站外,还有另一个名为quay.io的站点,您可以在那里拥有自己的Docker镜像仪表板并从中拉取/推送。您甚至可以将Docker镜像从Docker Hub导入到quay,然后在自己的机器上从quay运行它们。
注意:学习Docker初看起来很复杂和困难,但当您熟悉它后,就无法离开它。
我记得第一次使用Docker时,发出错误命令或错误删除容器及其所有数据和配置的那些日子。
正如您在下面的图片中所看到的那样,每个容器都有一个单独的包,并在单台机器上运行,共享该机器的操作系统...它们是安全且易于传输的...
功能 |
虚拟机器 |
(Docker)容器 |
---|---|---|
操作系统(OS) | 每个虚拟机 都包含 一个操作系统。 | 每个 Docker 容器不包含操作系统。 |
硬件(H/W) | 每个虚拟机都包含操作系统所需的硬件的虚拟副本。 | 容器没有硬件虚拟化,轻量级且快速。 |
重量 | 虚拟机很重—原因如上所述— | 容器则是轻量级的,因此运行速度更快。 |
所需软件 | 虚拟化使用称为 hypervisor 的软件实现。 | 容器使用称为 Docker 的软件实现容器化。 |
核心 | 虚拟机提供虚拟硬件(或可安装操作系统和其他程序的硬件)。 | Docker 容器不使用硬件虚拟化。**这有助于使用容器。 |
抽象化 | 虚拟机提供硬件抽象化,因此您可以运行多个操作系统。 | 容器提供操作系统抽象化,因此您可以运行多个容器。 |
启动时间 | 创建虚拟机需要很长时间(通常数分钟),并且占用显著的资源开销,因为它们在要使用的软件之外还运行整个操作系统。 | 启动时间较短,因为在Docker容器中运行的程序直接与主机的Linux内核交互。 |