☰
Windows 用 WSL2 + Docker 部署 OpenClaw 完整指南
2026/10/8 8:57:42 网站建设 项目流程

Windows 上跑 OpenClaw,说难不难,说简单也真没那么简单。折腾过一轮之后,我的结论是:用 WSL 2 装 Ubuntu,再在 Ubuntu 里用 Docker 跑容器,是当前最省心、最不容易把系统搞乱的方案。这篇文章就把我完整踩过一遍的流程、参数、坑和最终跑通的配置全部写出来,从零开始,跟着走就行。

我默认你是这么个情况:主力机是 Windows,想在 Windows 上部署并运行 OpenClaw 这个开源引擎项目,但不想在 Windows 原生环境里装一堆编译链和运行库,也不想为此单独装一个完整的虚拟机。WSL 2 提供了轻量 Linux 子系统,Docker 负责把 OpenClaw 的依赖全部隔离在容器里,Ubuntu 则是容器和宿主机之间的桥梁,三者配合,既能享受 Linux 生态的便利,又不破坏 Windows 本体的环境。


1. 方案选型:为什么是 WSL 2 + Ubuntu + Docker

1.1 OpenClaw 只是引擎,资源文件得另说

先花半分钟说清楚 OpenClaw 是什么。OpenClaw 是一个开源的游戏引擎重实现项目,目标是让经典平台动作游戏《Captain Claw》能够在现代操作系统上运行。注意,它只包含引擎代码,不包含游戏本体数据。也就是说,你想把它跑起来,手上必须有一份合法的游戏资源文件,然后把资源目录挂载给引擎读取。这个定位决定了它的部署方式和常规「一条命令安装」的软件不太一样,需要编译源码、准备资源、处理显示输出。

这个特性带来的直接后果是:你会同时遇到编译环境问题、运行库问题、路径问题和 GUI 显示问题。如果在 Windows 原生环境里硬搞,光一个 SDL2 的版本兼容就能折腾一晚上。而在 Linux 容器里,这些问题都变成「写进 Dockerfile 就行」的确定性操作。

1.2 三种部署路线的对比

我把常见方案都试了一遍,逐个说结论。

第一个方案是 Windows 原生编译。理论上可行,OpenClaw 的代码中有 Windows 支持,但实际操作时要处理 Visual Studio 工具链、CMake 生成器、Windows 版 SDL2 库、路径分隔符差异,最恶心的是某些老代码在 MSVC 下的告警被当作错误处理,改起来没完没了。适合想研究引擎源码的人,不适合想快速玩游戏的人。

第二个方案是完整虚拟机,比如 VMware 或 Hyper-V 里装一个 Ubuntu 桌面版。优点是环境干净,缺点是资源开销大:开一个虚拟机吃 4GB 内存起步,而且每次切换系统都要等启动流程,文件共享、GPU 加速配置也麻烦。

第三个方案就是本文主角:WSL 2 + Ubuntu + Docker。WSL 2 本身就是一个轻量虚拟机,但它有原生 Windows 集成、秒级启动、文件互通。Docker 在 WSL 2 里跑 Linux 容器,几乎和原生 Linux 上跑没有性能差异。OpenClaw 对图形的要求不高,SDL 2 软件渲染就够,所以完全不需要 GPU 直通这类高级特性。这套组合的实际体验是:部署过程线性可控,出了问题也能精确复现。

1.3 WSL 2 的底层原理和性能特点

聊一点底层的东西,方便你理解后面为什么会有那些坑。WSL 2 基于 Hyper-V 虚拟化平台,整个 Linux 内核跑在一个轻量虚拟机里,所以它和 Windows 之间是「跨虚拟化边界通信」,而不是传统意义上的进程互调。

这个架构带来两个直接影响。一是在 WSL 2 内部访问/mnt/c/这类 Windows 文件系统时,性能会比访问 Linux 原生文件系统差不少。所以我的原则是:一切容器、源码、数据文件都放在 WSL 2 的 Linux 文件系统里,比如~/openclaw,不要放到/mnt/c/Users/...。二是内存管理上,WSL 2 默认会吃掉宿主机最多 50% 的内存,看起来非常吓人,后面我会给出限制方案。

