从零搭建Linux虚拟机与Docker环境:VMware+Ubuntu Server实战指南

从零搭建Linux虚拟机与Docker环境:VMware+Ubuntu Server实战指南

1. 项目概述与核心价值

最近在和一些刚入行的朋友交流时,发现一个挺普遍的现象:很多人在学习后端开发、云原生或者运维知识时,第一步就被卡在了环境搭建上。教程里轻描淡写的一句“在Linux服务器上安装Docker”,对于没有接触过虚拟化技术的新手来说,可能意味着要面对一堆陌生的概念——虚拟机、镜像、网络配置,每一步都可能是个坑。我自己也记得刚入门那会儿,在VMware和VirtualBox之间反复横跳,对着报错信息一筹莫展的经历。所以,我觉得有必要写一篇真正“手把手”的指南,目标就是让一个只有Windows或macOS电脑的纯新手,也能无痛地走完从创建Linux虚拟机到成功运行Docker的完整流程。

这个项目的核心价值在于“打通最后一公里”。网上不缺单独的VMware教程或Docker安装命令,但缺少一个连贯的、以终为始的视角。我们将从一个空白的主机操作系统(比如你的Windows 11笔记本)开始,一步步完成:选择并安装虚拟机软件 -> 获取Linux系统镜像 -> 创建并配置虚拟机 -> 在虚拟的Linux系统中安装和验证Docker。整个过程我会穿插大量我踩过的坑和总结的技巧,比如如何分配合理的资源避免卡顿,如何配置网络让虚拟机能上网也能被宿主机访问,以及安装Docker时那些容易出错的依赖问题怎么解决。无论你是想搭建一个本地的开发测试环境,还是单纯想学习Linux和容器技术,跟着这篇指南走一遍,你就能获得一个完全受你控制的、干净的实验沙盒。

2. 核心工具选型与准备

工欲善其事,必先利其器。在开始动手之前,我们需要明确几个核心工具的选择,并理解其背后的原因。这能帮你避免后续很多兼容性问题。

2.1 虚拟机平台:为什么是VMware Workstation Player?

市面上主流的桌面虚拟化软件有VMware Workstation(Player/Pro)、Oracle VirtualBox,以及对于Windows 10/11用户而言,还有内置的Hyper-V。我在这里首选推荐VMware Workstation Player(个人免费版)给新手,原因如下:

  1. 性能与稳定性:VMware的虚拟化驱动和硬件兼容性经过长期打磨,在大多数硬件上表现稳定,特别是对于显卡、USB设备和网络适配器的直通或模拟,很少出现奇怪的问题。相比之下,VirtualBox虽然免费开源,但在某些特定主机硬件(尤其是较新的笔记本)上,可能会遇到性能瓶颈或偶尔的卡死。
  2. 用户体验:VMware的安装过程、虚拟机创建向导和用户界面对新用户更为友好。它的“简易安装”功能可以大幅简化Linux系统的安装过程。网络配置方面,其提供的“NAT”和“桥接”模式概念清晰,易于理解和管理。
  3. 与Docker Desktop的兼容性:这是一个关键点。Windows上的Docker Desktop默认依赖于Hyper-V或WSL 2后端。如果你开启了Hyper-V,它与VMware Workstation(在默认配置下)是冲突的,因为它们属于不同类型的系统管理程序。但VMware Workstation 16及以上版本提供了兼容模式,可以在开启Hyper-V的Windows主机上运行,只是性能略有折损。为了获得最好的VMware虚拟机性能,我们通常建议在安装期间暂时不启用Hyper-V。对于纯粹的学习环境,使用VMware虚拟机来安装Linux,再在Linux中安装Docker Engine(而非Docker Desktop),是更清晰、隔离性更好的方案,避免了宿主机层面的复杂依赖。

注意:如果你的电脑是Apple Silicon (M1/M2/M3) Mac,则无法使用VMware。你需要使用Parallels Desktop或UTM等支持ARM架构的虚拟化软件,且需要选择ARM版本的Linux发行版(如Ubuntu Server ARM)。本指南主要基于x86架构的Windows/Intel Mac环境。

2.2 Linux发行版:选择Ubuntu Server LTS的理由

