【docker】docker技术介绍

发布时间:2026/6/10 12:36:21

【docker】docker技术介绍 大家好最近在学习 Docker 时我被一个问题困扰Docker 里的容器到底是不是一个极简的虚拟机它里面的 Linux 内核又是哪来的Docker 容器本质上是一组被隔离的 Linux 进程进程树它共享宿主机的 Linux 内核并不是一台独立的虚拟机。一、背景环境配置的难题软件开发中环境配置是最令人头疼的问题之一。要让软件顺利运行需要操作系统的正确配置以及所需库与组件的完整安装。以 Python 应用为例目标机器需要匹配版本的解释器、完整的依赖包乃至手动配置的环境变量——任何一环缺失都可能导致失败。开发者那句口头禅在我机器上是好的It works on my machine道尽了这种困境。每换一台机器就要重走一遍配置流程耗时耗力。于是人们开始思考能否让软件直接携带自己的运行环境安装时将原始环境原封不动地复制过来二、虚拟机虚拟机Virtual Machine是“在一台电脑上运行另一台完整电脑”这一思路的实现。它通过 Hypervisor如 KVM、VMware、Hyper-V在一套操作系统宿主机内再运行一套完整的操作系统客户机。应用程序运行在虚拟机的操作系统里对此几乎毫无感知就像运行在一台真正的物理电脑上一样。但虚拟机有三个明显缺陷资源占用高即便应用只用 1MB 内存虚拟机本身就需要数百 MB冗余开销大系统级操作如用户登录无法省略启动慢相当于每次都要重启一套完整的操作系统。三、容器与虚拟机的区别为了解决虚拟机的这些痛点Linux 容器技术诞生了。它和虚拟机的思路完全不同。核心区别可以用下面这张表快速看懂3.1 容器与虚拟机的区别项目Docker 容器传统虚拟机VM本质一组被隔离的进程一台完整的虚拟电脑有没有独立内核没有共享宿主机内核有自己独立的操作系统和内核占用资源极低MB 级别较高GB 级别启动速度几秒钟十几秒到几分钟隔离程度中等内核级隔离很强硬件级虚拟化3.2 Linux 内核到底是怎么回事在原生 Linux 系统上 容器直接使用你电脑当前的 Linux 内核用 uname -a 可以看到。 Docker 通过 Linux 内核的两个重要技术实现隔离Namespaces命名空间让容器“看不见”外面其他进程、文件、网络。Cgroups限制容器能使用的 CPU、内存等资源。所以容器启动超快因为它不用再加载一套内核。在 Windows 系统上最容易搞混的地方 Windows 自己没有 Linux 内核所以 Docker Desktop 会自动启用WSL 2Windows Subsystem for Linux 2。 WSL 2 会在后台启动一个轻量级的 Linux 虚拟机里面运行的是 Microsoft 官方维护的 Linux 内核。 你创建的所有 Docker 容器其实都跑在这个 WSL 2 的 Linux VM 里面共享这个 VM 的内核。层级关系是这样的Windows 电脑 └── WSL 2 轻量 Linux 虚拟机含真实 Linux 内核 └── 你的各个 Docker 容器被隔离的进程❌ “容器里有一个极简内核” —— 错内核永远是宿主机或 WSL2的。❌ “容器就是轻量虚拟机” —— 不够准确容器比虚拟机轻量得多原理也完全不同。✅ 正确理解容器 共享内核 被隔离的用户空间 一组进程。四、Linux 容器技术的核心概念Linux 容器并不是一个新发明的技术而是在 Linux 内核中早已存在的两个强大功能的组合Namespaces命名空间—— 实现“隔离视野”PID namespace容器内看到的进程 ID 从 1 开始和宿主机进程完全隔离。Mount namespace容器有自己独立的根文件系统rootfs。Network namespace独立的网络栈、IP、端口等。UTS、IPC、User 等其他命名空间...CgroupsControl Groups—— 实现“资源限制”控制容器能使用的 CPU、内存、磁盘 IO、网络带宽等。防止某个容器把整个服务器资源耗尽。Docker 等工具如 containerd、runc只是把这些内核特性封装成易用的命令和镜像格式让开发者可以轻松创建和管理容器。

相关新闻