VMware搭CentOS 7.9+Docker容器环境:完整实操与踩坑记录
最近在准备一套内部环境需要在 VMware 里新创建一台 centOS 7.9.2009 虚拟机然后把 Docker 部署上去用来跑一些中间件容器。这个需求看上去一句话就能说完但真正完整走一遍之后就会发现从 VMware 创建虚拟机、系统安装、网络配置到 Docker 部署每一步都有不少值得记录的细节尤其是 yum 源、网卡激活和容器日志这几个地方坑特别多。这篇文章就把我完整实操的过程和踩过的坑记录下来给同样准备在 VMware 里搭一套 CentOS Docker 环境的朋友一个可直接照做的参考。1. 为什么选 VMware CentOS 7.9.2009 Docker 这套组合1.1 这套组合的实际使用场景先明确使用场景不然很容易在版本选择上纠结半天。我这次的需求是在 VMware Workstation 里创建一台虚拟机系统是 centOS 7.9.2009然后在这台虚拟机里安装 Docker后续用来跑 MySQL、Nginx、Redis 这些常见中间件模拟一套小型的服务端环境。适合参考的人群主要有三类第一类是刚开始接触 Linux 和容器技术的入门者需要一台可以随便折腾的虚拟机第二类是做项目交付需要在内网或隔离环境里复现一套服务端部署流程的人第三类是运维或后端工程师要在本地快速验证 Docker 的配置写法但不想把生产服务器拿来试错。VMware CentOS Docker 这套组合正好是本地环境里最接近真实服务器的一种方案。有人肯定会问Windows 上直接装 Docker Desktop 不是更方便吗确实方便但 Docker Desktop 默认依赖 WSL2 或 Hyper-V需要宿主机开启虚拟化支持一旦 BIOS 里没开就会碰到 docker desktop failed to start because virtualisation support wasnt detected 这种报错。而且 Docker Desktop 和 VMware 同时跑的时候资源占用和虚拟化层的冲突也比较常见。相比之下在虚拟机里装 Docker 虽然多了一层但整个运行环境跟生产服务器行为更一致容器跑起来之后的网络、存储、权限行为都能直接迁移到线上。1.2 为什么是 CentOS 7.9.2009 而不是 CentOS 8/9 或 UbuntuCentOS 7.9.2009 是 CentOS 7 系列的最后一个版本发布于 2020 年 9 月内核版本 3.10.0-1160。选择它有几个实际原因生态成熟。网上绝大部分部署教程都是基于 CentOS 7 写的Docker、MySQL、Nginx、Redis、Kubernetes 这些服务在 CentOS 7 上都有非常成熟的支持方案。兼容性好。很多存量项目跑的就是 CentOS 7企业内部环境、培训环境、老系统的部署文档默认都是这套。行为稳定。CentOS 7 使用 systemd、firewalld、NetworkManager 这套体系跟 Ubuntu 的 netplan、ufw 有差异但对服务器运维来说这套体系覆盖面很广、参考案例多。近两年总能看到为什么 ubuntu 现在比 centos 多这种讨论这是事实。CentOS 官方已经停掉了传统版本转向 CentOS Stream所以对追求长期稳定的用户来说7.9.2009 反而成了最后一个可靠选择。对于还在运行老项目的团队迁移系统代价太大不如继续在 7.9 上维护。这里要提醒一个关键点CentOS 7 已经在 2024 年 6 月停止官方维护默认的 yum 源已经处于归档状态直接 yum install 会连接失败或报 404需要切换到 vault 源或国内镜像源。这个问题我会在系统初始化部分专门讲很多人装完系统后第一步就卡在这里。1.3 VMware、虚拟机和 Docker 三者怎么配合理清一下整套结构。VMware Workstation Pro 是宿主机上的虚拟化软件它模拟出一台完整电脑也就是虚拟机虚拟机里安装 CentOS 7.9 系统Docker 再安装在 CentOS 系统内部用来管理容器。三层结构听起来重实际用起来是最稳的虚拟机磁盘、网络、快照独立管理随时可以回滚CentOS 环境可以反复折腾宿主机的文件和数据不受影响Docker 跑在完整的 Linux 内核上比 Docker Desktop 这种虚拟机套壳方案更接近生产环境。这也是为什么很多实操教程强调vmware 安装 centos 后再在 centos 里装 docker。直接在 Windows 上装 Docker 确实快但文件挂载、端口映射、网络模式这些行为在虚拟化层有差异跑常规服务没问题一旦要试验复杂网络、内核参数、多机互联就会遇到奇怪的问题。用 VMware 先搭一台干净的 CentOS再装 Docker整个过程能帮你踏踏实实理解每一层的关系。2. 虚拟机创建阶段的关键细节2.1 VMware Workstation Pro 的准备我这边用的是 VMware Workstation Pro 17版本 16 也没问题操作逻辑基本一致。安装好 VMware 之后先别急着创建虚拟机第一件事是确认宿主机的虚拟化功能是否启用。打开任务管理器切到性能标签看最下面的虚拟化项如果是已启用就没问题如果显示未启用需要进 BIOS/UEFI 打开 Intel VT-x 或 AMD-V。这一步很关键。很多人遇到在 VMware 里装系统黑屏、卡死、或者 WSL2 无法启动提示未启用虚拟化根源都在这里。VMware 的虚拟机监控程序依赖 CPU 的虚拟化指令不开的话虚拟机要么起不来要么性能极差。另外提醒一下VMware 启动虚拟机时如果提示无法连接到虚拟机请确保您有权运行该程序、访问该程序使用多半是 VMware Authorization Service 服务没启动。在 Windows 服务管理器里找到 VMware Authorization Service设为自动并启动然后重新打开 VMware 就行。创建虚拟机时在自定义硬件里能看到虚拟化引擎的选项里面有虚拟化 Intel VT-x/EPT 或 AMD-V/RVI这类复选框。如果只是装一台 CentOS 跑 Docker保持默认即可不需要勾选如果你打算在 CentOS 虚拟机里再嵌套安装虚拟机那就要勾上。开启嵌套虚拟化会损失一点性能按需打开就好。2.2 CentOS 7.9.2009 镜像的下载与校验镜像文件是整个流程的基石。CentOS 7.9.2009 的官方镜像已经进入归档状态从 vault.centos.org 可以下载国内也可以直接用阿里云、清华的镜像站。推荐下载 Minimal 版本体积在 900MB 到 1GB 左右只包含最小系统后面缺什么再装什么干净整洁。下载好之后建议做一次校验。CentOS 官方会提供 SHA256 校验值Linux 下用 sha256sum 命令Windows 下可以用 PowerShell 的 Get-FileHash。这一步很多人会跳过但镜像文件如果在下载过程中损坏安装到一半报错才是真的浪费时间。校验不通过也别纠结重新下载即可。一个选镜像的小经验搜索引擎里经常能看到 centos 7.6 iso 镜像下载 这样的老版本但既然装就装 7.9.2009这是 7 系列里修复问题最多的版本对 Docker 和主流中间件的兼容性验证最充分没必要为了怀旧去用老版本。2.3 新建虚拟机的关键参数配置在 VMware 里创建虚拟机时我习惯选自定义高级这样能控制更多硬件参数。几个关键项的参考配置虚拟机兼容性选择 Workstation 17.x如果 VMware 版本低选当前版本支持的最高兼容级别即可。安装介质选稍后安装操作系统避免 VMware 自动引导跟镜像交互时出意外。客户机操作系统Linux版本选CentOS 7 64 位。虚拟机名称和位置名称用有辨识度的比如 centos7-docker位置不要放 C 盘虚拟磁盘文件几十 GB放数据盘更好管理。固件类型默认 BIOS 即可不需要特意改 UEFI。处理器建议 2 个处理器、每个处理器 2 核合计 4 核。内存建议 4096MB如果计划跑 MySQL 和多个容器直接给 8192MB 会更舒服。网络类型默认 NAT。如果想跟局域网内物理机互访选桥接模式。I/O 控制器默认 LSI Logic。磁盘类型NVMe 或 SCSI 都行日常 Docker 场景感知不到太大差异。磁盘容量建议至少 60GB勾选将虚拟磁盘存储为单个文件方便后续扩容。这里重点说一下磁盘容量。Docker 镜像和容器日志都是空间杀手跑几个 MySQL、Redis再加上镜像缓存20GB 很容易见底。我一般直接给 80GB虚拟磁盘实际占用的宿主空间是按需增长的不会立刻占满预留空间能避免后面频繁扩盘。2.4 安装系统前遇到的常见异常帮人排查 VMware 装系统的问题遇到最多的就是两类黑屏和蓝屏。黑屏的典型表现是点开启此虚拟机后屏幕一直黑着进不了 CentOS 安装界面。常见原因有三个宿主机虚拟化没开启、虚拟机的固件类型和镜像不匹配、VMware 的显卡加速异常。解决办法也直接先确认 BIOS 虚拟化已开启然后关闭虚拟机设置里的加速 3D 图形如果仍然黑屏尝试在 vmx 配置文件末尾加一行 mks.enable3d FALSE保存后重新启动虚拟机。蓝屏通常发生在 VMware 和 Windows 自带的虚拟化平台冲突时特别是同时装了 Docker Desktop、WSL2、Hyper-V 的情况。报错一般指向 vmmon 驱动或 hypervisor 层冲突。解决思路是不要把 Hyper-V 和 VMware 的嵌套虚拟化同时开着报错严重时临时关闭 Windows 的虚拟机监控程序相关功能再试。vmware 安装 centos 黑屏和虚拟机安装 linux 蓝屏这两个搜索词热度一直很高可见是高频问题提前知道怎么排查能省不少时间。3. CentOS 7.9 系统安装与初始化3.1 安装过程中的关键选择把 CentOS 7.9.2009 镜像挂载到虚拟机的 CD/DVD 光驱后开机进入安装界面。整个安装流程很简单重点说三个选择软件选择选最小安装Minimal不装带 GUI 的版本。Docker 部署基本用不到图形界面最小化系统占资源少也避免 X Window 相关的包干扰容器运行环境。CentOS 的 GUI 版本会额外装大量桌面依赖纯服务器场景完全没必要。分区设置这是安装过程里最需要花心思的一步。CentOS 安装器的默认分区方案是 LVM根分区占用大部分空间。我的做法是手动分区/boot 1GBswap 4GB剩余全部给 /。如果确定主要用来跑 Docker也可以单独给 /var/lib/docker 分一个大区因为这个目录是 Docker 默认存放镜像、容器、卷的地方。单独分区之后即使根分区空间告急也不影响容器数据备份和迁移时直接针对这个目录操作逻辑清晰很多。如果磁盘空间足够我一般会留出一部分未分配空间不把所有空间全分完。LVM 最重要的特性就是可以在线扩容预留空间后以后磁盘不够了只需要在 VMware 里扩大虚拟磁盘再到系统里用 pvresize、lvextend 扩展逻辑卷不需要重装系统数据零丢失。网络设置安装向导里可以提前把以太网开关打开确认能获取 IP。DHCP 模式下这一步很简单但如果安装时跳过装完系统再开网卡就会遇到 vm 中桥接模式 centos 网络激活失败 这种问题后面单独讲。安装完成后记得设置 root 密码、创建管理员用户并记下自己设置的主机名。安装界面右下角的配置里可以预置网络建议在这里先把网卡打开避免进入系统后再折腾。3.2 安装完成后的基础初始化系统装完重启后第一件事是配置软件源。因为 CentOS 7 官方源已停止维护不换源的话执行 yum install 要么超时要么直接报 404。推荐切换到国内镜像源或者使用 vault 源。以阿里云镜像源为例把 /etc/yum.repos.d/CentOS-Base.repo 替换为阿里云镜像站的 CentOS-7.repo 内容执行 yum clean all yum makecache然后安装基础工具yum install -y vim net-tools wget curl。接下来处理 SELinux 和防火墙。SELinux 是 CentOS 内置的安全增强模块在默认启用的情况下跑 Docker经常出现文件挂载权限报错比如 Permission denied 或者 cannot open directory。我的习惯是本地测试环境直接把 SELinux 改为 disabled需要重启生效或者 permissive临时放行生产环境按需配置策略不建议粗暴关闭。防火墙 firewalld 同理如果你需要从宿主机访问虚拟机里容器的端口可以放行指定端口也可以直接关闭。本地测试环境我一般会禁用 firewalld 并取消开机自启减少干扰正式项目不建议关需要开放端口就规规矩矩放行。时间同步也很重要。CentOS 7 默认装了 chrony检查 /etc/chrony.conf 里的 server 地址是否可用然后执行 systemctl enable --now chronyd。容器和主机时间不一致的话排查日志非常痛苦尤其跑数据库和日志系统的时候。3.3 网络问题排查网卡激活失败与连不上虚拟机网络问题通常是整套流程里最卡人的环节。最常见的是两个网卡激活失败、远程工具连不上虚拟机。先看激活失败。装系统时如果没打开网卡启动后会发现网络是断开的用 nmcli device status 查看网卡状态通常是 disconnected 或者 unmanaged。处理方法nmcli device status 确认网卡名称一般是 ens33 或 ens32执行 nmcli device connect ens33或者 nmcli device reapply ens33如果提示设备未托管检查 /etc/sysconfig/network-scripts/ifcfg-ens33把 ONBOOT 改成 yes执行 systemctl restart NetworkManager 让配置生效。桥接模式激活失败还有一个常见原因VMware 的虚拟网络编辑器里VMnet0 桥接的物理网卡选错了。比如宿主机实际用的是无线网卡VMnet0 却桥接在已断开的有线网卡上。打开 VMware编辑→虚拟网络编辑器把 VMnet0 的桥接目标改成实际联网的网卡即可。再看连不上虚拟机。安装完系统后用 Xshell 或 MobaXterm 连接失败排查顺序是ip addr 查看虚拟机 IP确认当前网络的网段systemctl status sshd 确认 SSH 服务是否启动没装就 yum install -y openssh-server 然后 systemctl start sshdsystemctl status firewalld 查看防火墙状态如果是 active放行 22 端口或临时停掉测试如果 NAT 模式下宿主机 ping 不通虚拟机不一定有问题NAT 模型下宿主机通常用虚拟网卡 VMnet8 跟虚拟机通信直接测 SSH 端口更靠谱。一个小经验NAT 模式下虚拟机能上外网但宿主机连不上绝大多数是 SSH 服务或防火墙的问题桥接模式下连不上优先排查 IP 段和 VMware 桥接的物理网卡。4. Docker 部署实操4.1 安装 Docker 前的环境准备Docker 在 CentOS 7 上要求内核版本不低于 3.10CentOS 7.9.2009 的内核是 3.10.0-1160满足条件。先安装依赖包yum install -y yum-utils device-mapper-persistent-data lvm2yum-utils 提供 yum-config-manager 命令专门用来管理 yum 源配置device-mapper-persistent-data 和 lvm2 是 Device Mapper 存储驱动需要的依赖。Docker 默认使用 overlay2 存储驱动但安装过程和部分功能仍然依赖这些包。然后添加 Docker 的 yum 源。官方源在海外国内机器建议直接用阿里云镜像站的 docker-ce 源yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum makecache这里特别提醒不要用 CentOS 7 extras 源里自带的 docker 包那个版本很老功能不全很多新特性都不支持。一定要用 docker-ce 源安装社区版yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugindocker-compose-plugin 是 docker compose 的插件版现在官方推荐用 docker compose 子命令来管理多容器应用比老式 docker-compose 二进制更值得长期使用。如果后面要用 compose 文件统一管理服务这个包必须装。4.2 配置 daemon.json安装完成后不要急着启动先把 /etc/docker/daemon.json 写好。这个配置文件决定 Docker 的运行时行为很多后来才出现的坑都是因为一开始没配置而埋下的。我常用的配置模板如下{ registry-mirrors: [https://docker.m.daocloud.io], exec-opts: [native.cgroupdriversystemd], log-driver: json-file, log-opts: { max-size: 100m, max-file: 3 }, data-root: /var/lib/docker, storage-driver: overlay2 }逐项解释一下registry-mirrors镜像加速地址。国内直接拉 Docker Hub 镜像经常超时配加速器之后体验会好很多。加速器地址更新频率高建议以当天可用的地址为准。exec-opts把 Docker 的 cgroup 驱动设置为 systemd。CentOS 7 使用 systemd 作为 init 系统Docker 默认的 cgroup driver 是 cgroupfs平时用没问题但后面接 Kubernetes 或做资源配额控制时容易出问题统一成 systemd 是更标准的做法。log-driver 和 log-opts限制单个容器日志文件大小和数量。容器日志是一个隐形磁盘杀手不限制的话日志量大的容器很快就能把磁盘写满。>systemctl enable --now dockerenable 表示设置开机自启--now 表示立即启动。这一步必须做否则虚拟机重启后 Docker 不会自动拉起每次都要手动敲命令很影响体验。验证 Docker 是否正常运行docker version查看客户端和服务端版本Server 部分不能是 ERRORdocker info查看存储驱动、cgroup driver、镜像加速器是否生效docker run --rm hello-world拉取测试镜像并运行能打印出欢迎信息就代表安装成功。第一次运行 hello-world 会先拉镜像如果一直卡在 Pulling大概率是镜像加速没配好或者宿主机外网访问受限优先检查 daemon.json 里的 registry-mirrors 配置。4.4 常用命令速查给刚入门的读者整理一份高频命令不需要刻意背用几次就熟了docker ps查看运行中的容器加 -a 查看全部容器docker images查看本地镜像列表docker pull 镜像名拉取镜像docker run -d --name 容器名 镜像名后台运行容器docker exec -it 容器名 /bin/bash进入容器内部docker logs -f 容器名实时查看容器日志docker stop / start / restart 容器名停止、启动、重启容器docker rm 容器名删除容器docker rmi 镜像名删除镜像docker compose up -d根据 compose 文件批量启动服务。5. Docker 应用落地与故障排查实录5.1 快速部署一个 MySQL 8.0 容器在热词里docker install mysql8.0、docker 安装 mysql 出现频率非常高说明 MySQL 容器化是最典型的需求。Docker 部署 MySQL 的好处很明显不用手动下载安装包、不用处理复杂依赖一条命令就能拉起一个可用的实例。示例命令docker run -d \ --name mysql8 \ -p 3306:3306 \ -e MYSQL_ROOT_PASSWORDYourPassword \ -e MYSQL_ROOT_HOST% \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/data:/var/lib/mysql \ --restartalways \ mysql:8.0参数说明-d后台运行--name mysql8给容器命名方便后续操作-p 3306:3306宿主机 3306 端口映射到容器 3306-e MYSQL_ROOT_PASSWORD设置 root 密码-e MYSQL_ROOT_HOST%允许 root 从任意主机连接本地测试方便生产环境建议改成具体 IP-v数据卷挂载把 MySQL 配置和数据映射到宿主机 /data 目录容器删除后数据不丢--restartalways容器退出后自动重启配合 Docker 开机自启服务恢复能力很强。启动后 docker ps 查看状态再测试连接。这里踩过一个实际坑宿主机防火墙开着时即使端口映射正确也连不上 MySQL需要放行 3306 端口或者临时关闭防火墙验证。另外/data 目录如果不存在Docker 会自动创建但要注意目录属主权限某些情况下 MySQL 会因权限不足无法写入数据可以用 docker logs mysql8 查看具体报错。5.2 CentOS 虚拟机的磁盘扩容处理当 Docker 镜像和容器日志占满磁盘时扩容是必然需求。这也正好对应热词里centos 扩容的高频搜索。扩容分两层先在 VMware 层扩大虚拟磁盘再在 CentOS 系统里扩展分区和文件系统。VMware 层操作关闭虚拟机在虚拟机设置里选择硬盘点扩展把容量调大比如 60GB 扩到 100GB启动虚拟机。CentOS 系统层操作fdisk -l 或 lsblk 查看当前分区结构确认未分配空间扩展系统分区growpart /dev/sda 3分区号以 lsblk 输出为准扩展物理卷pvresize /dev/sda3扩展逻辑卷lvextend -l 100%FREE /dev/centos/root卷组名和逻辑卷名以 vgdisplay 和 lvdisplay 输出为准扩展文件系统xfs_growfs /CentOS 7 默认 xfsext4 用 resize2fs /dev/centos/root。每步操作完用 df -h 验证空间是否变化。如果 growpart 命令找不到先安装 yum install -y cloud-utils-growpart。最小化安装的系统经常缺这个工具我第一次操作时就卡在这一步。扩容操作前一定要用 lsblk 看清楚分区结构尤其是 boot 独立分区的情况别把分区号搞错。LVM 的好处是扩展过程可以热操作数据不会丢但前提是逻辑卷名和物理卷路径都要确认准确。5.3 Docker 常见问题速查表整个流程下来我整理了一个高频问题排查表问题现象可能原因排查与解决方法systemctl start docker 报错daemon.json 语法错误或 overlay2 不被支持用 journalctl -u docker 看错误日志检查 daemon.json 的 JSON 格式docker pull