从零开始在 Windows 11 上自托管 Judge0
当我决定自托管 Judge0 时,我照着教程一步步操作,但几乎什么都没理解。容器不断重启,数据库崩溃,文档打不开。我一直在问:“到底发生了什么?”
这篇文章,就是我当时希望能看到的那篇指南。
本文将解释:
- 什么是自托管
- 为什么必须使用 Docker
- 为什么要使用 WSL
- 每条命令在做什么
- 常见问题为何发生
- 如何排查并修复问题
没有前置假设,也不会给出模糊解释。
1. Judge0 是什么
Judge0 不是一个网站,而是一个后端代码执行服务。
它的作用是:
- 接收源代码(Python、C++、Java 等)
- 在隔离环境中安全执行
- 返回输出结果、错误信息、运行时间与内存占用
它通常作为在线编译器、刷题平台或面试系统背后的执行引擎存在。
你不会“打开” Judge0。
而是你的应用程序通过 HTTP API 与它通信。
2. 什么是自托管
自托管指的是:服务由你自己运行,而不是依赖第三方服务器。
不自托管的情况:
1 | 你的应用 → 第三方 API → 对方服务器执行代码 → 返回结果 |
自托管的情况:
1 | 你的应用 → 你自己的系统 → Judge0 → 返回结果 |
优势包括:
- 没有 API 次数限制
- 不需要按请求付费
- 拥有完全控制权
- 获得真实的后端运维经验
3. 为什么必须使用 Docker
Judge0 会执行“不可信代码”。如果没有隔离机制,这是非常危险的。
Docker 提供了:
- 进程隔离(沙箱)
- 资源限制(CPU / 内存)
- 独立环境
- 可复现部署
如果不使用 Docker:
- 代码可能访问你的系统文件
- 依赖版本可能冲突
- 环境难以清理
- 安全风险极高
Docker 是执行代码类服务的基础设施,而不是可选项。
4. Windows 上可以运行 Docker 吗
可以。
Docker 原生运行在 Linux 上。在 Windows 中运行 Linux 工具的最佳方式是:
WSL(Windows Subsystem for Linux)。
本教程使用:
- WSL2
- Ubuntu
- Docker Engine(docker.io)
不使用 Docker Desktop,原因如下:
- 增加额外抽象层
- 容易与 Linux 原生 Docker 冲突
- 对当前场景并非必须
5. 安装 WSL 与 Ubuntu
以管理员身份打开 PowerShell:
1 | wsl --install |
执行后重启系统。
然后从开始菜单打开 Ubuntu,创建 Linux 用户名与密码。
后续所有操作都在 Ubuntu 终端中完成。
6. 更新 Ubuntu
在 Ubuntu 中执行:
1 | sudo apt update && sudo apt upgrade -y |
作用:
- 更新安全补丁
- 保证软件兼容性
- 为 Docker 安装准备干净环境
7. 安装 Docker Engine(Linux 原生)
1 | sudo apt install -y docker.io |
此时 Docker 安装在 Linux 子系统中,而不是 Windows。
这样做的好处是:
- 行为更接近真实服务器
- 避免 Windows 特有问题
- 与云服务器环境一致
8. 修复 Docker 权限问题
默认情况下,Docker 需要使用 sudo。
为了避免每次输入 sudo:
1 | sudo usermod -aG docker $USER |
现在当前用户可以直接使用 Docker。
9. 验证 Docker 是否正常工作
1 | docker run hello-world |
该命令用于测试:
- Docker 守护进程是否运行
- 是否可以拉取镜像
- 是否可以启动容器
这是一项诊断测试。
10. 下载 Judge0
1 | wget https://github.com/judge0/judge0/releases/download/v1.13.1/judge0-v1.13.1.zip |
解压后你会得到:
- Docker Compose 配置
- 多服务架构
- 类似生产环境的部署结构
11. 配置文件说明
这一部分容易出错。
在 Judge0 v1.13.1 中:
.env文件不会被使用- 必须使用
judge0.conf
Docker Compose 文件中明确指定:
1 | env_file: |
如果修改了错误的文件,PostgreSQL 会不断重启。
12. 编辑 judge0.conf
1 | nano judge0.conf |
修改或添加以下内容:
1 | # Redis |
保存并退出:
1 | Ctrl + O → 回车 |
13. 按顺序启动服务
先启动数据库与缓存:
1 | docker-compose up -d db redis |
原因:数据库必须完成初始化。
然后启动其余服务:
1 | docker-compose up -d |
14. 常见问题:数据库不断重启
如果执行:
1 | docker-compose ps |
看到:
1 | db Restarting |
说明:
- PostgreSQL 未读取到必要环境变量
- 或旧数据与当前配置冲突
解决方法:
1 | docker-compose down -v |
-v 会删除旧数据卷。
15. 验证服务状态
1 | docker-compose ps |
应看到:
1 | db Up |
16. 访问 Judge0
浏览器打开:
1 | http://localhost:2358/docs |
该页面是:
- API 文档
- 测试接口
它不是用户产品,而是接口验证界面。
17. 你构建了什么
你构建的是一套后端基础设施,而不是一个应用。
Judge0:
- 接收 HTTP 请求
- 执行代码
- 返回 JSON 响应
未来你的后端服务会调用它。
18. 是否需要长期运行
不建议在笔记本上长期运行。
Judge0 会消耗:
- 内存
- CPU
- 后台资源
推荐使用方式:
启动:
1 | docker-compose up -d |
停止:
1 | docker-compose down |
个人电脑不是服务器。
19. 为什么云平台无法访问本地 Judge0
如果你将前端部署到:
- Vercel
- Render
- Netlify
它们无法访问你的 localhost。
如果需要 24 小时在线运行,必须部署到云服务器(例如 VPS)。
目前不存在真正免费的长期代码执行环境。
20. 实际收获
即使没有公网部署,你已经掌握:
- Docker 基础
- 服务编排
- 环境隔离
- 容器故障排查
- 后端系统架构认知
这些经验远比一个可演示的 Demo 更重要。
21. 启动与停止 Judge0
启动:
1 | cd ~/judge0-v1.13.1 |
停止:
1 | cd ~/judge0-v1.13.1 |
总结
自托管不会让事情变得免费,而是让它属于你。
Docker 不会消除依赖,而是将依赖隔离起来。
如果你理解了这一点,就真正理解了你刚刚构建的系统。
下一步建议
- 将 Judge0 集成到 Node.js 后端
- 部署到云服务器
- 深入阅读官方文档
即使不进行公网部署,这次实践已经完成了一次完整的后端工程学习过程。
- 标题: 从零开始在 Windows 11 上自托管 Judge0
- 作者: 星隐
- 创建于 : 2026-01-18 10:00:00
- 更新于 : 2026-03-14 22:19:36
- 链接: https://www.starin.top/post/6fac9bff0a8b/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。