这里推荐一篇文章,如果你对 WSL 2 的虚拟化原理和 Hyper-V 的调度策略感兴趣,可以系统了解。


2. 环境准备:把 Windows 变成能跑容器的机器

2.1 WSL 2 的启用和 Ubuntu 安装

首先确认系统版本。Windows 10 2004 及以上,或者 Windows 11,都自带完整的 WSL 2 支持。老版本建议直接升级系统,不要在旧版上折腾。

以管理员身份打开 PowerShell,执行:

wsl --install -d Ubuntu-24.04

这个命令会启用 WSL 功能、安装 WSL 2 内核,并自动把 Ubuntu 24.04 LTS 装好。安装完成后重启机器,Ubuntu 终端会自动弹出,第一次启动会让你设置用户名和密码。这个用户会拥有 sudo 权限,记住它的密码,后面所有需要提权的操作都得靠它。

安装完成后,确认一下 WSL 2 已经生效:

wsl -l -v

如果看到 Ubuntu 的 VERSION 列是 2,就没问题。如果显示的是 1,执行wsl --set-version Ubuntu-24.04 2手动转换。

2.2 把 Ubuntu 发行版挪到 D 盘

说句实话,WSL 2 默认把所有发行版文件放在 C 盘%LOCALAPPDATA%下面,这非常占地方。如果你 C 盘本来就不宽裕,建议一上来就把 Ubuntu 迁移到其他盘,省得后面磁盘满了再折腾。

操作分三步,全部在 Windows 侧 PowerShell 完成:

wsl --shutdown wsl --export Ubuntu-24.04 D:\wsl-backup\ubuntu-24.04.tar wsl --unregister Ubuntu-24.04

wsl --unregister会删除当前发行版的所有数据,所以必须先导出备份。备份完成后,你在 D 盘建一个目录,比如D:\WSL\Ubuntu-24.04,然后执行:

wsl --import Ubuntu-24.04 D:\WSL\Ubuntu-24.04 D:\wsl-backup\ubuntu-24.04.tar

注意一个细节:用--import恢复的发行版,默认登录用户是 root。所以还要在 Ubuntu 终端里执行一次:

sudo nano /etc/wsl.conf

在[user]一节中写入:

[user] default=你的用户名

保存后重新进入即可恢复普通用户身份。

2.3 Docker 安装:Docker Desktop 与 Docker Engine 怎么选

这里有两种路线,我分别说。

第一种是装 Docker Desktop for Windows,然后启用它和 WSL 2 的集成。Docker Desktop 在 Windows 系统栏常驻,提供一个图形界面,适合平时对命令行不熟的读者。它会在后台调用 WSL 2 的虚拟机,并把 WSL 2 里的发行版拉入 Docker 生态,具体表现是:Ubuntu 终端里敲docker命令可以直接用,且和桌面版共享同一个守护进程。

第二种是只装 Docker Engine,完全在 Ubuntu 内部操作。方式如下:

sudo apt update sudo apt install docker.io docker-compose-plugin sudo systemctl enable docker sudo usermod -aG docker $USER

装完之后重新登录 WSL,docker version能看到客户端和服务端版本就成功了。

我个人推荐第二种。原因很直白:我们部署 OpenClaw 只需要在 Ubuntu 内部用命令行操作,Docker Desktop 的图形界面在这里属于多余负载,还会抢占系统资源和托盘空间。而且 Docker Desktop 的许可和自动更新策略可能时不时给你「惊喜」,在纯粹的 WSL 2 工作流里,Docker Engine 够用且干净。

提示:加入docker组之后,必须重新打开终端才生效。如果不生效就重启 WSL,不要一直在命令前挂sudo,否则文件的属主乱套只是时间问题。

2.4 用 .wslconfig 限制内存和 CPU

WSL 2 有个默认行为:最多吃宿主机 50% 的内存。对机器内存不太大的用户来说,这会造成 Docker 编译镜像时 Windows 侧变卡。我建议在 Windows 用户目录下创建.wslconfig文件,写入:

[wsl2] memory=6GB processors=4 swap=2GB

