从零搭建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(个人免费版)给新手,原因如下:
- 性能与稳定性:VMware的虚拟化驱动和硬件兼容性经过长期打磨,在大多数硬件上表现稳定,特别是对于显卡、USB设备和网络适配器的直通或模拟,很少出现奇怪的问题。相比之下,VirtualBox虽然免费开源,但在某些特定主机硬件(尤其是较新的笔记本)上,可能会遇到性能瓶颈或偶尔的卡死。
- 用户体验:VMware的安装过程、虚拟机创建向导和用户界面对新用户更为友好。它的“简易安装”功能可以大幅简化Linux系统的安装过程。网络配置方面,其提供的“NAT”和“桥接”模式概念清晰,易于理解和管理。
- 与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)。理由很直接:
- 广泛的社区支持与文档:Ubuntu拥有最庞大的用户社区。你遇到的几乎任何问题,都能在Ask Ubuntu、Stack Overflow或无数博客中找到答案。这对于新手排错至关重要。
- 对Docker的友好性:Docker官方对Ubuntu的支持非常完善。安装文档清晰,软件源更新及时。许多云服务商和开源项目的默认或推荐环境也是Ubuntu。
- LTS版本:LTS代表长期支持,每个LTS版本提供5年的安全更新和维护。这保证了你的学习环境在相当长一段时间内是稳定且安全的,无需频繁升级系统内核导致环境变化。
- 资源消耗相对较低:相比于带图形界面的桌面版,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
- 访问官网:搜索“VMware Workstation Player download”,进入VMware官网下载页面。选择适合你操作系统(Windows或Linux)的版本。对于个人非商业用途,免费版的Player已足够。
- 安装:运行下载的安装程序。安装过程基本是“下一步”到底,但需要注意:
- 在“自定义安装”步骤中,建议保持默认路径。可以取消勾选“启动时检查产品更新”以加快启动速度。
- 在Windows上,安装程序可能会提示你“禁用Hyper-V”。请务必同意并让安装程序完成相关配置。安装完成后可能需要重启电脑。
- 验证安装:重启后,打开VMware Workstation Player。如果看到主界面,说明安装成功。
3.2 下载Ubuntu Server镜像
- 访问Ubuntu官网:搜索“Ubuntu download”,进入Ubuntu官方下载页面。
- 选择版本:找到“Ubuntu Server”版块,选择最新的LTS版本(如Ubuntu 22.04 LTS)。点击下载,你会得到一个后缀为
.iso的文件(例如ubuntu-22.04.3-live-server-amd64.iso)。这就是我们的系统安装光盘镜像。
3.3 在VMware中创建新虚拟机
这是最关键的一步,参数设置直接影响虚拟机性能。
- 新建虚拟机:在VMware Player主界面,点击“创建新虚拟机”。
- 选择安装来源:选择“安装程序光盘映像文件(iso)(M)”,然后点击“浏览”,找到你刚才下载的Ubuntu Server
.iso文件。VMware检测到是Ubuntu后,会自动选择“Linux”和“Ubuntu 64位”版本。 - 命名与位置:给你的虚拟机起个名字,比如
MyUbuntuDocker。选择虚拟机文件的存储位置,请确保目标磁盘有充足空间(建议至少40GB)。 - 指定磁盘容量:最大磁盘大小建议设为20GB或以上。选择“将虚拟磁盘拆分成多个文件”,这样便于迁移和备份。
- 自定义硬件(关键!):在点击“完成”前,强烈建议点击“自定义硬件”。
- 内存:分配给虚拟机的内存。如果你的主机有16GB内存,分配4GB(4096 MB)是合理的起点。如果只有8GB,分配2GB(2048 MB)也能运行,但运行多个容器时会比较吃力。
- 处理器:分配CPU核心数。如果你的CPU有4个物理核心8个线程,可以分配2个核心。这能保证虚拟机有较好的计算性能。
- 网络适配器:这是网络配置的关键。默认是“NAT模式”。我解释一下两种常用模式:
- NAT模式:虚拟机共享主机的IP地址上网。外部网络无法直接访问虚拟机,但虚拟机可以访问外部网络。这是最安全、最简单的默认选择,适合大多数开发场景。
- 桥接模式:虚拟机会在主机所在的物理网络中像一个独立的设备一样,获取一个和主机同网段的IP地址。局域网内其他机器可以直接访问该虚拟机。如果你需要从宿主机以外的机器访问虚拟机中的服务(比如测试一个Web应用),就需要用桥接模式。新手建议先使用NAT模式。
- 其他:USB控制器、声卡、打印机等如果不需要可以移除,以简化配置。
- 完成创建:点击“关闭”然后“完成”。你的虚拟机就创建好了,它会出现在VMware的库列表中。
4. 实战第二步:安装Ubuntu Server系统
现在,我们启动虚拟机并安装操作系统。
- 启动虚拟机:在库中选中你的虚拟机,点击“播放虚拟机”。虚拟机会从你加载的
.iso镜像启动。 - 语言选择:启动后进入Ubuntu Server安装界面,选择语言(如English)。
- 键盘布局:选择键盘布局(如US English)。
- 网络连接:安装程序会自动尝试配置网络。在NAT模式下,它通常能通过主机的网络直接获取IP地址(DHCP)。这里保持默认即可。
- 配置代理:如果没有特殊需求(比如公司内网需要代理才能上网),这里直接留空,回车继续。
- 镜像地址:用于下载系统更新和软件的源地址。默认使用Ubuntu官方镜像即可,回车继续。
- 磁盘分区:这是安装Linux的一个重要步骤。对于新手和学习环境,强烈建议选择“Use an entire disk”并选择你的虚拟磁盘(如20GB的那个),然后下面有一个选项是“Set up this disk as an LVM group”,可以勾选上。LVM(逻辑卷管理)可以让你在未来更灵活地调整磁盘空间。这是一个“傻瓜式”但安全的选择,安装程序会自动为你创建 boot、swap 和根分区。
- 确认磁盘更改:系统会提示你将要对磁盘进行的更改,确认无误后选择“Continue”并输入“yes”确认。
- 用户设置:
- 输入你的姓名(如
docker-user)。 - 输入服务器名(即主机名,如
ubuntu-docker)。 - 输入一个强密码(需要输入两次)。记住这个密码,这是你后续登录和进行
sudo操作(管理员权限)的凭证。 - 是否安装OpenSSH server?强烈建议勾选“Install OpenSSH server”。这样安装完成后,你就可以通过宿主机上的SSH客户端(如Windows的PowerShell或Terminal,macOS的终端)远程连接虚拟机,无需在VMware窗口里操作,更加方便。
- 输入你的姓名(如
- 选择预装软件:在“Featured Server Snaps”界面,直接按回车跳过,不要选择任何Snap包。我们后续会通过更通用的方式安装所需软件。
- 等待安装:系统开始复制文件并安装基础系统,这个过程需要几分钟。
- 安装完成:安装结束后,会提示“Install complete!”。选择“Reboot Now”重启。重启时,VMware可能会提示“Please remove the installation medium and press ENTER”,此时你需要点击VMware菜单栏的“虚拟机” -> “可移动设备” -> “CD/DVD (SATA)” -> “断开连接”,然后按虚拟机内的回车键。
- 首次登录:重启后,你会看到文本登录界面。输入你创建的用户名和密码登录。看到命令行提示符(如
docker-user@ubuntu-docker:~$),恭喜你,Ubuntu Server系统安装成功!
5. 实战第三步:在虚拟机中安装Docker Engine
现在,我们进入了虚拟机的命令行世界。以下所有操作都在虚拟机的终端中进行。
5.1 系统更新与准备
首先,更新系统软件包列表并升级现有软件,这是一个好习惯。
sudo apt update sudo apt upgrade -ysudo命令让你以管理员权限执行操作,系统会要求输入你的用户密码。-y参数表示自动确认所有提示。
5.2 安装Docker的必备依赖包
Docker需要一些基础工具来管理仓库和传输数据。
sudo apt install -y ca-certificates curl gnupg lsb-release5.3 添加Docker官方GPG密钥和软件源
这是为了确保我们从Docker官方源下载的软件包是真实且未被篡改的。
- 创建密钥环目录:
sudo mkdir -p /etc/apt/keyrings - 下载并导入Docker的GPG公钥:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg - 设置Docker的APT软件源:
这条命令会根据你当前系统的架构(如amd64)和Ubuntu版本代号(如jammy for 22.04),自动生成正确的源地址配置。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
5.4 安装Docker Engine
现在可以安装Docker了。
- 再次更新软件包列表(因为刚刚添加了新的源):
sudo apt update - 安装Docker Engine、命令行工具CLI以及容器运行时containerd:
这里安装了核心的Docker引擎、客户端、容器运行时以及Docker Compose插件(一个用于定义和运行多容器应用的工具)。sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
5.5 验证安装并管理Docker服务
- 启动Docker服务并设置开机自启:
sudo systemctl start docker sudo systemctl enable dockersystemctl是Linux系统管理服务的标准工具。 - 验证Docker是否运行:
你应该看到输出显示sudo systemctl status dockeractive (running)并且是enabled。 - 运行一个测试容器:
这个命令会从Docker Hub拉取一个极小的测试镜像并运行它。如果一切正常,你会看到一段“Hello from Docker!”的欢迎信息,这证明你的Docker安装和运行完全成功。sudo docker run hello-world
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端口。
- 首先,关闭你的Ubuntu虚拟机。
- 在VMware Player库中,右键点击你的虚拟机,选择“设置”。
- 在“硬件”选项卡中,选择“网络适配器”,确保连接方式是“NAT模式”。
- 点击右下角的“NAT设置...”按钮。
- 在弹出的窗口中,点击“添加”。
- 主机端口:填写宿主机上你想使用的端口,例如
8080。 - 类型:TCP。
- 虚拟机IP地址:你需要知道虚拟机的IP地址。可以先启动虚拟机,然后运行
ip addr show命令,找到ens33或类似网卡下的inet地址(如192.168.xxx.xxx)。假设是192.168.1.100。 - 虚拟机端口:填写虚拟机内服务监听的端口,例如
8080。
- 主机端口:填写宿主机上你想使用的端口,例如
- 保存所有设置并启动虚拟机。
现在,你在宿主机浏览器访问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”
- 可能原因:后台进程冲突或虚拟机文件损坏。
- 排查步骤:
- 完全关闭VMware Workstation Player。
- 打开任务管理器(Windows),结束所有
vmware-开头的进程。 - 找到你的虚拟机存储目录(通常在你的文档或指定位置),除了
.vmx和.vmdk文件,可以尝试删除后缀为.lck的文件夹或文件(这是锁文件)。 - 重新启动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 updatesudo apt update --allow-insecure-repositories
7.3 运行docker run命令时速度极慢或卡在“Pulling from library/...”
- 可能原因:默认的Docker Hub镜像服务器在国外,国内访问速度慢。
- 解决方法:配置国内镜像加速器。编辑或创建Docker守护进程的配置文件:
输入以下内容(以阿里云镜像加速器为例,你需要去阿里云容器镜像服务控制台获取专属加速器地址):sudo nano /etc/docker/daemon.json
保存退出后,重启Docker服务使配置生效:{ "registry-mirrors": ["https://your-mirror.mirror.aliyuncs.com"] }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组的权限。 - 排查步骤:
- 检查Docker服务状态:
sudo systemctl status docker。如果没运行,启动它:sudo systemctl start docker。 - 如果服务是运行的,检查当前用户是否在
docker组:groups $USER。如果输出中没有docker,请参考5.6节添加用户到组,并重新登录。 - 检查Docker套接字文件权限:
ls -l /var/run/docker.sock。所有者应为root:docker。
- 检查Docker服务状态:
8. 进阶配置与日常使用建议
环境搭好了,最后分享几个让这个环境更好用的配置和小技巧。
8.1 配置SSH密钥登录(免密码)
每次登录虚拟机都要输密码很麻烦。我们可以配置SSH密钥对,实现免密登录。
- 在宿主机生成密钥对(如果还没有):
- Windows (PowerShell或Git Bash):
ssh-keygen -t rsa -b 4096 - macOS/Linux: 命令相同。 一路回车,使用默认路径(
~/.ssh/id_rsa)。
- Windows (PowerShell或Git Bash):
- 将公钥复制到虚拟机:
输入一次虚拟机密码。# 在宿主机执行,将 [虚拟机IP] 替换为你的虚拟机IP ssh-copy-id docker-user@[虚拟机IP] - 测试免密登录:
现在你应该可以直接登录,无需密码。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 htop8.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的依赖,一个命令就获得了一个完全隔离、可随时销毁和重建的数据库服务。