Linux发行版众多,如CentOS、Rocky Linux、Debian、openSUSE等。对于容器和开发环境,我推荐Ubuntu Server LTS版本(目前最新LTS是22.04或24.04)。理由很直接:

  1. 广泛的社区支持与文档:Ubuntu拥有最庞大的用户社区。你遇到的几乎任何问题,都能在Ask Ubuntu、Stack Overflow或无数博客中找到答案。这对于新手排错至关重要。
  2. 对Docker的友好性:Docker官方对Ubuntu的支持非常完善。安装文档清晰,软件源更新及时。许多云服务商和开源项目的默认或推荐环境也是Ubuntu。
  3. LTS版本:LTS代表长期支持,每个LTS版本提供5年的安全更新和维护。这保证了你的学习环境在相当长一段时间内是稳定且安全的,无需频繁升级系统内核导致环境变化。
  4. 资源消耗相对较低:相比于带图形界面的桌面版,Server版没有GUI,更轻量,能将更多的虚拟机资源(CPU、内存)留给你的应用和服务。

2.3 Docker:理解Docker Engine与Docker Desktop的区别

这是另一个容易混淆的点。在Linux虚拟机中,我们将安装的是Docker Engine(也称为Docker CE,社区版)。它是一个客户端-服务器架构的应用:

  • Docker守护进程 (dockerd):一个常驻后台的服务,负责管理容器、镜像、网络等。
  • Docker客户端 (docker):我们用来输入命令(如docker run,docker ps)的工具,它会通过本地套接字或网络与守护进程通信。

Docker Desktop是一个面向Windows和macOS的桌面应用程序,它内部封装了一个轻量级Linux虚拟机(在Windows上可能是WSL 2或Hyper-V VM),并在其中运行Docker Engine,同时提供了图形界面。在我们的方案中,我们是在自己创建的“重量级”Linux虚拟机里直接安装Docker Engine,逻辑更纯粹,更适合理解底层原理。

3. 实战第一步:创建Linux虚拟机

现在,我们开始真正的实操。请确保你的电脑已禁用Hyper-V(适用于Windows,步骤见后),并至少有8GB物理内存和20GB的可用磁盘空间。

3.1 获取并安装VMware Workstation Player

  1. 访问官网:搜索“VMware Workstation Player download”,进入VMware官网下载页面。选择适合你操作系统(Windows或Linux)的版本。对于个人非商业用途,免费版的Player已足够。
  2. 安装:运行下载的安装程序。安装过程基本是“下一步”到底,但需要注意:
    • 在“自定义安装”步骤中,建议保持默认路径。可以取消勾选“启动时检查产品更新”以加快启动速度。
    • 在Windows上,安装程序可能会提示你“禁用Hyper-V”。请务必同意并让安装程序完成相关配置。安装完成后可能需要重启电脑。
  3. 验证安装:重启后,打开VMware Workstation Player。如果看到主界面,说明安装成功。

3.2 下载Ubuntu Server镜像

  1. 访问Ubuntu官网:搜索“Ubuntu download”,进入Ubuntu官方下载页面。
  2. 选择版本:找到“Ubuntu Server”版块,选择最新的LTS版本(如Ubuntu 22.04 LTS)。点击下载,你会得到一个后缀为.iso的文件(例如ubuntu-22.04.3-live-server-amd64.iso)。这就是我们的系统安装光盘镜像。

3.3 在VMware中创建新虚拟机

这是最关键的一步,参数设置直接影响虚拟机性能。

  1. 新建虚拟机:在VMware Player主界面,点击“创建新虚拟机”。
  2. 选择安装来源:选择“安装程序光盘映像文件(iso)(M)”,然后点击“浏览”,找到你刚才下载的Ubuntu Server.iso文件。VMware检测到是Ubuntu后,会自动选择“Linux”和“Ubuntu 64位”版本。
  3. 命名与位置:给你的虚拟机起个名字,比如MyUbuntuDocker。选择虚拟机文件的存储位置,请确保目标磁盘有充足空间(建议至少40GB)
  4. 指定磁盘容量:最大磁盘大小建议设为20GB或以上。选择“将虚拟磁盘拆分成多个文件”,这样便于迁移和备份。
  5. 自定义硬件(关键!):在点击“完成”前,强烈建议点击“自定义硬件”。
    • 内存:分配给虚拟机的内存。如果你的主机有16GB内存,分配4GB(4096 MB)是合理的起点。如果只有8GB,分配2GB(2048 MB)也能运行,但运行多个容器时会比较吃力。
    • 处理器:分配CPU核心数。如果你的CPU有4个物理核心8个线程,可以分配2个核心。这能保证虚拟机有较好的计算性能。
    • 网络适配器:这是网络配置的关键。默认是“NAT模式”。我解释一下两种常用模式:
      • NAT模式:虚拟机共享主机的IP地址上网。外部网络无法直接访问虚拟机,但虚拟机可以访问外部网络。这是最安全、最简单的默认选择,适合大多数开发场景。
      • 桥接模式:虚拟机会在主机所在的物理网络中像一个独立的设备一样,获取一个和主机同网段的IP地址。局域网内其他机器可以直接访问该虚拟机。如果你需要从宿主机以外的机器访问虚拟机中的服务(比如测试一个Web应用),就需要用桥接模式。新手建议先使用NAT模式
    • 其他:USB控制器、声卡、打印机等如果不需要可以移除,以简化配置。
  6. 完成创建:点击“关闭”然后“完成”。你的虚拟机就创建好了,它会出现在VMware的库列表中。

