1. 从零开始的虚拟化环境搭建:为什么是Linux + VMware + Docker?

如果你是一名开发者、运维工程师,或者对现代软件部署感兴趣的技术爱好者,那么“Linux虚拟机”和“Docker”这两个词对你来说一定不陌生。你可能无数次看到过“一键部署”、“容器化”这样的宣传,但当你真正想在自己的电脑上动手实践时,却常常卡在第一步:如何创建一个干净、可控的Linux环境来运行Docker?网上的教程要么过于简略,要么假设你已经有了一个现成的Linux服务器,对于从Windows或macOS起步的初学者来说,中间缺失的环节恰恰是最让人头疼的。

这正是我们今天要解决的问题。我将以一个从业多年的老鸟视角,带你完整地走一遍从零开始,在个人电脑上创建Linux虚拟机,并成功安装、配置Docker的全过程。这不仅仅是“下一步、下一步”的点击教程,我会穿插大量我在实际工作中踩过的坑、总结的技巧,以及每个步骤背后的“为什么”。比如,为什么选择VMware而不是VirtualBox?为什么在虚拟机里装Docker,而不是直接在宿主机上装Docker Desktop?Linux发行版选哪个更省心?这些选择背后,都关乎着你后续学习和使用的顺畅度。

我们最终的目标,是让你获得一个高度仿真的、隔离的Linux服务器环境。在这个环境里,你可以随意折腾Docker,拉取镜像、运行容器、练习编排,而完全不用担心搞乱你的主力操作系统。这对于学习容器技术、测试软件兼容性、搭建个人开发环境来说,是性价比最高、风险最低的方案。接下来,我们就从最基础的虚拟机软件选择和安装说起。

2. 基石之选:VMware Workstation的安装与核心配置解析

工欲善其事,必先利其器。在个人电脑上虚拟化Linux,首推VMware Workstation Pro(或Player免费版)。相较于其他虚拟化方案,VMware在性能、网络模拟、与宿主机交互(如文件共享、剪贴板同步)方面做得更为成熟稳定,特别适合需要长期使用和复杂配置的开发测试场景。

2.1 VMware Workstation的获取与安装要点

首先,你需要从VMware官网下载对应你操作系统(Windows或Linux)的安装包。对于个人学习和非商业用途,VMware Workstation Player的免费版本功能已经足够强大。安装过程本身是图形化的向导,但有几个关键点需要特别注意,这些点往往决定了后续虚拟机能否稳定运行。

第一, 安装路径 。尽量不要安装在C盘默认的程序文件夹。建议单独创建一个路径,如 D:\VMware 。这样做的好处是,将来虚拟机文件(通常很大)也可以集中存放在此路径下,便于管理和备份,避免C盘空间被快速耗尽。

第二, 安装过程中的组件选择 。安装向导会询问你是否安装“增强型键盘驱动程序”和“VMware USB Arbitration Service”等。我强烈建议全部勾选。尤其是“增强型键盘驱动程序”,它能更好地处理不同语言键盘布局在宿主机和虚拟机之间的切换,避免在Linux终端里输入命令时出现乱码或键位错乱的问题。

第三,也是最重要的一点: 确保BIOS/UEFI中的虚拟化技术(Intel VT-x / AMD-V)已开启 。这是VMware(以及后续Docker)能够高效运行的硬件基础。很多朋友安装完VMware后启动虚拟机报错“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”,根源就在这里。重启电脑,进入BIOS设置(通常是开机时按F2、Del或F12键),在“Advanced”或“Security”选项卡下,找到“Virtualization Technology”或“Intel Virtualization Technology”选项,将其设置为“Enabled”。这个步骤因主板品牌而异,但关键词是“Virtualization”或“VT-x”。

2.2 首次运行与许可证配置

安装完成后首次运行VMware,如果是Workstation Pro版本,会要求你输入许可证密钥。你可以选择试用30天。对于Player版本,则可以直接免费使用。这里有一个小技巧:即使你暂时没有Pro版的密钥,也可以先使用Player版完成所有学习和测试。两者的核心虚拟化引擎是一样的,Player版只是缺少了一些高级功能如快照管理器、多虚拟机同时运行等,对于单台Linux虚拟机的创建和Docker学习来说,完全没有影响。

