在 CentOS 虚拟机中应用容器化的主流做法
- 在虚拟机里直接运行容器:安装 Docker,以容器承载应用,适合微服务、CI/CD、开发/测试环境。
- 在虚拟机里运行容器化的虚拟机:在容器内启用 KVM,再创建 VM,适合需要完整 OS、嵌套虚拟化或遗留系统的场景。
- 直接用虚拟机替代容器:使用 KVM/QEMU 创建多台 CentOS VM 搭建 Kubernetes 集群,适合有状态、隔离要求高、规模化编排的场景。
方案一 在 CentOS 虚拟机中运行 Docker 容器
- 安装与启动
- 安装依赖与仓库:sudo yum install -y yum-utils device-mapper-persistent-data lvm2
- 添加 Docker CE 仓库:sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
- 安装引擎:sudo yum install -y docker-ce docker-ce-cli containerd.io
- 启动与自启:sudo systemctl start docker && sudo systemctl enable docker
- 验证:docker run --rm hello-world
- 基本用法
- 运行交互式 CentOS 7:docker run -it --name c7 centos:7 /bin/bash
- 数据持久化:docker run -it -v /host/data:/container/data centos:7 /bin/bash
- 端口映射运行 Nginx:docker run -d -p 80:80 nginx
- 适用场景
- 快速交付应用、环境一致性、弹性伸缩、开发/测试与 CI 流水线。
方案二 在容器内启用 KVM 再创建虚拟机
- 前提与检测
- 宿主机需开启虚拟化(BIOS 中启用 VT-x/AMD-V),并在虚拟机设置里开启 嵌套虚拟化(如 VMware/VirtualBox 的虚拟化引擎)。
- 在容器内检查:grep -E “vmx|svm” /proc/cpuinfo 应能看到 vmx/svm 标志。
- 在容器内安装并启动 KVM
- 安装组件:sudo yum install -y qemu-kvm libvirt libvirt-client virt-install virt-manager
- 启动服务:sudo systemctl start libvirtd && sudo systemctl enable libvirtd
- 验证网络:ip a 应看到 virbr0(默认 NAT 网络)。
- 创建虚拟机示例
- 创建磁盘:qemu-img create -f qcow2 /var/lib/libvirt/images/vm1.qcow2 20G
- 安装系统(示例):virt-install --virt-type kvm --name vm1 --ram 2048 --vcpus 2 \
–cdrom=/data/iso/CentOS-7-x86_64-Minimal.iso \
–disk path=/var/lib/libvirt/images/vm1.qcow2,format=qcow2 \
–network network=default --graphics vnc,listen=0.0.0.0 --noautoconsole
- 访问控制台:使用 VNC Viewer 连接宿主机的 5900 端口(需将容器端口映射到宿主机)。
- 容器运行要点
- 建议使用特权模式并启动 init:docker run -itd --name kvmbox --privileged -p 20022:22 -p 25900:5900 centos:7 /usr/sbin/init
- 在容器内使用 systemctl 需以 /usr/sbin/init 作为入口。
- 适用场景
- 需要在容器平台内提供完整 VM、运行遗留系统、或做虚拟化实验/教学的场景。
方案三 直接用虚拟机搭建 Kubernetes 集群
- 架构与准备
- 准备 3 台及以上 CentOS 7/8 虚拟机(静态 IP、主机名、/etc/hosts 解析)。
- 关闭防火墙或配置放行规则,安装常用工具(如 iproute、bridge-utils、vim、net-tools)。
- 部署步骤(示例要点)
- 安装容器运行时(如 Docker 或 containerd)。
- 安装 kubeadm/kubelet/kubectl,使用 kubeadm init 初始化 Master,kubeadm join 加入 Node。
- 部署 Flannel/Calico 等 CNI 网络插件,确保 Pod 互通。
- 适用场景
- 生产级容器编排、弹性伸缩、服务治理、有状态应用与复杂网络策略。
选型与网络配置建议
| 方案 |
启动与性能 |
隔离性 |
适用场景 |
资源开销 |
| Docker 容器 |
秒级启动、轻量 |
进程级隔离 |
微服务、CI/CD、开发/测试 |
低 |
| 容器里跑 KVM/VM |
分钟级(取决于 VM) |
VM 级隔离 |
遗留系统、完整 OS、嵌套虚拟化 |
中-高 |
| 多 VM 搭建 K8s |
分钟级(集群) |
强隔离 |
生产编排、有状态与复杂网络 |
中-高 |
- 网络要点
- Docker:常用 bridge/NAT 与端口映射(-p),也可自定义网络。
- KVM:默认 NAT(virbr0),也可配置 桥接 直连物理网段。
- K8s:需选择 Pod CIDR 与 CNI 插件(如 Flannel),确保跨节点 Pod 互通。
常见问题与排错要点
- 容器内无法使用 systemctl
- 以 /usr/sbin/init 启动容器,并开启 –privileged(仅在可信环境使用)。
- 拉取镜像或更新仓库失败(CentOS 8 常见)
- 将镜像源临时切换到 vault.centos.org 并更新缓存:
- sed -i ‘s/mirrorlist/#mirrorlist/g’ /etc/yum.repos.d/CentOS-*
- sed -i ‘s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g’ /etc/yum.repos.d/CentOS-*
- yum makecache && yum update -y
- 在容器内跑 KVM 无法创建 VM
- 确认宿主机已开启 嵌套虚拟化,并在虚拟化平台启用相应选项;容器内检查 /proc/cpuinfo 是否有 vmx/svm。
- K8s Pod 无法互通
- 检查 CNI 插件 是否部署成功、节点网络是否正常、Pod CIDR 是否冲突。