4. 实战第二步:安装Ubuntu Server系统

现在,我们启动虚拟机并安装操作系统。

  1. 启动虚拟机:在库中选中你的虚拟机,点击“播放虚拟机”。虚拟机会从你加载的.iso镜像启动。
  2. 语言选择:启动后进入Ubuntu Server安装界面,选择语言(如English)。
  3. 键盘布局:选择键盘布局(如US English)。
  4. 网络连接:安装程序会自动尝试配置网络。在NAT模式下,它通常能通过主机的网络直接获取IP地址(DHCP)。这里保持默认即可。
  5. 配置代理:如果没有特殊需求(比如公司内网需要代理才能上网),这里直接留空,回车继续。
  6. 镜像地址:用于下载系统更新和软件的源地址。默认使用Ubuntu官方镜像即可,回车继续。
  7. 磁盘分区:这是安装Linux的一个重要步骤。对于新手和学习环境,强烈建议选择“Use an entire disk”并选择你的虚拟磁盘(如20GB的那个),然后下面有一个选项是“Set up this disk as an LVM group”,可以勾选上。LVM(逻辑卷管理)可以让你在未来更灵活地调整磁盘空间。这是一个“傻瓜式”但安全的选择,安装程序会自动为你创建 boot、swap 和根分区。
  8. 确认磁盘更改:系统会提示你将要对磁盘进行的更改,确认无误后选择“Continue”并输入“yes”确认。
  9. 用户设置
    • 输入你的姓名(如docker-user)。
    • 输入服务器名(即主机名,如ubuntu-docker)。
    • 输入一个强密码(需要输入两次)。记住这个密码,这是你后续登录和进行sudo操作(管理员权限)的凭证。
    • 是否安装OpenSSH server?强烈建议勾选“Install OpenSSH server”。这样安装完成后,你就可以通过宿主机上的SSH客户端(如Windows的PowerShell或Terminal,macOS的终端)远程连接虚拟机,无需在VMware窗口里操作,更加方便。
  10. 选择预装软件:在“Featured Server Snaps”界面,直接按回车跳过,不要选择任何Snap包。我们后续会通过更通用的方式安装所需软件。
  11. 等待安装:系统开始复制文件并安装基础系统,这个过程需要几分钟。
  12. 安装完成:安装结束后,会提示“Install complete!”。选择“Reboot Now”重启。重启时,VMware可能会提示“Please remove the installation medium and press ENTER”,此时你需要点击VMware菜单栏的“虚拟机” -> “可移动设备” -> “CD/DVD (SATA)” -> “断开连接”,然后按虚拟机内的回车键。
  13. 首次登录:重启后,你会看到文本登录界面。输入你创建的用户名和密码登录。看到命令行提示符(如docker-user@ubuntu-docker:~$),恭喜你,Ubuntu Server系统安装成功!

5. 实战第三步:在虚拟机中安装Docker Engine

现在,我们进入了虚拟机的命令行世界。以下所有操作都在虚拟机的终端中进行。

5.1 系统更新与准备

首先,更新系统软件包列表并升级现有软件,这是一个好习惯。

sudo apt update sudo apt upgrade -y

sudo命令让你以管理员权限执行操作,系统会要求输入你的用户密码。-y参数表示自动确认所有提示。

5.2 安装Docker的必备依赖包

Docker需要一些基础工具来管理仓库和传输数据。

sudo apt install -y ca-certificates curl gnupg lsb-release

5.3 添加Docker官方GPG密钥和软件源

这是为了确保我们从Docker官方源下载的软件包是真实且未被篡改的。

  1. 创建密钥环目录
    sudo mkdir -p /etc/apt/keyrings
  2. 下载并导入Docker的GPG公钥
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  3. 设置Docker的APT软件源
    echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    这条命令会根据你当前系统的架构(如amd64)和Ubuntu版本代号(如jammy for 22.04),自动生成正确的源地址配置。

5.4 安装Docker Engine