启动后,建议先进入“编辑” -> “首选项”进行一些全局设置。在“工作区”选项卡,可以设置默认的虚拟机存放位置,我通常会指向一个空间充足的硬盘分区,比如 E:\VM\ 。在“内存”选项卡,你可以根据宿主机物理内存大小,设定一个分配给虚拟机的默认上限,防止创建虚拟机时不小心分配过多内存导致宿主机卡顿。对于一台主要用来跑Docker的Linux虚拟机,分配2GB-4GB内存是合理的起点。

3. 打造你的专属实验场:创建并优化CentOS/Rocky Linux虚拟机

虚拟机软件准备好了,接下来就是选择并安装一个Linux发行版。对于容器和运维领域,CentOS的替代者——Rocky Linux,或者Ubuntu Server LTS,都是极佳的选择。它们拥有庞大的社区支持和稳定的软件源。这里我以Rocky Linux为例,因为它完全继承了CentOS的稳定性和企业级特性,且生命周期有保障。

3.1 虚拟机创建与系统安装的魔鬼细节

打开VMware,点击“创建新的虚拟机”。选择“典型”配置即可。在安装来源页面,选择你提前下载好的Rocky Linux ISO镜像文件。VMware会自动检测到这是一个Linux系统,并推荐使用“CentOS 64位”作为客户机操作系统(对于Rocky Linux 8/9,选CentOS 8/9 64位完全兼容)。

接下来是命名和位置,给你的虚拟机起个有意义的名字,比如 docker-lab-rocky9 ,位置指向你之前设定的VM目录。然后是 磁盘容量分配 ,这是第一个容易踩坑的地方。VMware会建议默认大小(例如20GB),并选择“将虚拟磁盘拆分成多个文件”。对于在机械硬盘上运行,选择“拆分”可以提高磁盘性能和大文件传输的灵活性。但对于SSD,区别不大。我更关注的是下面这个选项:“立即分配所有磁盘空间”。 千万不要勾选这个! 如果勾选,VMware会立刻在你的物理硬盘上划出20GB的空间并占满,即使虚拟机内部只用了5GB。我们应该选择“动态分配”,这样虚拟磁盘文件会随着虚拟机内实际使用量的增长而增长,最大不超过20GB,非常节省宿主机空间。

分配内存和CPU核心数时,请量力而行。对于学习用的Docker主机,2GB内存、2个CPU核心是流畅运行的底线。如果你的宿主机有16GB内存,分配给虚拟机4GB内存和4个核心,将会获得更佳的体验。

安装过程在虚拟机内进行,与物理机安装无异。有几个关键配置需要注意:

  1. 软件选择 :在安装信息摘要界面,点击“软件选择”。默认是最小安装(Minimal Install)。对于Docker环境,我推荐选择“带GUI的服务器”(Server with GUI)或至少是“开发工具”(Development Tools)。前者会包含图形界面,对于不熟悉纯命令行的新手更友好;后者则包含了编译器等必要工具,能避免后续安装某些依赖时再折腾。
  2. 网络和主机名 :务必在这里就打开以太网连接(通常显示为“未连接”,点击开关变为“已连接”)。同时,设置一个主机名,如 docker-host
  3. 磁盘分区 :对于实验环境,直接使用自动配置的LVM分区方案即可,无需手动调整。
  4. 根密码和用户创建 :设置一个强壮的root密码,并创建一个普通用户(如 docker-user ),同时将其设为管理员(在创建用户时勾选“将此用户设为管理员”),这样以后就可以用 sudo 来执行特权命令,比直接使用root更安全。

安装完成后,重启虚拟机。首次启动会有一个初始化设置,接受许可证,完成一些简单配置即可进入系统。

3.2 安装后的首要优化:VMware Tools与基础配置

系统装好了,但你会发现屏幕分辨率可能不对,也无法在宿主机和虚拟机之间拖拽文件。这是因为缺少了VMware Tools(或Open VM Tools)。这是VMware提供的一套驱动和实用程序,用于提升虚拟机的性能与用户体验。

