Windows Docker 安装配置全攻略:从 WSL2 原理到实战避坑指南
1. 项目概述:为什么要在Windows上折腾Docker?
如果你是一名在Windows环境下工作的开发者、运维或者技术爱好者,最近可能频繁听到“Docker”这个词。它就像一个魔法盒,能把你的应用和它运行所需的一切环境(代码、运行时、系统工具、系统库、设置)打包成一个标准化的单元。这个单元就是容器。简单来说,Docker让你能在自己的Windows电脑上,轻松运行一个独立的、隔离的Linux环境,而无需安装一个完整的虚拟机,从而极大地简化了开发、测试和部署的流程。
想象一下这个场景:你正在开发一个基于Python Flask的Web应用,它依赖特定版本的Redis和PostgreSQL。你的同事用Mac,另一个用Ubuntu,而你在Windows。如果没有Docker,你们可能会在“在我机器上好好的”这个经典问题上耗费大量时间。有了Docker,你只需要一个定义了所有依赖的Dockerfile和一个编排服务的docker-compose.yml文件。任何人拿到这些文件,无论是什么操作系统,一条docker-compose up命令就能启动一个和你本地一模一样的环境。这就是Docker的核心价值:环境一致性和快速交付。
那么,为什么在Windows上安装Docker会成为一个“项目”呢?因为Windows本身并不是一个原生的容器运行环境。Docker的核心技术依赖于Linux内核的命名空间和控制组(cgroups)来实现隔离。为了让Docker能在Windows上运行,我们需要一个“桥梁”。这个桥梁就是WSL 2(Windows Subsystem for Linux 2)或Hyper-V。理解这两者的区别和选择,是成功在Windows上使用Docker的第一步,也是我们接下来要深入探讨的核心。
2. 核心原理与架构选择:WSL 2 vs Hyper-V
在Windows上运行Docker,本质上是在运行Linux容器。因此,我们需要一个Linux内核。Docker Desktop for Windows提供了两种后端架构模式,理解它们的原理和优劣,能帮你做出最适合自己场景的选择。
2.1 WSL 2 集成模式:现代开发者的首选
WSL 2是微软近年来在开发者体验上做的最重要的改进之一。它是一个在Windows内部运行的、完整的Linux内核(通过轻量级虚拟化技术实现),与Windows深度集成。
工作原理:当你选择WSL 2后端时,Docker Desktop会将其核心组件(Docker守护进程dockerd)直接安装在WSL 2的Linux发行版(比如Ubuntu)中。你的Windows文件系统(如C:\Users\YourName)会被自动挂载到WSL 2的Linux环境中(路径类似/mnt/c/Users/YourName)。这意味着,你既可以在Windows的PowerShell或CMD中使用docker命令(Docker CLI客户端会通过一个套接字自动转发到WSL 2中的守护进程),也可以直接在WSL 2的终端里使用docker命令。文件操作是双向透明且高性能的。
优势:
- 启动速度极快:相比于完整的虚拟机,WSL 2的启动几乎是瞬时的。
- 资源占用低:与Windows共享内存,动态分配,更节省资源。
- 文件系统性能卓越:对于在
/mnt/c下的Windows文件,微软做了大量优化;对于WSL 2内部的文件系统(/home等),则是原生Linux性能,非常适合项目代码放在WSL 2内部的情况。 - 无缝的终端体验:你可以使用Windows Terminal,同时打开PowerShell、CMD和多个WSL 2发行版的标签页,开发体验非常流畅。
适用场景:绝大多数现代软件开发场景,尤其是你的项目代码主要存放在Windows盘符(如C盘)或计划在WSL 2内部进行开发的情况。这也是Docker官方目前推荐和默认的模式。
2.2 Hyper-V 模式:传统与兼容性之选
Hyper-V是微软内置的、功能完整的Type-1虚拟机管理程序。在此模式下,Docker Desktop会创建一个轻量级的Linux虚拟机(MobyLinuxVM),所有的Docker容器都运行在这个虚拟机内部。
工作原理:Docker CLI在Windows上运行,通过网络与Hyper-V虚拟机内的Docker守护进程通信。文件共享需要通过配置的共享驱动器(如C盘、D盘)来实现,这些驱动器会被以SMB或9p协议的方式挂载到虚拟机中。
优势:
- 更强的隔离性:作为一个完整的虚拟机,与主机系统隔离更彻底。
- 兼容旧版Windows:对于无法升级到WSL 2所需版本(Windows 10 2004及以上)的旧系统,这是唯一的选择。
- 某些特定网络场景:在某些复杂的公司网络策略下,Hyper-V的网络配置可能更灵活。
劣势:
- 启动慢:需要启动整个虚拟机。
- 资源占用相对固定:需要预先分配固定的内存和CPU核心给虚拟机。
- 文件I/O性能较差:通过网络共享访问Windows文件,速度明显慢于WSL 2模式,尤其是在大量小文件操作时。
适用场景:Windows版本较旧(如Windows 10 1909或更早),或公司IT策略强制要求/仅支持Hyper-V环境。
我的选择建议:如果你的系统是Windows 10 2004(Build 19041)或更高版本,或者Windows 11,毫不犹豫地选择WSL 2后端。它将为你带来最接近原生Linux的开发体验。接下来的安装和配置,也将以WSL 2模式为主线进行。
3. 步步为营:Windows Docker 完整安装与配置指南
纸上得来终觉浅,绝知此事要躬行。下面我们进入实战环节,我会带你一步步完成安装,并解释每一个步骤背后的意图。
3.1 安装前系统检查与准备
在下载安装包之前,我们必须确保系统满足最低要求,并开启必要的功能。很多安装失败的问题都源于这一步的疏忽。
1. 系统版本确认按下Win + R,输入winver,查看你的Windows版本。
- 最低要求:对于WSL 2,必须是Windows 10 版本 2004(内部版本 19041)或更高,或者Windows 11。
- 对于Hyper-V模式:需要Windows 10 专业版、企业版或教育版(家庭版不支持Hyper-V)。如果是家庭版又想用Hyper-V,需要额外步骤解锁,但强烈建议升级系统或使用WSL 2。
2. 开启虚拟化这是最关键的一步,无论是WSL 2还是Hyper-V都需要CPU硬件虚拟化支持。
- 进入BIOS/UEFI:重启电脑,在开机时按特定键(通常是F2、F10、Del、Esc,因品牌而异)进入BIOS设置。
- 找到虚拟化选项:在BIOS中寻找类似
Intel Virtualization Technology (VT-x)、AMD-V、SVM Mode或Virtualization的选项,将其设置为Enabled。 - 在Windows中确认:重启进入Windows后,打开任务管理器(
Ctrl+Shift+Esc),切换到“性能”标签页,查看CPU信息,确认“虚拟化”已启用。
3. 启用“Windows 虚拟机监控程序平台”和“Windows Subsystem for Linux”这是为WSL 2做准备。
- 以管理员身份打开 PowerShell 或 Windows Terminal。
- 依次执行以下两条命令:
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart - 执行完成后,重启计算机。这个重启非常重要,否则后续步骤可能出错。
3.2 安装与配置 WSL 2
重启后,我们继续配置WSL。
1. 设置 WSL 2 为默认版本打开 PowerShell,运行:
wsl --set-default-version 2这个命令告诉系统,以后新安装的WSL发行版都默认使用第2版。
2. 安装一个 Linux 发行版你可以从微软商店安装,比如Ubuntu。打开 Microsoft Store,搜索 “Ubuntu”,选择最新的LTS版本(如Ubuntu 22.04 LTS)安装即可。安装后,从开始菜单启动它,它会完成初始设置,让你创建Linux用户名和密码。
3. 验证 WSL 版本安装好发行版后,在PowerShell中运行:
wsl -l -v你应该能看到类似下面的输出,确认你的发行版后面显示的是2。
NAME STATE VERSION * Ubuntu-22.04 Running 23.3 安装 Docker Desktop for Windows
现在,主角可以登场了。
1. 下载安装包访问 Docker 官网的 Docker Desktop for Windows 下载页面。它会自动检测你的系统是Intel/AMD还是ARM,下载对应的稳定版安装包。
2. 运行安装程序双击下载好的Docker Desktop Installer.exe。安装过程基本是“下一步”到底,但请注意:
- 安装过程中,安装程序会询问你是否使用WSL 2而不是Hyper-V。确保勾选这个选项。
- 安装完成后,它会提示需要重启。再次重启电脑。
3. 首次启动与配置重启后,从开始菜单找到“Docker Desktop”并运行。第一次启动可能需要几分钟,因为它会进行初始化设置,包括在WSL 2中安装Docker引擎。
- 你会看到Docker的鲸鱼图标出现在任务栏通知区域。
- 可能会弹出权限请求,询问是否同意Docker使用网络等,点击同意。
3.4 关键配置调优
安装成功只是开始,合理的配置能让后续使用事半功倍。右键点击任务栏的Docker图标,选择 “Settings”。
1. 资源分配(Settings -> Resources)
- WSL Integration:确保你安装的WSL发行版(如Ubuntu-22.04)后面的开关是打开的。这允许该发行版直接与Docker守护进程通信。
- Advanced:在这里可以调整分配给Docker的CPU核心数、内存和交换空间。对于日常开发,建议内存至少设置为4GB(4096 MB)或更高,具体取决于你同时运行的容器数量和宿主机的总内存。CPU核心数可以给2-4个。
2. 镜像加速器(Settings -> Docker Engine)由于网络原因,从Docker Hub拉取镜像可能会非常慢。我们需要配置国内镜像加速器。在配置窗口(一个JSON编辑器)中,找到或添加registry-mirrors项。国内常用的加速器地址有:
{ "registry-mirrors": [ "https://docker.mirrors.ustc.edu.cn", "https://hub-mirror.c.163.com", "https://mirror.baidubce.com" ] }添加后点击“Apply & Restart”,Docker会重启并应用新配置。
3. 文件共享(Settings -> Resources -> File Sharing)如果你计划在WSL 2内部的Linux文件系统中进行开发(这是性能最好的方式),这一步通常不需要额外配置。但如果你坚持在Windows盘符(如C:\myproject)下开发,则需要确保该盘符在“File Sharing”列表中已被勾选共享。
重要心得:我强烈建议将你的项目代码放在WSL 2发行版的文件系统内,例如
~/projects/。这样能获得最佳的磁盘I/O性能,避免因跨系统文件访问带来的各种权限和性能问题。你可以通过\\wsl$\Ubuntu-22.04\home\yourname\projects这样的网络路径在Windows资源管理器中访问它们。
4. 从入门到熟练:Docker 核心使用实战
环境就绪,让我们通过几个经典场景,快速掌握Docker的核心操作。
4.1 验证安装与运行第一个容器
打开你的终端(可以是Windows Terminal中的PowerShell,也可以是WSL 2的Ubuntu终端),让我们运行经典的“Hello World”。
# 1. 验证Docker安装和版本 docker --version docker-compose --version # 检查Docker Compose,它通常随Docker Desktop一起安装 # 2. 运行一个测试容器 docker run hello-world如果一切正常,你会看到一串输出,最后以“Hello from Docker!”结束。这个命令做了什么呢?docker run命令会先在本地的镜像仓库中查找hello-world镜像,没找到就去配置的镜像仓库(默认是Docker Hub)拉取它,然后基于这个镜像创建并启动一个容器,执行容器内预设的指令(输出Hello World),最后容器退出。
4.2 镜像操作:拉取、查看、清理
镜像是容器的模板。我们以运行一个Nginx服务器为例。
# 1. 从仓库拉取镜像(如果不指定标签,默认拉取 latest) docker pull nginx:alpine # alpine是一个超小的Linux发行版,镜像体积很小 # 2. 查看本地已有的镜像 docker images # 或使用更强大的格式 docker image ls # 3. 基于镜像运行一个容器 # -d: 后台运行 # -p 8080:80: 将宿主机的8080端口映射到容器的80端口 # --name my-nginx: 给容器起个名字,方便管理 docker run -d -p 8080:80 --name my-nginx nginx:alpine # 4. 验证 # 打开浏览器,访问 http://localhost:8080,你应该能看到Nginx的欢迎页面。 # 5. 查看正在运行的容器 docker ps # 6. 停止容器 docker stop my-nginx # 7. 再次启动已停止的容器 docker start my-nginx # 8. 删除已停止的容器 docker rm my-nginx # 9. 删除不再使用的镜像(谨慎操作) # 先确保没有容器在使用它 docker rmi nginx:alpine # 10. 定期清理:删除所有已停止的容器、未被任何容器引用的网络、构建缓存等 docker system prune -f # 更彻底的清理(包括未使用的镜像) # docker system prune -a -f4.3 容器操作:生命周期与交互
容器是镜像的运行实例。我们需要掌握它的整个生命周期管理。
# 1. 运行一个交互式容器(以Ubuntu为例) # -it: -i 保持标准输入打开,-t 分配一个伪终端,合起来实现交互式操作 # --rm: 容器退出时自动删除,适合临时测试 # --name my-ubuntu: 命名 docker run -it --rm --name my-ubuntu ubuntu:22.04 /bin/bash # 现在你进入了容器的bash shell,可以执行任何命令,如 `ls`, `cat /etc/os-release` # 输入 `exit` 退出容器,容器会因`--rm`选项被自动删除。 # 2. 在运行中的容器内执行命令 # 假设我们有一个后台运行的Redis容器 docker run -d --name my-redis redis:alpine # 不进入容器内部,直接执行命令 docker exec my-redis redis-cli ping # 应返回 PONG # 进入容器内部的shell进行交互 docker exec -it my-redis /bin/sh # alpine镜像通常用sh,不是bash # 3. 查看容器日志 # 这对于调试应用非常重要 docker logs my-redis # 实时跟踪日志输出 docker logs -f my-redis # 4. 查看容器资源使用情况(类似top命令) docker stats # 5. 查看容器的详细信息(包括IP地址、挂载卷、启动命令等) docker inspect my-redis # 可以结合格式输出只查看特定信息,如IP地址 docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-redis4.4 数据持久化:卷(Volumes)与绑定挂载(Bind Mounts)
容器本身是无状态的,关闭后其内部产生的所有数据都会丢失。为了持久化数据(如数据库文件、应用日志、配置文件),我们需要使用卷或绑定挂载。
卷(Volume):由Docker管理,存储在宿主机的特定区域(Linux下通常是/var/lib/docker/volumes/),与容器的生命周期解耦。是持久化数据的最佳实践。
# 1. 创建一个卷 docker volume create my-data # 2. 运行容器并使用卷 # -v my-data:/data: 将卷`my-data`挂载到容器内的`/data`目录 docker run -d --name my-mysql -v my-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=secret mysql:8 # 3. 查看卷信息 docker volume ls docker volume inspect my-data # 4. 即使删除my-mysql容器,`my-data`卷及其数据依然存在,可以挂载给新的容器。绑定挂载(Bind Mount):将宿主机上的一个特定目录或文件直接挂载到容器中。常用于开发环境,实现宿主机代码与容器运行环境的实时同步。
# 假设你的项目在宿主机 /mnt/c/Users/YourName/myapp (WSL2路径) 或 C:\Users\YourName\myapp # 将其挂载到容器的 /app 目录 docker run -d -p 5000:5000 \ -v /mnt/c/Users/YourName/myapp:/app \ --name my-dev-app \ python:3.11-slim \ sh -c "cd /app && pip install -r requirements.txt && python app.py" # 现在,你在宿主机上修改代码,容器内的/app目录内容会实时同步,应用也会热重载(如果框架支持)。关键区别与选择:
- 卷:数据由Docker管理,更安全、便携,适合生产环境存储数据库文件等。
- 绑定挂载:直接链接宿主机目录,性能好,适合开发、调试,可以实时修改代码或配置文件。但将宿主机目录结构暴露给了容器。
4.5 网络互联:让容器彼此通信
默认情况下,每个容器都有自己的网络命名空间,相互隔离。Docker提供了几种网络模式。
# 1. 查看网络 docker network ls # 默认会有一个bridge、host、none网络。 # 2. 创建自定义桥接网络(推荐) # 自定义的桥接网络提供自动的DNS解析,容器之间可以通过容器名互相访问。 docker network create my-network # 3. 将容器连接到自定义网络 docker run -d --name web --network my-network nginx:alpine docker run -d --name app --network my-network my-python-app # 现在,在`app`容器内部,可以直接通过 `ping web` 或 `http://web` 来访问`web`容器。 # 无需知道`web`容器的IP地址。 # 4. 端口映射(让外部访问) # 我们在之前已经用过 -p 参数,它将宿主机端口映射到容器端口。 # -p 8080:80 意味着访问宿主机的8080端口,流量会转发到容器的80端口。 # 可以映射多个端口:-p 8080:80 -p 8443:4435. 进阶实战:使用 Dockerfile 构建自定义镜像
拉取现成镜像很方便,但更多时候我们需要构建自己的应用镜像。Dockerfile是一个文本文件,包含了一系列构建镜像的指令。
让我们为一个简单的Python Flask应用创建镜像。
项目结构:
/myapp ├── app.py ├── requirements.txt └── Dockerfileapp.py:
from flask import Flask app = Flask(__name__) @app.route('/') def hello(): return "Hello from Dockerized Flask App!" if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)requirements.txt:
Flask==2.3.3Dockerfile:
# 1. 选择基础镜像。使用官方的、轻量的Python镜像。 FROM python:3.11-slim # 2. 设置工作目录。后续命令都会在这个目录下执行。 WORKDIR /app # 3. 复制依赖文件。先复制这个文件,可以利用Docker的构建缓存。 COPY requirements.txt . # 4. 安装依赖。在容器内运行命令。 RUN pip install --no-cache-dir -r requirements.txt # 5. 复制应用代码。注意 `.` 代表构建上下文(通常是Dockerfile所在目录)下的所有文件。 COPY . . # 6. 声明容器运行时监听的端口。这只是一个文档说明,实际映射需要在 `docker run` 时用 `-p` 指定。 EXPOSE 5000 # 7. 定义容器启动时执行的命令。 CMD ["python", "app.py"]构建与运行:
# 1. 进入项目目录 cd /mnt/c/Users/YourName/myapp # 2. 构建镜像。-t 参数给镜像打标签(名称:版本)。 docker build -t my-flask-app:1.0 . # 3. 查看构建的镜像 docker images | grep my-flask-app # 4. 运行容器 docker run -d -p 5000:5000 --name flask-container my-flask-app:1.0 # 5. 访问 http://localhost:50006. 组合服务:使用 Docker Compose 编排多容器应用
现实项目往往需要多个容器协同工作(如Web应用 + 数据库 + 缓存)。手动用docker run管理每个容器非常繁琐。Docker Compose通过一个YAML文件来定义和运行多容器应用。
假设我们有一个Web应用(上面的Flask)和一个Redis缓存。
创建docker-compose.yml:
version: '3.8' # 指定Compose文件格式版本 services: # 定义所有服务 web: build: . # 使用当前目录下的Dockerfile构建镜像 ports: - "5000:5000" environment: # 设置环境变量,在app.py中可以通过 os.environ.get('REDIS_HOST') 读取 REDIS_HOST: redis depends_on: # 声明依赖,先启动redis服务 - redis # volumes: # 开发时可以使用绑定挂载实现代码热更新 # - .:/app redis: image: "redis:alpine" # 使用现成的Redis镜像 # ports: # 如果不需要从宿主机直接访问Redis,可以不映射端口,Web服务通过内部网络访问 # - "6379:6379" volumes: - redis-data:/data # 使用命名卷持久化Redis数据 volumes: # 声明在顶层定义的卷 redis-data:使用 Compose 管理应用:
# 1. 在包含 docker-compose.yml 的目录下,启动所有服务(后台运行) docker-compose up -d # 2. 查看运行状态 docker-compose ps # 3. 查看所有服务的日志(组合输出) docker-compose logs -f # 4. 查看特定服务的日志 docker-compose logs -f web # 5. 停止所有服务 docker-compose down # 默认会停止并删除容器、网络,但保留卷。如果想同时删除卷,加 `-v` 参数。 # 6. 重新构建镜像并启动(例如修改了Dockerfile后) docker-compose up -d --buildDocker Compose极大地简化了多服务环境的搭建和管理,是本地开发和测试的利器。
7. 避坑指南:常见问题与解决方案实录
即便按照步骤操作,你也可能会遇到一些“坑”。下面是我在Windows Docker使用中积累的一些常见问题及解决方法。
7.1 Docker Desktop 启动失败:虚拟化支持未检测到
这是最常见的问题,错误信息通常包含virtualization support wasn’t detected或Docker Desktop failed to start。
排查步骤:
- 确认BIOS虚拟化已开启:这是最根本的原因。务必按照3.1节的方法进入BIOS确认
VT-x/AMD-V已启用。 - 检查Windows功能:确保“Windows 虚拟机监控程序平台”和“Windows Subsystem for Linux”已启用(3.1节第3步)。有时安装程序可能没启用成功,可以手动在“控制面板 -> 程序 -> 启用或关闭Windows功能”中勾选并重启。
- 关闭冲突的虚拟化软件:某些安全软件(如某些版本的360、腾讯电脑管家)、安卓模拟器(如蓝叠、雷电)、或者其他虚拟机软件(如VMware Workstation、VirtualBox)可能与Hyper-V或WSL 2冲突。尝试暂时关闭或卸载它们。
- 以管理员身份运行:右键点击Docker Desktop图标,选择“以管理员身份运行”。
- 重置Docker Desktop:在任务栏Docker图标上右键 -> “Troubleshoot” -> “Reset to factory defaults”。注意这会删除所有镜像、容器和卷,慎用。
7.2 WSL 2 安装或启动问题
- 错误:WSL 2 requires an update to its kernel component。
- 解决:访问 WSL 2 Linux内核更新包 的微软官方页面,下载并安装那个很小的MSI更新包,然后重启。
- WSL发行版启动失败或卡住。
- 解决:在PowerShell中运行
wsl --shutdown彻底关闭所有WSL实例,然后重新启动你的发行版。如果问题依旧,可以尝试注销并重新安装发行版:wsl --unregister Ubuntu-22.04(会删除该发行版及其所有数据!),然后从商店重新安装。
- 解决:在PowerShell中运行
7.3 镜像拉取缓慢或失败
- 现象:
docker pull速度极慢,甚至超时。- 解决:务必配置国内镜像加速器,如3.4节第2步所述。可以多试几个镜像地址,选择速度最快的。也可以使用阿里云、腾讯云等提供的个人专属加速器地址(需要注册账号)。
7.4 文件权限问题(尤其在绑定挂载时)
- 现象:在Windows下创建的文件,在容器内运行时提示“Permission denied”。
- 背景:Windows和Linux的文件权限系统不同。从Windows挂载到Linux容器,文件默认可能没有执行权限。
- 解决:
- 最佳实践:将项目代码放在WSL 2的Linux文件系统内(如
~/projects),然后在Docker中挂载这个Linux路径,可以完全避免权限问题。 - 如果必须在Windows路径下,可以在
docker run时通过-u参数指定用户ID:docker run -u $(id -u):$(id -g) ...。或者在Dockerfile的RUN指令中主动修改挂载目录的权限(不推荐,影响宿主机文件)。
- 最佳实践:将项目代码放在WSL 2的Linux文件系统内(如
7.5 端口被占用
- 现象:运行
docker run -p 80:80 ...时提示Bind for 0.0.0.0:80 failed: port is already allocated。- 解决:
- 更改映射端口,例如
-p 8080:80。 - 找出占用端口的进程并停止它。在PowerShell中运行
netstat -ano | findstr :80,找到PID,然后在任务管理器中结束该进程。
- 更改映射端口,例如
- 解决:
7.6 Docker 命令需要 sudo(在WSL 2内)
- 现象:在WSL 2的Ubuntu终端里,直接运行
docker ps提示权限错误。- 解决:将你的用户加入
docker组。
然后完全退出WSL终端(关闭所有窗口),再重新打开。这是因为Docker Desktop在安装时会在WSL 2内创建一个docker组,并配置好套接字权限。sudo usermod -aG docker $USER
- 解决:将你的用户加入
8. 性能优化与日常维护建议
为了让Windows下的Docker用得更顺手,这里有一些进阶技巧。
1. 调整WSL 2内存和CPU限制WSL 2默认会占用最多50%的内存和CPU。如果你内存很大,可以手动调整。在用户目录(C:\Users\YourName\)下创建或编辑文件.wslconfig:
[wsl2] memory=8GB # 限制WSL2最大使用内存,根据你的主机内存调整(如16G主机可设8G) processors=4 # 限制WSL2使用的CPU核心数 swap=2GB # 设置交换空间大小 localhostForwarding=true保存后,在PowerShell运行wsl --shutdown关闭WSL,再重启Docker Desktop生效。
2. 将Docker数据目录移动到非系统盘默认镜像、容器数据都存放在C盘。如果C盘空间紧张,可以迁移。
- 右键任务栏Docker图标 -> Settings -> Resources -> Advanced -> Disk image location。修改路径到其他盘符(如
D:\DockerData)。点击“Apply & Restart”,Docker会迁移数据,耗时较长。
3. 善用.dockerignore文件在构建镜像时,COPY . .会把构建上下文的所有文件都发送给Docker守护进程。如果项目里有node_modules,.git, 日志等大文件或无关文件,会拖慢构建速度并增加镜像体积。在项目根目录创建.dockerignore文件,内容类似:
**/node_modules **/.git **/*.log **/.env Dockerfile docker-compose.yml README.md4. 使用多阶段构建优化镜像对于需要编译的应用(如Go、Java),最终的运行环境可能不需要编译工具链。多阶段构建可以在一个Dockerfile中使用多个FROM指令,只将最终需要的产物复制到一个小体积的运行时镜像中,极大减小镜像尺寸。
5. 定期进行系统清理长期使用会积累很多无用的镜像、容器、卷和构建缓存,占用磁盘空间。
# 查看磁盘使用情况 docker system df # 清理所有未使用的资源(谨慎操作,会删除未使用的镜像) docker system prune -a -f # 清理特定卷(先确认卷不再使用) docker volume prune从最初的系统准备,到核心概念剖析,再到一步步安装配置、实战操作,最后到问题排查和优化建议,我希望这份超过五千字的指南能成为你在Windows上征服Docker的详细路线图。记住,容器化是一个实践性极强的技能,最好的学习方式就是动手去用。从一个简单的docker run hello-world开始,到用Docker Compose编排起自己的完整开发环境,每一步都会让你对现代应用交付有更深的理解。如果在实践中遇到本指南未覆盖的独特问题,善用docker --help、官方文档和社区搜索,你遇到的问题,很可能早已有人踩过坑并分享了解决方案。