memory限制 WSL 2 最大内存,processors限制可用的 CPU 核心数,swap设置交换文件大小。配置改完之后执行wsl --shutdown再重进,配置生效。我自己设的是memory=8GB,因为 OpenClaw 编译时的 SDL 依赖和链接阶段比较占内存,太小容易 OOM。

这里想额外提醒一点:.wslconfig是 Windows 侧的全局配置,不要放在 Linux 目录里。路径是C:\Users\你的用户名\.wslconfig。


3. 部署 OpenClaw:Dockerfile 到容器运行

3.1 拉取源码和准备游戏资源

环境准备好之后,进入实操。首先在 Ubuntu 里建目录,拉源码:

mkdir -p ~/openclaw/gamedata cd ~/openclaw git clone https://github.com/OpenClaw/OpenClaw.git

这里注意目录规划的用意:~/openclaw/gamedata是留给游戏资源文件的,~/openclaw/OpenClaw是源码目录。后续容器运行时会通过卷映射把gamedata挂载进去,所以不要在源码目录里乱放资源。

游戏资源文件通常是claw.rem或CLAW.RES这类数据包,以及DATA子目录下的若干资源子目录。把完整资源目录复制到~/openclaw/gamedata/下即可。注意不要拿着破解版资源来问为什么报错,我只建议使用你自己合法拥有的游戏数据。

3.2 多阶段构建的 Dockerfile 逐段解释

我直接用多阶段构建方案,因为 OpenClaw 的编译依赖和运行依赖是两回事。编译阶段需要完整的工具链,运行阶段只需要几个动态库,两段分离能显著缩小最终镜像体积。

在~/openclaw/下创建Dockerfile:

# 阶段一:编译 FROM ubuntu:24.04 AS builder RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ build-essential cmake git pkg-config \ libsdl2-dev libsdl2-net-dev libogg-dev libvorbis-dev \ && rm -rf /var/lib/apt/lists/* COPY OpenClaw /src/OpenClaw WORKDIR /src/OpenClaw/build RUN cmake .. -DCMAKE_BUILD_TYPE=Release \ && make -j"$(nproc)" # 阶段二:运行 FROM ubuntu:24.04 RUN apt-get update && \ DEBIAN_FRONTEND=noninteractive apt-get install -y \ libsdl2-2.0-0 libsdl2-net-2.0-0 libogg0 libvorbis0a \ && rm -rf /var/lib/apt/lists/* COPY --from=builder /src/OpenClaw/build/openclaw /usr/local/bin/ WORKDIR /data ENTRYPOINT ["openclaw"]

逐段说几个关键点。

libsdl2-dev和libsdl2-net-dev是 OpenClaw 编译时必须的开发包,SDL 2 处理窗口、输入、音频,SDL_net 处理网络对战或局域网功能。如果你后续想编译启用局域网对战的版本,这两项缺一不可。

cmake .. -DCMAKE_BUILD_TYPE=Release中的Release是必须的。默认的Debug构建产物体积大、帧率低,而且链接时间明显更长,对游戏运行没有任何好处。

make -j"$(nproc)"的并行任务数直接取容器内的 CPU 核心数。这里有个参数相关的坑:nproc在 WSL 2 里读到的是你分配给 WSL 的核心数,不是宿主机总核心数,所以不用担心把机器榨干。

3.3 构建镜像时常见的几个坑

构建过程中最容易翻车的是 apt 源网络问题和编译内存不足。

apt 源的问题表现是apt-get update卡在某个连接上。如果你所在网络访问默认源速度慢,可以换成国内镜像源,把sources.list中的archive.ubuntu.com替换成镜像站点地址。注意替换之后要执行apt-get clean再重新 update。

内存不足的表现是编译过程中直接报Killed,没有任何具体的编译错误信息。这多半就是 OOM。解决办法就是前面说的.wslconfig里增加memory,另外可以在make时降并行度:make -j2。这个参数不是越大越好,机器总内存小就老实点。

构建命令:

cd ~/openclaw docker build -t openclaw:latest .