现在可以安装Docker了。

  1. 再次更新软件包列表(因为刚刚添加了新的源):
    sudo apt update
  2. 安装Docker Engine、命令行工具CLI以及容器运行时containerd
    sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
    这里安装了核心的Docker引擎、客户端、容器运行时以及Docker Compose插件(一个用于定义和运行多容器应用的工具)。

5.5 验证安装并管理Docker服务

  1. 启动Docker服务并设置开机自启
    sudo systemctl start docker sudo systemctl enable docker
    systemctl是Linux系统管理服务的标准工具。
  2. 验证Docker是否运行
    sudo systemctl status docker
    你应该看到输出显示active (running)并且是enabled
  3. 运行一个测试容器
    sudo docker run hello-world
    这个命令会从Docker Hub拉取一个极小的测试镜像并运行它。如果一切正常,你会看到一段“Hello from Docker!”的欢迎信息,这证明你的Docker安装和运行完全成功。

5.6 (可选但重要)将当前用户加入docker组

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

sudo usermod -aG docker $USER

执行此命令后,你需要完全注销当前用户并重新登录(或者直接重启虚拟机),这个组权限变更才会生效。重启后,你可以直接运行docker ps来验证,如果不再要求输入密码,说明配置成功。

实操心得:很多新手在安装完Docker后,直接运行docker ps会遇到权限拒绝的错误,就是因为忽略了这一步。记住,修改用户组后必须重新登录会话。

6. 网络与宿主机访问配置

现在Docker已经在虚拟机里跑起来了,但你可能还想从宿主机(你的Windows或Mac)访问虚拟机里的服务(比如一个运行在容器里的网站)。这就需要配置网络。

6.1 理解虚拟机的网络模式

我们之前创建虚拟机时选择了NAT模式。在这种模式下:

  • 虚拟机可以访问外网。
  • 宿主机可以访问虚拟机(通过虚拟网络)。
  • 但默认情况下,虚拟机内的服务端口(如80,8080)并没有直接映射到宿主机。

6.2 配置端口转发(NAT模式下)

VMware的NAT模式支持端口转发。例如,你想把虚拟机里Docker容器暴露的8080端口,映射到宿主机的8080端口。

  1. 首先,关闭你的Ubuntu虚拟机。
  2. 在VMware Player库中,右键点击你的虚拟机,选择“设置”。
  3. 在“硬件”选项卡中,选择“网络适配器”,确保连接方式是“NAT模式”。
  4. 点击右下角的“NAT设置...”按钮。
  5. 在弹出的窗口中,点击“添加”。
    • 主机端口:填写宿主机上你想使用的端口,例如8080
    • 类型:TCP。
    • 虚拟机IP地址:你需要知道虚拟机的IP地址。可以先启动虚拟机,然后运行ip addr show命令,找到ens33或类似网卡下的inet地址(如192.168.xxx.xxx)。假设是192.168.1.100
    • 虚拟机端口:填写虚拟机内服务监听的端口,例如8080
  6. 保存所有设置并启动虚拟机。

现在,你在宿主机浏览器访问http://localhost:8080,流量就会被转发到虚拟机的192.168.1.100:8080

6.3 使用桥接模式(替代方案)

如果你觉得端口转发麻烦,或者需要虚拟机像一个独立设备一样存在于局域网,可以在虚拟机设置中将网络适配器改为“桥接模式”。重启虚拟机后,虚拟机会从你的家庭路由器获取一个和宿主机同网段的IP(如192.168.31.xxx)。这样,宿主机和其他局域网设备都可以直接用这个IP访问虚拟机。

注意事项:在办公室或公共网络中使用桥接模式需谨慎,因为它将你的虚拟机直接暴露在局域网中。NAT模式是更安全、更简单的默认选择。

7. 常见问题与排查技巧实录

即使按照步骤操作,你也可能会遇到一些问题。这里记录了几个最常见的问题和解决方法。

7.1 虚拟机启动报错:“VMware Workstation cannot connect to the virtual machine”

  • 可能原因:后台进程冲突或虚拟机文件损坏。
  • 排查步骤
    1. 完全关闭VMware Workstation Player。
    2. 打开任务管理器(Windows),结束所有vmware-开头的进程。
    3. 找到你的虚拟机存储目录(通常在你的文档或指定位置),除了.vmx.vmdk文件,可以尝试删除后缀为.lck的文件夹或文件(这是锁文件)。
    4. 重新启动VMware并打开虚拟机。

