
我对 DOS 游戏的记忆,已经不是单纯的“老”。黑底白字、手敲命令、声卡 IRQ 和 DMA,这些今天看起来有点笨拙的东西,当年却是进入游戏世界前必须经历的一部分。现在再让我为了玩一局怀旧游戏重新折腾整套 DOS 环境,我大概没那个耐心;但如果能把这些游戏封进 Docker,最后只留一个浏览器入口,反而很符合现在的使用习惯。对我来说,这类项目最有意思的地方,就是用今天的部署方式,把过去那套操作体验重新叫回来。我也不想为了情怀把部署复杂化,能用容器解决的就尽量别再手工配一整套老环境,怀旧应该留在游戏里,而不是留在安装过程里。
这次我在 Linux 上部署 oldiy/dosgame-web-docker,保留两种方式:一种直接用镜像里的 40 多款经典游戏,适合磁盘空间有限的机器;另一种额外挂载 chinese-dos-games,按现有流程下载更大的游戏库。服务统一映射到 8090,先在局域网浏览器里打开,再安装 cpolar,把 DOS 游戏页面提供到公网,最后配置固定二级子域名 doss。我会把“游戏库规模”“Docker 服务是否跑通”和“公网入口是否可用”分开说明,不因为页面能打开,就把每一款游戏都写成已经逐个验证。

我更喜欢把这套方案理解成:
Linux → Docker → DOS 游戏 Web 服务 → 浏览器访问。
以前启动游戏,要进目录、敲命令、记路径。
现在真正需要操作的,是 Docker 容器和一个 Web 端口。
怀旧感留给游戏本身,部署过程尽量按现代方式来。
这次本地环境使用 Linux。
不同系统只要 Docker 能正常运行,整体思路接近;下面的命令按现有 Linux 环境继续。
先切换到 root,并创建安装目录:
sudo -i
mkdir -p /root/data/docker_data/games
cd /root/data/docker_data/games
后面的 docker-compose.yml、游戏库目录和相关文件都放在:
/root/data/docker_data/games
下面。
进入目录后创建:
vim docker-compose.yml接下来有两种部署方式。
这两个方案最大的区别,不是容器本身,而是游戏资源从哪里来、要占多少空间。
如果服务器磁盘不大,可以先用精简方式。
配置如下:
version: '3.3'
services:
dosgame-web-docker:
container_name: dosgame
ports:
- '8090:262' #8090可以改成其他服务器没被占用的端口
# volumes:
# - '/root/data/docker_data/games/chinese-dos-games:/app/static/games'
image: 'oldiy/dosgame-web-docker:latest'这里没有启用额外的 volumes 挂载。
核心参数是:
dosgame8090262oldiy/dosgame-web-docker:latest8090 如果被其他服务占用,可以换成服务器上没有被占用的端口。
如果服务器硬盘空间充足,可以使用带外部游戏目录的配置:
version: '3.3'
services:
dosgame-web-docker:
container_name: dosgame
ports:
- '8090:262' #8090可以改成其他服务器没被占用的端口
volumes:
- '/root/data/docker_data/games/chinese-dos-games:/app/static/games'
image: 'oldiy/dosgame-web-docker:latest'这一版多了:
/root/data/docker_data/games/chinese-dos-games:/app/static/games
也就是说,游戏资源不再只依赖镜像内置内容,而是把宿主机上的游戏库挂进容器。

这里会看到两个数量口径:
bin 目录普通文件数量 1898 作为正常结果。实际操作时,我不会把这两个数字简单当成同一个统计口径,重点还是确认资源是否下载完整、容器能否正常读取。
如果选择大游戏库方案,先进入:
/root/data/docker_data/games/
然后执行:
cd /root/data/docker_data/games/
git clone https://github.com/rwv/chinese-dos-games.git如果提示没有安装 Git,会出现类似报错。

先更新系统:
yum update -y
再安装 Git:
yum install -y git
安装完成后继续克隆。