对于Rocky Linux/CentOS 8/9,安装Open VM Tools(开源版本)是最简单的方式。打开终端,执行以下命令:

sudo dnf install open-vm-tools -y

对于带GUI的安装,还可以安装桌面增强组件:

sudo dnf install open-vm-tools-desktop -y

安装完成后,重启虚拟机。你会发现现在可以自由调整虚拟机窗口大小了,剪贴板也能在宿主机和虚拟机之间共享。文件共享功能需要在VMware的虚拟机设置中单独配置:在“选项” -> “共享文件夹”中,添加宿主机上你希望共享的目录,并勾选“始终启用”。在虚拟机内,共享的文件夹通常位于 /mnt/hgfs/ 目录下。

接下来,进行一些基础的系统优化。首先是更新系统:

sudo dnf update -y

然后,如果你身处国内,为了获得更快的软件下载速度,建议更换DNF的软件源为国内镜像。以阿里云镜像为例(适用于Rocky Linux 9):

sudo sed -e 's|^mirrorlist=|#mirrorlist=|g' \
         -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
         -i.bak \
         /etc/yum.repos.d/rocky-*.repo
sudo dnf makecache

最后,设置静态IP地址(可选但推荐)。在实验环境中,一个固定的IP地址会让你后续通过SSH连接、配置Docker网络时更加方便。编辑网络配置文件(网卡名称可能不同,通常是 ens33 eth0 ):

sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33

BOOTPROTO dhcp 改为 static ,并添加以下配置(请根据你的实际网络环境调整):

BOOTPROTO=static
IPADDR=192.168.xxx.xxx    # 你希望设置的静态IP
NETMASK=255.255.255.0
GATEWAY=192.168.xxx.1     # 你的网关,通常是宿主机VMnet8的IP
DNS1=8.8.8.8
ONBOOT=yes

保存后,重启网络服务: sudo systemctl restart network 。现在,你的Linux虚拟机已经是一个稳定、高效且易于使用的实验平台了。

4. Docker引擎的安装与深度配置:不止于 curl | bash

虚拟机环境就绪,现在可以安装主角Docker了。虽然Docker官方提供了一键安装脚本,但作为一名严谨的从业者,我强烈建议通过配置官方软件源的方式进行安装。这种方式更透明、更安全,也便于后续的版本管理和更新。

4.1 通过官方仓库安装Docker CE

首先,卸载任何可能存在的旧版本Docker(如果是全新系统可跳过):

sudo dnf remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine

接着,安装必要的依赖包,这些包允许 dnf 通过HTTPS使用仓库:

sudo dnf install -y yum-utils device-mapper-persistent-data lvm2

然后,添加Docker的官方稳定版仓库。这里有一个关键选择:是使用Docker官方源,还是使用国内镜像源(如阿里云)?对于国内用户,使用镜像源速度会快很多。

# 添加阿里云Docker CE镜像源(适用于Rocky Linux/CentOS)
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

如果你希望使用官方源,则将URL替换为 https://download.docker.com/linux/centos/docker-ce.repo

更新软件包索引并安装Docker引擎、命令行工具以及容器运行时 containerd.io

sudo dnf makecache fast
sudo dnf install -y docker-ce docker-ce-cli containerd.io

安装完成后,启动Docker服务并设置开机自启:

sudo systemctl start docker
sudo systemctl enable docker

最后,验证安装是否成功。运行经典的 hello-world 镜像:

sudo docker run hello-world

如果看到“Hello from Docker!”等欢迎信息,说明Docker引擎已经安装并运行正常。

4.2 配置非root用户运行Docker与镜像加速

默认情况下,运行Docker命令需要 sudo 权限。为了方便,我们可以将当前用户加入 docker 用户组,这样以后就可以直接使用 docker 命令了。

sudo usermod -aG docker $USER

重要提示 :执行此命令后,你需要完全注销当前用户并重新登录,或者重启虚拟机,用户组变更才会生效。这是一个常见的疏忽点,很多人加了组后直接测试,发现仍然需要 sudo ,误以为是配置错误。