构建成功后,docker images应该能看到openclaw:latest,体积控制在 200MB 左右是比较健康的,如果超过 500MB,八成是第一阶段把不需要的包装进了第二阶段,回头检查一下FROM ubuntu:24.04那一段的 apt 安装列表。

3.4 容器运行参数与游戏资源挂载

构建完成后就可以运行了。OpenClaw 需要读取游戏资源,同时需要一个图形输出来显示画面。先说资源卷映射:

docker run -it --rm \ -v ~/openclaw/gamedata:/data \ -e DISPLAY="$DISPLAY" \ -v /tmp/.X11-unix:/tmp/.X11-unix:rw \ openclaw:latest

拆解每一个参数:

-it是分配交互式终端,因为 OpenClaw 运行时会在终端输出日志,而且某些情况下需要键盘交互。--rm是退出即删除容器,避免反复测试后堆积无用容器。

-v ~/openclaw/gamedata:/data把宿主机资源目录映射到容器内/data,OpenClaw 默认工作目录就是/data。这一步是路径挂载的关键,不做这步它什么都读不到。

-e DISPLAY="$DISPLAY"和-v /tmp/.X11-unix:/tmp/.X11-unix:rw是 Linux 图形程序联网的经典组合。前者告诉 SDL 2 图形输出到哪里,后者把 X11 的 Unix Socket 映射进容器,图形才能显示到 WSLg 上。

3.5 显示输出:WSLg 与 X Server 两套方案

Windows 11 和较新的 Windows 10 自带 WSLg,也就是 WSL 2 的图形界面支持,默认 DISPLAY 变量已经帮你设好了,不需要额外安装任何软件。如果你的系统较老,或者 WSLg 失效,就需要自己安装 Windows 侧的 X Server。

这里我把两套方案放在一起对比:

方案适用场景配置成本稳定性
WSLgWindows 11 / 新版 Win10零配置高
Windows X Server旧版 Win10中等较高

如果走 X Server 方案,典型配置是在 Windows 侧启动 VcXsrv,然后在 Ubuntu 里执行:

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0

这行命令很经典,Kali Linux 官方文档也推荐使用它,原因在于 WSL 2 的 NAT 网络模式下,Windows 宿主机地址不能通过ip route直接拿到,但/etc/resolv.conf里的 DNS 服务器通常是宿主机 IP,于是就被拿来当 X Server 的主机地址。

实测下来,WSLg 方案的延迟比 Windows X Server 低,画面也更流畅。建议优先用 WSLg,跑不起来再换 X Server。


4. 实战中踩过的坑与排查方法

4.1 Docker 守护进程起不来或启动失败

症状:敲docker version显示 Server 部分报错,或者docker run提示Cannot connect to the Docker daemon。

先排除最简单的情况:如果你装的是 Docker Engine,而不是 Desktop,检查 docker 服务是否在运行:

sudo service docker status sudo service docker start

WSL 2 里的 Docker Engine 有时候不会自动启动,因为 WSL 没有一个类似systemd的正常开机流程。Ubuntu 24.04 已经默认支持 systemd,所以理论上sudo systemctl enable docker就能开机启动。如果你发现没生效,就在~/.bashrc末尾加一行service docker start,这不优雅,但有效。

还有一个比较隐蔽的坑:Docker Desktop 装了但没启用 WSL 2 集成,导致 Ubuntu 里敲docker找不到命令。去 Docker Desktop 的 Settings 里的 Resources -> WSL Integration 中,把 Ubuntu 的开关打开,重启 WSL 即可。

4.2 容器跑起来但黑屏或窗口不出现

这个问题非常典型,有三个方面排查。

第一,检查DISPLAY变量是否真的传进容器了。进入容器确认:

docker run -it --rm -e DISPLAY="$DISPLAY" openclaw:latest env | grep DISPLAY

如果输出为空,说明宿主机变量的值本来就没设置。WSLg 环境下检查 Windows 侧的.wslconfig,看是否配置了guiApplications=true,这个配置项突然被关掉也会导致看不到窗口。

第二,检查~/.Xauthority的问题。WSLg 有时会生成一个$HOME/.Xauthority文件,里面包含访问控制凭据。容器里没有这个文件,X 服务器可能拒绝连接。临时验证的方法是在docker run时加一个参数禁掉访问控制:

