跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Shell / Bash

Docker 基础:虚拟化原理与容器化实战

Docker 基础教程涵盖虚拟化与容器化核心概念,解析 Namespace 进程隔离与 Cgroups 资源控制机制。内容包含 LXC 技术演进、Docker 架构原理及与虚拟机的对比,通过 unshare、stress 等命令实操演示内存与 CPU 限制方法,帮助开发者理解容器底层逻辑,掌握资源管理与环境标准化部署的关键技能。

暖阳发布于 2025/10/26更新于 2026/10/2585 浏览
Docker 基础:虚拟化原理与容器化实战

Docker 基础:从虚拟化到容器化

理解虚拟化和容器化

在深入 Docker 之前,我们需要厘清几个核心概念。物理机指的是实际的服务器或计算机,相对于虚拟机而言,它是实体硬件的称呼。

虚拟化是指通过技术将一台计算机虚拟为多台逻辑计算机。在一台物理机上同时运行多个逻辑环境,每个环境可运行不同的操作系统,且应用相互独立,互不影响,从而显著提高资源效率。

容器化则是操作系统层级的虚拟化技术。它将操作系统内核虚拟化,允许用户空间软件实例被分割成几个独立的单元在内核中运行。这些实例被称为容器(Containers)。对使用者来说,容器就像专用的服务器。Docker 是目前容器技术的事实标准。

形象类比

  • 物理机:像一座庄园,独立占用土地,花园、设施全归自己,无法共享。
  • 虚拟机:像开发商的一个楼盘。一栋楼一套房,大家共享宅基地、小区花园和游乐设施,但每户人家相对独立。
  • 容器:像在一个房子里开辟出的胶囊公寓。共享卫生间、厨房、WiFi,只有私人物品是自己的。体积更小,启动更快。

为什么要用虚拟化和容器化?