接下来是至关重要的一步:配置国内镜像加速器。从Docker Hub直接拉取镜像速度可能非常慢甚至失败。国内许多云服务商提供了免费的镜像加速服务。以阿里云为例,你需要先注册阿里云账号,进入“容器镜像服务” -> “镜像工具” -> “镜像加速器”,会获得一个专属的加速器地址(形如 https://xxxx.mirror.aliyuncs.com )。

编辑Docker守护进程的配置文件:

sudo vi /etc/docker/daemon.json

如果文件不存在,则新建它。添加以下内容(以阿里云加速器为例,你可以配置多个):

{
  "registry-mirrors": [
    "https://xxxx.mirror.aliyuncs.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ]
}

保存文件后,重新加载配置并重启Docker服务:

sudo systemctl daemon-reload
sudo systemctl restart docker

重启后,可以通过 sudo docker info 命令查看,在输出结果的末尾,如果看到 Registry Mirrors 下列出了你配置的地址,说明加速器配置成功。

4.3 Docker的存储驱动与日志管理初探

安装配置好后,还有两个底层细节值得关注,它们会影响Docker的长期稳定运行。

首先是 存储驱动 。Docker使用存储驱动来管理镜像和容器的数据层。在Linux上,默认的驱动通常是 overlay2 ,它对Rocky Linux/CentOS 8/9支持良好。你可以通过 docker info | grep Storage 来查看当前使用的驱动。除非有特殊需求,否则不建议更改。 overlay2 在性能和稳定性上都是目前的最佳选择。

其次是 日志管理 。Docker容器默认会将日志以JSON格式输出到文件,如果不加管理,日志文件可能会无限增长,占满磁盘空间。我们可以通过配置Docker守护进程的日志驱动和日志轮转策略来预防。编辑 /etc/docker/daemon.json ,在之前配置的基础上增加日志相关配置:

{
  "registry-mirrors": [...],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}

这个配置将日志驱动设为 json-file ,并设置单个日志文件最大10MB,最多保留3个历史文件。同样,修改后需要重启Docker服务。这是一个生产环境常用的基础配置,能从源头避免因日志爆满导致的系统问题。

5. 实战检验与排错指南:运行你的第一个容器化应用

理论配置都已就绪,是时候用实战来检验我们的劳动成果了。我们将超越简单的 hello-world ,部署一个真正有交互的Web应用,并在这个过程中,预演你可能遇到的一些典型问题及其排查思路。

5.1 部署一个Nginx Web服务器容器

让我们从运行一个标准的Nginx容器开始,这是最经典的入门示例。执行以下命令:

docker run -d --name my-nginx -p 8080:80 nginx:alpine

逐条解析这个命令:

  • docker run : 创建并启动一个新容器。
  • -d : 后台(detached)模式运行容器。
  • --name my-nginx : 给容器起一个名字,方便后续管理(如停止、重启、查看日志),而不是使用随机生成的ID。
  • -p 8080:80 : 端口映射,这是关键。它将宿主机的8080端口映射到容器内部的80端口(Nginx默认监听80端口)。
  • nginx:alpine : 指定要使用的镜像。我们使用了 alpine 标签,这是一个基于Alpine Linux的极简镜像,体积非常小(只有几MB),非常适合学习和测试。

命令执行后,Docker会先检查本地是否有 nginx:alpine 镜像,如果没有,则会从配置的镜像加速器拉取。拉取完成后,容器在后台启动。

现在,打开你宿主机上的浏览器,访问 http://<你的虚拟机IP>:8080 。你应该能看到Nginx的欢迎页面。恭喜你,你的第一个容器化应用已经成功运行!这个简单的操作背后,Docker完成了镜像拉取、容器创建、网络命名空间隔离、端口映射等一系列复杂工作。

5.2 常见问题排查与调试命令

事情并非总是一帆风顺。下面列举几个新手常遇到的问题及排查方法:

问题1:访问 http://虚拟机IP:8080 无响应。 这是最常见的问题。请按以下步骤排查:

  1. 检查容器状态 :运行 docker ps 。你应该能看到名为 my-nginx 的容器状态为 Up 。如果状态是 Exited ,说明容器启动失败了。使用 docker logs my-nginx 查看容器日志,通常错误信息会直接告诉你原因(例如,端口已被占用)。
  2. 检查端口映射 :运行 docker port my-nginx 。它会显示容器的端口映射情况,确认是否将容器的80端口映射到了宿主机的8080。
  3. 检查虚拟机防火墙 :Rocky Linux/CentOS默认启用了防火墙(firewalld)。它可能阻止了外部对8080端口的访问。你需要放行该端口:
    sudo firewall-cmd --permanent --add-port=8080/tcp
    sudo firewall-cmd --reload
    
  4. 检查宿主机与虚拟机网络 :确保你的宿主机能ping通虚拟机的IP地址。在VMware中,虚拟机的网络适配器通常设置为“NAT模式”,这会让虚拟机处在一个虚拟的子网中。确保虚拟机的IP(如192.168.xxx.xxx)和宿主机VMnet8网卡的IP(如192.168.xxx.1)在同一个网段。

问题2:执行 docker 命令提示“权限被拒绝”。 这通常是因为你没有将用户加入 docker 组,或者加了组但没有重新登录。请再次确认:

groups $USER

查看输出中是否包含 docker 组。如果不包含,请执行 sudo usermod -aG docker $USER 后, 务必注销并重新登录

问题3:拉取镜像速度极慢或失败。 这大概率是镜像加速器未生效。请检查:

sudo docker info | grep -A 5 Mirrors

确认你的加速器地址在列表中。如果不在,请检查 /etc/docker/daemon.json 文件的格式是否正确(必须是合法的JSON),并确保重启了Docker服务。

5.3 容器生命周期管理与数据持久化初体验

掌握了运行和排查,我们再来学习容器的基本管理和一个核心概念:数据持久化。

基本管理命令

  • docker ps : 查看正在运行的容器。
  • docker ps -a : 查看所有容器(包括已停止的)。
  • docker stop my-nginx : 停止运行中的容器。
  • docker start my-nginx : 启动已停止的容器。
  • docker rm my-nginx : 删除已停止的容器(加 -f 参数可强制删除运行中的容器)。
  • docker images : 查看本地镜像列表。
  • docker rmi nginx:alpine : 删除本地镜像(需先删除依赖它的容器)。

数据持久化实战 :默认情况下,容器内创建的文件只存在于容器的可写层中。当容器被删除,这些数据也会丢失。为了实现数据持久化,我们需要使用“卷挂载”(Volume Mounts)或“绑定挂载”(Bind Mounts)。

例如,我们想修改Nginx的默认欢迎页面,并让修改在容器重启后依然保留。可以这样做:

  1. 在宿主机(虚拟机内)创建一个目录存放我们的网页文件:
    mkdir ~/my-nginx-html
    echo "<h1>Hello from My Custom Nginx Container!</h1>" > ~/my-nginx-html/index.html
    
  2. 停止并删除旧的Nginx容器: docker rm -f my-nginx
  3. 运行一个新的Nginx容器,并将宿主机目录挂载到容器内的网页根目录:
    docker run -d --name my-nginx \
      -p 8080:80 \
      -v /home/your-user/my-nginx-html:/usr/share/nginx/html:ro \
      nginx:alpine
    
    这里 -v 参数用于挂载。 /home/your-user/my-nginx-html 是宿主机目录, /usr/share/nginx/html 是容器内Nginx的默认网页根目录, ro 表示以只读方式挂载(防止容器内进程误删宿主机文件)。
  4. 再次访问 http://虚拟机IP:8080 ,你会看到自定义的欢迎语。即使你删除并重新创建这个容器,只要挂载同一个宿主机目录,数据就不会丢失。

通过这个完整的流程——从虚拟机创建、系统优化,到Docker的安装、配置、运行和基础管理——你已经搭建起了一个功能完备的容器化学习和实验环境。这个环境隔离、安全、可随意重置,是你探索更广阔的云原生世界(如Docker Compose、Kubernetes)的绝佳起点。记住,所有复杂的技能都源于对基础环境的熟练掌控,现在你已经拥有了这块坚实的基石。

更多推荐