进入 chinese-dos-games 对应目录后,按流程执行:
python3 download_data.py
如果系统还没有 Python3,可以执行:
yum update -y
yum install -y python3游戏下载完成以后,统计 bin 目录中的普通文件数量:
ls -l /root/data/docker_data/games/chinese-dos-games/bin | grep "^-" | wc -l
这里给出的正常数量是:
1898
我会把它当成这套下载流程里的完整性检查之一,而不是直接等同于“浏览器里一定有 1898 款全部可玩”。
游戏资源准备好以后,回到部署目录:
cd /root/data/docker_data/games
docker-compose up -d
如果系统里没有 docker-compose,按当前步骤安装:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.7/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose --version安装以后再执行:
docker-compose up -d
容器启动成功后,就可以通过:
Linux 主机 IP + 8090
在 Windows 浏览器里打开页面。

到这里,局域网里的 DOS 游戏站已经能访问。

对我来说,这才是第一层验证:
Docker 容器启动 → 8090 端口可访问 → 浏览器能进入游戏页面。
至于不同游戏的兼容情况,仍然需要实际逐个运行。
如果只是自己在家里玩,局域网地址已经够用。
但想让朋友从另一张网络直接打开页面,本地 IP 就不够了。
这里再加 cpolar。
cpolar 在这套方案里只负责:
把 DOS 游戏 Web 服务的
8090端口提供到公网。
它不负责模拟 DOS,也不负责游戏资源本身。
所以角色可以拆成:
Docker / DOS 游戏站负责运行 → cpolar 负责公网入口。
执行:
sudo curl https://get.cpolar.sh | sh
安装完成以后查看服务状态:
sudo systemctl status cpolar
服务正常后,在浏览器打开:
虚拟机主机 IP + 9200
这次示例使用:
http://192.168.42.100:9200
页面链接目标同时写成:
http://localhost:9200/
实际使用时,以当前机器能够访问到的 cpolar Web UI 地址为准。

登录后,就可以开始创建 DOS 游戏站对应的公网隧道。
进入:
隧道管理 → 创建隧道
参数为:
doshttp8090China Top
创建成功后,打开在线隧道列表。

使用生成的公网地址,从其他电脑或移动设备访问。
页面能够正常打开。

这一层真正验证的是:
DOS 游戏站 8090 → cpolar HTTP 公网地址 → 外部浏览器。
如果准备长期分享,接下来再把随机地址换成固定入口。
进入 cpolar 预留页面,选择:
保留二级子域名

这里填写:
china Topdoss
二级子域名需要以账号实际保留成功的名称为准。
然后回到:
隧道管理 → 隧道列表
这里页面说明里写成了:
plex
隧道。

但前面真正创建的 DOS 游戏隧道名称是:
dos
这两个名字并不一致。
实际操作时,我会先确认哪条隧道真正指向本地 8090,再编辑那一条,而不是只看名字。
接着修改:
Sub Domain:填写前面保留成功的二级子域名China Top点击更新。

更新以后进入在线隧道列表。

此时随机公网地址已经切换成固定二级子域名形式。
最后再用固定公网地址访问。

页面可以正常打开。
到这里,长期分享入口已经配置完成。
我喜欢这种 DOS 项目的原因,不只是“又能玩老游戏了”。
更有意思的是,过去需要自己记命令、配环境、守着一台旧电脑玩的东西,现在可以被放进 Docker,最后通过浏览器打开。
这次实际跑通的主线是:
Linux → /root/data/docker_data/games → oldiy/dosgame-web-docker:latest → 8090:262 → 40 多款内置方案 / chinese-dos-games 外挂方案 → download_data.py → docker-compose up -d → 局域网访问 → cpolar → 随机公网 → 固定二级子域名 doss。
几个地方需要特别留意:
chinese-dos-games 目录;python3 download_data.py;1898 普通文件数量是两种不同表述,不要在没有进一步核对时直接合并成一个数字;8090 是宿主机 Web 访问端口,容器内部映射到 262;8090 的公网入口,不参与游戏模拟;plex 隧道名,但前面创建的是 dos,真正操作时要确认编辑的是指向 8090 的隧道;doss 解决的是分享地址变化问题,不代表每一款游戏都已经逐个验证兼容。如果只是想偶尔怀旧,装一个本地模拟器当然更直接;但如果想把一整套 DOS 游戏做成浏览器入口,再从另一台电脑、手机或者朋友的设备打开,这种 Docker 化的玩法会更有意思。怀旧的是游戏,部署方式却已经完全是今天的样子。