随着技术发展,资源隔离带来了显著收益:

  1. 资源利用率高:整合低利用率服务器,用更少硬件跑更多业务。比如复用土地,成本不变但使用人数增加。
  2. 环境标准化:一次构建,随处执行。解决开发、测试、生产环境不一致导致的 Bug,确保「在我机器上没问题」的场景不再发生。
  3. 弹性伸缩:根据业务动态调整资源。例如双 11 扩容 100 个服务,活动结束后回收。
  4. 差异化环境提供:无需购买多物理机即可同时提供 Ubuntu 和 CentOS 等不同环境。
  5. 沙箱安全:避免不安全软件影响系统稳定性。容器内执行破坏性操作(如 rm -rf /*)不会搞死宿主机。
  6. 轻量快速:传统虚拟机启动需数分钟,Docker 容器直接运行于宿主内核,秒级甚至毫秒级启动。
  7. 维护扩展容易:分层存储和镜像技术便于复用和维护。基于官方镜像定制成本低。

虚拟化实现方式

应用程序执行环境分层

从下往上依次为:

  • 硬件层:指令集架构、设备及访问接口。
  • 操作系统层:系统调用接口,管理硬件资源。
  • 程序库层:数据结构定义及函数调用接口。

常见类别

  1. 虚拟机:存在于硬件层和操作系统层间。通过伪造硬件抽象接口,将整个操作系统嫁接到硬件上。功能接近物理机。
  2. 容器:存在于操作系统层和函数库层之间。通过伪造操作系统接口,将应用层置于操作系统上。Docker 基于 Linux 的 Namespace 和 Cgroup 实现。相比虚拟机封装整个 OS,容器封装单个应用,体积小、资源占用少。
  3. JVM 等虚拟机:存在于函数库层和应用程序之间。Java 虚拟机建立抽象层,适应不同操作系统函数库,提供统一运行环境。

主机虚拟化实现

  • Type1 Hypervisor:直接运行在硬件之上,无宿主机 OS。典型如 Xen、Vmware ESX。
  • Type2 Hypervisor:运行在宿主机 OS 之上。Hypervisor 作为应用程序存在,客户机是宿主机上的进程。典型如 Vmware Workstation。

容器虚拟化核心机制

容器虚拟化是操作系统层的虚拟化,核心依靠 Namespace 进行隔离,Cgroups 进行资源控制。

Namespace(命名空间)

Linux 内核用来隔离资源的方式。处于不同 Namespace 的进程拥有独立的全局系统资源,改变一个 Namespace 内的资源只影响当前进程组。

常见的 Namespace 类型包括:

  • UTS:主机名和域名。
  • IPC:信号量、消息队列、共享内存。
  • PID:进程编号。
  • Network:网络设备、IP 地址、路由表。
  • Mount:文件系统挂载点。
  • User:用户和用户组。
实战:NameSpace 空间隔离

我们使用 unshare 命令来创建新的命名空间。

1. PID 隔离实战

在主机上查看进程列表,PID 1 通常是 init 进程。

ps -ef

打开新 shell,创建 bash 进程并新建 PID Namespace。注意 --mount-proc 选项,因为 /proc 目录包含进程信息,不挂载会导致依赖该文件系统的命令失效。

unshare --fork --pid --mount-proc /bin/bash

执行 ps -ef 后,你会发现进程空间变了,看不到主机上的其他进程,说明隔离生效。退出后恢复原状。

2. Mount 隔离实战

窗口 A 查看默认磁盘挂载情况:

df -h

窗口 B 创建 Mount 隔离并挂载新磁盘:

# 创建隔离空间
unshare --mount --fork /bin/bash
mkdir -p /data/tmpmount

# 准备镜像文件
dd if=/dev/zero of=fdimage.img bs=8k count=10240
mkfs -t ext4 ./fdimage.img
mount ./fdimage.img /data/tmpmount

# 写入文件
echo "Hello world!" > /data/tmpmount/hello.txt

在窗口 B 查看挂载信息,会发现多了新磁盘。回到窗口 A 查看,则看不到这个挂载点和文件,实现了文件系统隔离。

Cgroups(控制组)

Cgroups 是 Linux 内核提供的机制,用于限制、记录任务组使用的物理资源。本质上是内核附加在程序上的钩子,通过调度触发资源追踪和限制。

主要用途:

  • Resource limitation:限制内存上限、CPU 使用限制。
  • Prioritization:优先级控制。
  • Accounting:审计或统计。
  • Control:挂起或恢复进程。

支持的子系统: 包括 blkio(IO 限制)、cpu(时间片分配)、memory(内存限制)、devices(设备访问限制)等。

实战:Cgroups 资源控制

1. 查看 cgroups 信息

检查版本和挂载情况:

cat /proc/filesystems | grep cgroup
mount | grep cgroup

查看特定进程的 cgroup 限制:

cat /proc/$$/cgroup

2. 内存控制

进入 memory 目录创建控制组,设置最大使用 20M 内存。

mkdir test_memory
echo 20971520 > test_memory/memory.limit_in_bytes

启动一个消耗 50M 内存的 stress 进程,将其 PID 加入 tasks 文件:

stress -m 1 --vm-bytes 50M
# 找到 stress 进程 PID,例如 62518
echo 62518 >> test_memory/tasks

进程会因超出限制而退出(OOM Killer 介入)。

3. CPU 控制

创建 cpu 控制组,设置 CPU 使用率为 30%。

mkdir test_cpu
echo 30000 > test_cpu/cpu.cfs_quota_us
# 将进程加入控制组
echo <PID> >> test_cpu/tasks

监控显示 CPU 使用率会被限制在设定范围内。Docker 底层正是调用这些 API 来实现资源管理的。

LXC 与 Docker 演进

LXC(LinuX Containers)

LXC 是最早一批简化容器技术的方案,将应用打包成容器,内含代码、OS 核心和库。它通过名字空间和共享 API 分配资源。

虽然简化了使用,但相比直接内核调用,LXC 仍需学习一组命令,批量迁移不易,隔离性也不如虚拟机强大。Docker 在某种程度上是 LXC 的增强版。

Docker 是什么

Docker 本质是容器的易用工具,本身不是容器技术,而是让容器技术普及开来的实现。早期基于 LXC,后来发展为 libcontainer,再后来采用工业标准的 runC。

目标:Build, Ship and Run Any APP, Anywhere。即一次封装,到处运行。

Docker 引擎迭代

  • LXC:早期版本直接使用。
  • libcontainer:Docker 自研模块,替代 LXC。
  • runC:CNCF 介入后的工业化标准引擎,目前新版 Docker 使用此引擎。

Docker 与虚拟机区别

特性传统虚拟机Docker 容器
磁盘占用GB 级别MB 级别
资源占用高(虚拟 OS)低(直接硬件)
启动速度分钟级秒级
隔离性系统级进程级
封装程度整个操作系统项目代码和依赖

Docker 架构

采用 C/S 架构:

  • Registry:仓库,保存镜像。
  • Daemon:守护进程,核心后台服务。
  • Client:客户端,通过 API 与 Daemon 通信。
  • Host:物理或虚拟机器。
  • Image:模板,用于创建容器。
  • Container:独立运行的应用实例。

生活案例:一家人旅游住酒店。

  • Client:游客(我们)。
  • Daemon:前台(提供服务)。
  • Host:酒店大楼(物理服务器)。
  • Registry:房间类型(标间、大床房)。
  • Image:标准豪华大床房配置。
  • Container:具体入住的房间(9527),携带个人物品,与其他客人隔离。

Docker 生态与新时代诉求

为什么需要 Docker?

面对数据量增长、处理能力需求爆发、软件发布频繁、环境搭建复杂等挑战,Docker 提供了标准化解决方案:

  1. 海量数据处理:通过镜像仓库分发组件。
  2. 频繁变更上线:版本管理和回滚便捷。
  3. 环境一致性:镜像内置运行环境,一条命令完成搭建,避免依赖冲突。
  4. 共享与部署:中心仓库下载,快速部署到任意服务器。

Docker 通过镜像技术解决了环境一致性和快速交付的问题,成为云时代的基础设施标准。

目录

  1. Docker 基础:从虚拟化到容器化
  2. 理解虚拟化和容器化
  3. 形象类比
  4. 为什么要用虚拟化和容器化?
  5. 虚拟化实现方式
  6. 应用程序执行环境分层
  7. 常见类别
  8. 主机虚拟化实现
  9. 容器虚拟化核心机制
  10. Namespace(命名空间)
  11. 实战:NameSpace 空间隔离
  12. 创建隔离空间
  13. 准备镜像文件
  14. 写入文件
  15. Cgroups(控制组)
  16. 实战:Cgroups 资源控制
  17. 找到 stress 进程 PID,例如 62518
  18. 将进程加入控制组
  19. LXC 与 Docker 演进
  20. LXC(LinuX Containers)
  21. Docker 是什么
  22. Docker 引擎迭代
  23. Docker 与虚拟机区别
  24. Docker 架构
  25. Docker 生态与新时代诉求
  26. 为什么需要 Docker?

更多推荐文章

查看全部
  • IntelliJ IDEA 打包 Web 项目 WAR 包及 Tomcat 部署指南
  • Spring Boot 4.0 虚拟线程时代:WebFlux 与 WebMVC 选型分析
  • 前缀和技巧实战:和为 K 的子数组与和可被 K 整除的子数组
  • C++ 算法入门:一维动态规划基础实战
  • 新版 llama.cpp 使用指南与本地部署 LLAMA 模型
  • 华为 OD 技术面试:C++ 核心考点与特性解析
  • 分布式训练框架的编程基础与 PyTorch RPC 实践
  • VS Code Copilot 实战指南:从安装到高级配置
  • OpenClaw AI 智能体安装配置与使用指南
  • LLM 微调实战:使用 Code-Llama 训练自定义代码数据集
  • 7 篇必读的大模型前沿论文精选
  • MATLAB 实现基于多目标粒子群算法(MOPSO)的无人机三维路径规划
  • OpenClaw 安全 AI 助理从零搭建实战指南
  • OpenClaw 集成 QVeris 实现 AI 助手实时数据查询
  • Java 并发工具类:CyclicBarrier 使用详解
  • 编程学习如何保持兴趣与动力:方法与路线指南
  • Python keyboard 库:从安装到实战应用
  • IntelliJ IDEA 中配置使用 Claude Code 方法
  • 基于 MS-Swift 框架的 DeepSeek-R1 部署与微调指南
  • Python 调用 Deepseek API 失败原因及排查指南

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online