最近在准备一套内部环境,需要在 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 wasn't detected" 这种报错。而且 Docker Desktop 和 VMware 同时跑的时候,资源占用和虚拟化层的冲突也比较常见。相比之下,在虚拟机里装 Docker 虽然多了一层,但整个运行环境跟生产服务器行为更一致,容器跑起来之后的网络、存储、权限行为都能直接迁移到线上。
1.2 为什么是 CentOS 7.9.2009 而不是 CentOS 8/9 或 Ubuntu
CentOS 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 1GB,swap 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 sshd;
- systemctl status firewalld 查看防火墙状态,如果是 active,放行 22 端口或临时停掉测试;
- 如果 NAT 模式下宿主机 ping 不通虚拟机,不一定有问题,NAT 模型下宿主机通常用虚拟网卡 VMnet8 跟虚拟机通信,直接测 SSH 端口更靠谱。
一个小经验:NAT 模式下虚拟机能上外网但宿主机连不上,绝大多数是 SSH 服务或防火墙的问题;桥接模式下连不上,优先排查 IP 段和 VMware 桥接的物理网卡。
4. Docker 部署实操
4.1 安装 Docker 前的环境准备
Docker 在 CentOS 7 上要求内核版本不低于 3.10,CentOS 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.cgroupdriver=systemd"], "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 docker
enable 表示设置开机自启,--now 表示立即启动。这一步必须做,否则虚拟机重启后 Docker 不会自动拉起,每次都要手动敲命令,很影响体验。
验证 Docker 是否正常运行:
- docker version:查看客户端和服务端版本,Server 部分不能是 ERROR;
- docker 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_PASSWORD=YourPassword \ -e MYSQL_ROOT_HOST=% \ -v /data/mysql/conf:/etc/mysql/conf.d \ -v /data/mysql/data:/var/lib/mysql \ --restart=always \ 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 目录,容器删除后数据不丢;
- --restart=always:容器退出后自动重启,配合 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 默认 xfs,ext4 用 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