在云计算与微服务架构快速发展的今天,容器化部署已成为运维工程师的必备技能。本文延续KVM虚拟化基础实践,深入探讨KVM存储管理、快照克隆、资源优化,并系统讲解Docker核心原理与安装部署。通过本文,你将掌握从传统虚拟化到容器编排的完整知识链路,为后续学习K8s(Kubernetes)打下坚实基础。
KVM存储管理:从默认池到自定义池
KVM的存储管理是虚拟机运维的基础。默认情况下,libvirt会创建一个名为default的存储池,路径通常为/var/lib/libvirt/images。通过以下命令可以查看和管理存储池:
- 查看所有存储池:
virsh pool-list --all - 启动并设置自动启动:
virsh pool-start default+virsh pool-autostart default - 创建自定义本地存储池:先创建目录
mkdir -p /kvmdata,再执行virsh pool-define-as mypool dir - - - - "/kvmdata" - 启动并验证:
virsh pool-start mypool→virsh pool-autostart mypool→virsh pool-list --all→virsh pool-info mypool - 停止与重启:
virsh pool-destroy mypool后再virsh pool-start mypool
最佳实践:建议将存储池挂载在独立的数据盘或NAS上,避免与系统盘争抢I/O资源。
虚拟机磁盘扩容与分区实战
当虚拟机磁盘空间不足时,无需重建虚拟机,可直接通过qemu-img工具在线扩容。以下是对KVM-Test1虚拟机扩展5GB磁盘的完整流程:
- 扩展磁盘镜像:
qemu-img resize /var/lib/libvirt/images/KVM-Test1.qcow2 +5G - 让系统识别新空间:登录虚拟机,执行
tee /sys/block/vda/device/rescan扫描新磁盘 - 创建新分区:
fdisk /dev/vda,依次输入n(新建分区)、p(主分区)、默认分区号、w(保存) - 格式化并挂载:
mkfs.ext4 /dev/vda3→mkdir /data→mount /dev/vda3 /data - 设置开机自动挂载:
echo '/dev/vda3 /data ext4 defaults 0 0' >> /etc/fstab


⚠️ 注意:如果虚拟机使用LVM逻辑卷,建议在分区后通过pvcreate和lvextend扩展逻辑卷,而非直接格式化新分区。KVM快照与克隆:快速复制与恢复
KVM的快照和克隆功能是日常运维中高频使用的特性。快照用于保存虚拟机的某一时刻状态,便于故障回滚;克隆则用于快速批量部署相同配置的虚拟机。
- 创建快照:在virt-manager图形界面中,右键虚拟机 → 快照 → 创建;命令行使用
virsh snapshot-create-as KVM-Test1 snapshot1 - 恢复快照:
virsh snapshot-revert KVM-Test1 snapshot1 - 克隆虚拟机:图形化操作在virt-manager中完成;若磁盘空间不足导致图形化失败,可使用命令行:
virt-clone --original KVM-Test1 --name KVM-Clone1 --auto-clone





克隆完成后,启动KVM-Clone1并检查网络配置。由于克隆机与源虚拟机在同一网段(桥接模式),通常能自动获取合法IP。执行ping -c 2 192.168.11.145和ping -c 2 8.8.8.8验证连通性。若不通,检查网卡配置和网关设置。

⚡ KVM资源优化:内存气球与CPU热插拔
KVM支持动态调整虚拟机的CPU和内存,无需重启。以KVM-Test2为例,演示命令行配置内存气球技术和CPU热插拔:
- 编辑虚拟机配置:
virsh edit KVM-Test2 - 修改内存气球:在
标签中,添加启用监控 - 配置CPU热插拔:将
改为2 ,并添加4 - 启动并验证:
virsh start KVM-Test2→virsh dominfo KVM-Test2