-e XAUTHORITY=/tmp/.Xauth \

但这只是测试手段。更稳妥的做法是给运行用户挂载 Home 目录,或者把一个固定的 Xauthority 文件映射进去。

第三,SDL 2 有可能会强制走offscreen模式。试试加环境变量:

-e SDL_VIDEODRIVER=x11

x11是让 SDL 2 显式走 X11,避免它自己探测到 Wayland 或其他后端导致行为异常。

4.3 音频、键位、存档丢失问题

OpenClaw 这个年代的引擎对音频设备的要求很朴素,SDL 2 需要访问声卡设备。如果你在容器里跑起来发现没有声音,先看音频设备映射:

docker run -it --rm \ --device /dev/snd \ --group-add audio \ ...

--device /dev/snd把 WSL 2 内暴露的声卡设备映射进容器,--group-add audio把 audio 组权限附加进去。注意 WSL 2 默认可能没有暴露/dev/snd,这时候需要在 Windows 侧启动 WSL 后手动检查:

ls /dev/snd

如果目录不存在,大概率是因为 WSL 2 对音频设备支持不完整。可以安装 PulseAudio 并在 Windows 侧跑一个 PulseAudio 服务端,但这个方案配置比较复杂,我没深入研究过。如果你只是想确保游戏跑起来,先接受无声,把精力放在画面和控制上。

键位和存档的坑集中在文件路径。OpenClaw 的存档默认写在运行目录下,如果你把容器-v ~/openclaw/gamedata:/data挂载上去,存档就会落在宿主机~/openclaw/gamedata/下,这是好事,因为容器删除后存档不丢。但要注意.openclaw之类带点的隐藏目录,如果游戏写到了/root或/home/xxx,反倒麻烦了。解决办法是给容器加一个VOLUME /root或者在进入容器时设置HOME=/data:

-e HOME=/data

这样引擎在运行时找用户目录的路径就会切到挂载盘上。

4.4 磁盘占用膨胀与文件权限混乱

用 Docker 部署 OpenClaw 之后,磁盘占用有三大来源:镜像本体、构建缓存、容器日志。镜像本体一般 200MB 左右不用管,但 Docker 构建缓存在反复改 Dockerfile 时会越积越多。清理命令:

docker system prune -f docker system df

docker system df能看清每一类资源的占用。如果休眠容器很多,用docker container prune清掉写着Exited的容器。这里要注意,docker system prune -f会连无用镜像一起删,如果某些镜像你还有用但暂时没跑容器,也会被清掉,使用前留意一下docker images里的结果。

文件权限混乱的表现是:容器创建的文件在宿主机上属主是 root,你用普通用户删除时需要加sudo。这其实是 Linux 容器默认行为,因为容器内默认用户是 root,宿主机上的 UID 映射对不上。解决思路有两个:一是运行容器时指定当前用户 UID,二是运行容器后执行sudo chown -R 你的用户名:你的用户名 ~/openclaw。我一般选后者,更省事。


5. 部署完之后说几句大实话

写到这里,整个流程已经完整跑通了。从 WSL 2 的安装、磁盘迁移、Docker 环境搭建,到 OpenClaw 的多阶段构建、卷挂载、图形输出,再到实战中遇到的几个最具代表性的问题,相信你跟着操作,比我自己第一次部署要顺利得多。

最后分享两个我个人的操作习惯。第一,给 WSL 2 的.wslconfig里配一个足够大的memory=8GB是有必要的,OpenClaw 本身不占多大,但 Docker 构建阶段和 WSL 2 的整体开销加在一起,内存太小容易莫名其妙卡顿。第二,建议把~/openclaw整个目录定期打包备份,尤其是gamedata里的存档和资源文件,容器可以随时重建,但游戏进度丢了就真的找不回来了。

OpenClaw 的容器化部署到这里就是一个完整闭环。如果你想继续扩展,可以在 Docker Compose 里把资源目录、音频设备、X11 socket、用户 UID 这些配置固化成一份compose.yaml,下次只需要docker compose up一条命令就能进入游戏,这个留给你自己做,过程比结果更有意思。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询