7.2 安装Docker时apt update报错:GPG error或NO_PUBKEY

  • 可能原因:添加Docker源时GPG密钥验证失败或密钥过期。
  • 解决方法
    # 重新下载并导入密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 再次更新 sudo apt update
    如果还不行,可以尝试临时忽略签名检查(仅用于测试,不推荐生产环境):
    sudo apt update --allow-insecure-repositories

7.3 运行docker run命令时速度极慢或卡在“Pulling from library/...”

  • 可能原因:默认的Docker Hub镜像服务器在国外,国内访问速度慢。
  • 解决方法:配置国内镜像加速器。编辑或创建Docker守护进程的配置文件:
    sudo nano /etc/docker/daemon.json
    输入以下内容(以阿里云镜像加速器为例,你需要去阿里云容器镜像服务控制台获取专属加速器地址):
    { "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"] }
    保存退出后,重启Docker服务使配置生效:
    sudo systemctl restart docker

7.4 虚拟机内可以ping通外网,但宿主机无法ping通虚拟机

  • 可能原因(NAT模式):这是NAT模式的正常现象。默认情况下,NAT模式不允许从外部(包括宿主机)主动发起对虚拟机的ICMP(ping)请求。但TCP/UDP连接可以通过我们前面设置的端口转发来建立。
  • 验证方法:在虚拟机内启动一个简单的Web服务,比如docker run -d -p 80:80 nginx,然后在宿主机浏览器访问http://[虚拟机IP]:80。如果能访问,说明网络是通的,只是ICMP被禁了。

7.5 Docker命令提示“Cannot connect to the Docker daemon”

  • 可能原因:Docker服务没有运行,或者当前用户没有docker组的权限。
  • 排查步骤
    1. 检查Docker服务状态:sudo systemctl status docker。如果没运行,启动它:sudo systemctl start docker
    2. 如果服务是运行的,检查当前用户是否在docker组:groups $USER。如果输出中没有docker,请参考5.6节添加用户到组,并重新登录
    3. 检查Docker套接字文件权限:ls -l /var/run/docker.sock。所有者应为root:docker

8. 进阶配置与日常使用建议

环境搭好了,最后分享几个让这个环境更好用的配置和小技巧。

8.1 配置SSH密钥登录(免密码)

每次登录虚拟机都要输密码很麻烦。我们可以配置SSH密钥对,实现免密登录。

  1. 在宿主机生成密钥对(如果还没有):
    • Windows (PowerShell或Git Bash):ssh-keygen -t rsa -b 4096
    • macOS/Linux: 命令相同。 一路回车,使用默认路径(~/.ssh/id_rsa)。
  2. 将公钥复制到虚拟机
    # 在宿主机执行,将 [虚拟机IP] 替换为你的虚拟机IP ssh-copy-id docker-user@[虚拟机IP]
    输入一次虚拟机密码。
  3. 测试免密登录
    ssh docker-user@[虚拟机IP]
    现在你应该可以直接登录,无需密码。

8.2 安装常用工具

一个干净的Server系统缺少一些常用工具,可以按需安装:

# 网络诊断工具 sudo apt install -y net-tools iputils-ping traceroute # 文本编辑器 (vim 或 nano) sudo apt install -y vim # 查看进程和系统状态的工具 sudo apt install -y htop

8.3 管理虚拟机状态

  • 挂起 vs 关机:VMware提供了“挂起”功能。这相当于让虚拟机进入休眠状态,下次启动速度极快,并且会完全恢复到挂起时的状态(包括运行中的程序)。适合短期离开。而“关机”则是完全关闭虚拟机操作系统,下次是冷启动。
  • 创建快照:在进行任何重大变更(如安装新软件、修改核心配置)之前,可以在VMware中为虚拟机创建一个“快照”。这是一个系统状态的完整备份点。如果后续操作搞砸了,可以一键回滚到这个快照点,这是虚拟机带来的巨大便利。

8.4 Docker初体验:运行你的第一个真实服务

让我们用Docker运行一个比hello-world更实用的服务,比如一个Redis数据库:

# 拉取Redis最新镜像 docker pull redis # 以后台模式运行一个名为“my-redis”的Redis容器,并映射端口6379 docker run -d --name my-redis -p 6379:6379 redis # 查看运行中的容器 docker ps # 进入容器内部执行命令 docker exec -it my-redis redis-cli # 在redis-cli里可以测试,输入 `ping`,会返回 `PONG`

通过这个简单的例子,你就能体会到Docker的便捷:无需在宿主机(这里是你的Ubuntu虚拟机)上安装任何Redis的依赖,一个命令就获得了一个完全隔离、可随时销毁和重建的数据库服务。