优化效果:内存气球技术允许宿主机回收空闲内存,提高整体资源利用率;CPU热插拔使虚拟机可动态调整计算能力,非常适合容器化部署场景下的弹性伸缩需求。Docker核心概念:镜像、容器、仓库
Docker作为容器编排的基石,其核心组件包括镜像(Image)、容器(Container)和仓库(Repository)。理解这三者的关系是掌握Docker的关键。
- 镜像(Image):静态的只读模板,包含应用代码、运行时环境、系统工具、库文件等。采用分层存储结构(UnionFS),多个镜像可共享基础层,大幅节省空间。关键特性:只读性、内容寻址、写时复制(Copy-on-Write)。
- 容器(Container):镜像的运行实例,本质是被隔离的进程。利用Linux Namespace实现隔离,Cgroups限制资源。容器层可读写,但默认临时性(停止后修改丢失)。
- 仓库(Repository):集中存放和分发镜像的地方,如Docker Hub、阿里云容器镜像服务(ACR)。核心操作:
docker pull、docker push、docker build。
三者协作流程:Dockerfile → docker build → docker push → docker pull → docker run,实现“一次构建,到处运行”。
Docker相比传统虚拟机的核心优势:
- ✅ 轻量化:共享宿主机内核,镜像仅几十MB(虚拟机GB级别)
- ✅ 毫秒级启动:无需引导完整OS,秒级甚至毫秒级启动
- ✅ 环境一致性:根治“在我机器上能跑”问题
- ✅ 高效资源利用:相同硬件可运行数倍于虚拟机的容器实例
| 对比维度 | Docker容器 | 传统虚拟机 |
|---|---|---|
| 虚拟化层级 | 操作系统级虚拟化(进程级隔离) | 硬件级虚拟化(通过Hypervisor模拟完整硬件) |
| 内核 | 所有容器共享宿主机内核 | 每个VM拥有独立的操作系统内核 |
| 启动时间 | 毫秒级 | 分钟级(30秒-数分钟) |
| 镜像/磁盘大小 | MB级别(几十~数百MB) | GB级别(数GB~数十GB) |
| 资源占用 | 极少,无Guest OS开销 | 较大,每个VM需运行完整OS |
| 性能 | 接近原生物理机 | 有一定Hypervisor层损耗 |
| 隔离性 | 中等(Namespace + Cgroups),容器共享内核 | 强(完全硬件隔离),不同VM互不影响 |
| 可移植性 | 高(镜像跨平台标准) | 较低(依赖特定Hypervisor和硬件) |
| 管理复杂度 | 低(轻量,可快速创建/销毁/扩展) | 高(需管理完整OS生命周期) |
| 典型场景 | 微服务、CI/CD、开发测试环境 | 多租户强隔离、遗留应用、不同OS共存 |
实际场景:Docker和虚拟机并非对立,常结合使用——物理机运行虚拟机提供强隔离,虚拟机内运行Docker容器实现高密度部署。
[AFFILIATE_SLOT_1]Docker安装与镜像加速器配置
在CentOS/RHEL 8+系统中,安装Docker需先移除系统自带的旧版本,再安装官方仓库的最新版:
- 卸载旧版:
dnf remove -y docker* docker-client* docker-common* - 安装依赖:
dnf install -y yum-utils device-mapper-persistent-data lvm2 - 添加Docker CE仓库:
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo - 安装Docker CE:
dnf install -y docker-ce docker-ce-cli containerd.io



安装完成后,配置阿里云镜像加速器提升国内镜像拉取速度:
- 登录阿里云控制台 → 容器镜像服务 → 镜像加速器 → 复制加速器地址
- 创建配置文件:
mkdir -p /etc/docker→cat > /etc/docker/daemon.json < 重启Docker并验证:systemctl restart docker→docker info | grep -A 2 "registry Mirrors"


[AFFILIATE_SLOT_2]
总结
本文从KVM存储管理出发,覆盖了磁盘扩容、快照克隆、资源优化等实战技巧,并系统讲解了Docker的核心概念、优势及安装配置。掌握这些技能,你已具备从传统虚拟化向容器化部署转型的基础能力。下一步,建议深入学习Docker Compose实现多容器编排,进而探索Kubernetes(K8s)实现生产级容器编排管理。容器化之路,从今天开始!
浙公网安备 33010602011771号