Docker-基于操作系统层级的虚拟化技术
来源:cloud.tencent.com 编辑:xjh 2025-04-28
一、定义
Docker是一个开源的平台 ,用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环境中运行。容器彼此隔离,但可以通过特定的通道相互传递信息。
Docker提供了一个轻量级的虚拟化解决方案。由于运行在同一计算机上的所有容器共享同一个操作系统内核,避免了启动与维护虚拟机的开销。因此相比于传统的虚拟机,Docker容器更加轻便、快速、容易部署。使用Docker,开发者可以避免在两台计算机上运行效果不一致的问题,容器提供了一致的行为,进而使得应用程序在不同环境的计算机上有相同的运行效果。
Docker设想是交付运行环境如同海运,OS如同一个货轮,每一个在OS基础上的软件都如同一个集装箱。用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同乐高积木,用户只需要选择合适的积木组合,并且在最顶端署上自己的名字(最后一个标准化组件是用户的app)。这也就是基于Docker的PaaS产品的原型。
二、基本原理
Docker核心解决的问题是利用其自研的libcontainer来实现类似虚拟机(VM)的功能,从而利用尽可能少的硬件资源给用户提供尽可能好的服务。与VM不同, libcontainer并不是一套硬件虚拟化方法,而是操作系统级的虚拟化。这理解起来可能并不像VM那样直观,所以可以从Docker要解决的问题出发,看看它是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的问题主要是以下4个:
隔离性:每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法的方案是VM;libcontainer的方案是容器,具体而言是namespace。其中的pid, net, ipc, mnt, uts 等将容器的进程, 网络, 消息, 文件系统和主机隔离开。
可配额/可度量:每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU和内存,可以方便实现;libcontainer则主要是利用cgroups来控制资源。cgroups 实现了对资源的配额和度量,提供了类似文件的接口。在 /cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,即可实现对该进程的资源控制。
移动性:用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法通过snapshot和image来实现;Docker主要通过AUFS实现。AUFS (AnotherUnionFS) 是一种联合文件系统, 就是支持将不同目录挂载到同一个虚拟文件系统下的文件系统。它具有节省存储空间、快速部署、节省内存、升级方便、允许在不更改base-image的同时修改其目录中的文件的特点。
安全性:这个讨论范围较大,这里强调是host主机的角度尽量保护容器。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机中运行的;然而对于libcontainer, 其中运行的进程应当是事先静态编译完成的。用户提供的参数也是通过exec系统调用提供给用户进程。通常情况下容器中也没有长进程存在。
Windows中的实现原理
Docker 在 Windows 系统中实现的核心原理依赖于 Windows 提供的容器化技术和虚拟化机制。Docker 在 Windows 上通过两种模式运行容器:Windows 容器模式和 Linux 容器模式。在 Windows 容器模式下,Docker 利用 Windows Server Containers 或 Hyper-V Containers 技术,直接运行 Windows 容器,这些容器与主机共享内核,实现轻量级虚拟化和隔离。在 Linux 容器模式下,Docker 通过使用 Hyper-V 提供的虚拟机来运行一个轻量级的 Linux 内核(如 Moby VM),从而使 Windows 用户可以运行 Linux 容器。这种虚拟化层次确保了容器的隔离性和兼容性,并通过 Docker Desktop 提供统一的管理界面和开发体验。Docker Desktop 还通过 WSL 2(Windows Subsystem for Linux 2)进一步增强了在 Windows 上运行 Linux 容器的性能和兼容性,使得开发者能够在 Windows 环境中无缝开发和部署跨平台的容器化应用。
Linux中的实现原理
Docker 在 Linux 系统中实现的核心原理基于 Linux 内核提供的两项关键技术:命名空间(Namespaces)和控制组(Cgroups)。命名空间确保了容器之间以及容器与主机之间的隔离性,通过隔离进程 ID、文件系统、网络、用户和其他资源,使每个容器仿佛在独立的操作系统上运行。控制组则用于限制和管理容器的资源使用,如 CPU、内存、网络带宽等,确保不同容器之间的资源分配合理且互不干扰。Docker 通过联合文件系统(如 OverlayFS)实现镜像的分层存储,使得容器的创建和启动更加高效,并且减少了存储空间的占用。Docker 引擎(Docker Daemon)负责管理和协调这些容器,通过标准化的 API 进行容器的创建、运行、停止和删除。整体而言,Docker 在 Linux 系统中的实现充分利用了 Linux 内核的特性,实现了轻量、高效、隔离性强的容器化环境,使得应用的开发、部署和管理更加灵活和高效。
三、Docker平台组成
Docker平台由以下部分组成:
Docker守护进程(Docker daemon):Docker采用 C/S架构。Docker daemon 作为服务端接受来自客户端的请求 ,并进行处理(创建、运行、分发容器)。
Docker客户端(Docker client):Docker 客户端则用于与 Docker 守护进程通信,发送命令以管理容器。Docker采用 C/S架构。客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker daemon:一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon交互。
Docker镜像(Docker images):Docker 镜像是用于构建 Docker 容器的静态文件,它包含了应用程序运行所需的所有文件、依赖项和配置信息。Docker 镜像可以从 Docker Hub 或其他镜像仓库中获取,也可以通过 Dockerfile 自定义构建。
Docker容器(Docker container):Docker 容器是 Docker 镜像的运行实例,它包含了应用程序及其依赖项,并在隔离的环境中运行。每个容器都是一个独立的进程,拥有自己的文件系统、网络空间和进程空间。
Docker容器通过Docker镜像来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
四、技术优势
轻量级与高效性:与传统的虚拟机相比,Docker 容器更加轻量级,因为它们共享操作系统内核,而不是为每个实例创建一个完整的操作系统。这不仅减少了资源开销,还提升了启动速度,使得容器可以在几秒钟内启动并运行。
一致性与可移植性:Docker 提供了从开发到生产的一致环境。通过将应用程序及其依赖项打包到容器中,Docker 保证了在任何环境下运行的应用程序具有相同的行为,这极大地减少了环境差异导致的“在我机器上可以运行”的问题。
快速部署与扩展:Docker 容器化的应用程序可以在几秒钟内启动,从而显著加快了部署过程。由于容器的轻量特性,用户可以在同一台物理服务器上运行更多的容器实例,快速扩展应用程序的规模以应对需求变化。
微服务架构支持:Docker 非常适合微服务架构,因为它允许将应用程序的不同组件封装在独立的容器中。这种隔离不仅提高了应用程序的模块化程度,还简化了开发、测试和部署过程。
资源利用与隔离:Docker 容器在同一主机上共享操作系统内核,同时通过 cgroups 和命名空间等技术实现了资源的严格隔离。这样,Docker 容器可以高效利用系统资源,并确保不同容器之间的安全隔离。
广泛的生态系统与工具支持:Docker 拥有丰富的生态系统,包括 Docker Hub、Docker Compose、Docker Swarm 等工具,支持从开发到生产的各个环节。用户可以方便地从 Docker Hub 获取公共镜像,利用 Docker Compose 管理多容器应用,或使用 Docker Swarm 进行容器编排。
DevOps 和 CI/CD 友好:Docker 与持续集成和持续交付(CI/CD)流程高度契合。通过将应用程序打包成 Docker 镜像,开发者可以在任何阶段快速部署、测试和发布应用,从而加快开发周期并提高交付效率。
五、应用场景
Docker的应用场景非常广泛。在软件开发过程中,Docker允许开发人员将应用程序、其依赖项和运行时环境打包到一个称为容器的独立单元中。这样的容器具有一致的运行环境,可以在开发、测试和生产环境中轻松地部署和交付,并且无需担心环境差异。
另外,在微服务架构中,开发者可以使用Docker将各个服务打包为独立的容器,从而实现服务的解耦和独立部署,以及不同服务之间资源的隔离。提高了系统的灵活性、可伸缩性和可维护性。
Docker容器可以与持续集成和持续部署工具(如Jenkins、Travis CI等)集成,实现自动化构建、测试和部署流程,从而加速软件交付周期。
开发团队可以使用Docker容器来创建标准化的开发环境,对齐团队中每个开发者的环境,避免了“仅在我这里可以工作”的问题。
总的来说,Docker的应用场景涵盖了软件开发的各个阶段,从开发到部署再到运维,都能够提供便利和效率。在不远的将来,Docker还会为AI开发赋能。随着生成式AI与大语言模型的广泛应用,曾经完全属于AI领域开发者的任务如今也需要由其他相关领域的开发者完成。这一变化涵盖了金融、安全、医疗等领域。Docker为开发者提供了构建、测试、运行和部署NVIDIA AI Enterprise软件平台的理想方式——一个端到端的云原生软件平台,为每个企业提供生成式AI 。该平台可用于Docker容器,并可作为微服务部署。这使团队能够专注于开发前沿人工智能应用程序,并保证程序性能。
参考:
一文说清 Docker 是什么
https://blog.csdn.net/m0_51913750/article/details/131605981
什么是 Docker?2分钟看完绝对理解!
https://cloud.tencent.com/developer/article/2239302
Docker:应用容器引擎 Docker简介,Docker安装与启动
https://cloud.tencent.com/developer/article/1795434
一文说清 Docker 是什么
https://blog.csdn.net/m0_51913750/article/details/131605981
什么是 Docker?2分钟看完绝对理解!
https://cloud.tencent.com/developer/article/2239302
Docker:应用容器引擎 Docker简介,Docker安装与启动
https://cloud.tencent.com/developer/article/1795434