本文记录一次将 原生安装的《饥荒联机版(DST)》专用服务器 平滑迁移至 Docker 容器环境 的全过程。
重点不在“如何一键搭建”,而在 配置复用、端口一致性、MOD 自动管理、Shard 分片通信验证 等关键细节。
一、迁移背景与目标
原服务器为 原生 Linux 安装 的 DST Dedicated Server,运行多年,具有以下特点:
- 世界配置(Master + Caves)稳定
- MOD 数量多,且有复杂
modoverrides.lua - Shard 分片通信正常
- Steam Workshop 自动下载机制已验证可靠
迁移目标不是“重装”,而是:
在 Docker 中完整接管运行环境,但不破坏任何已有数据结构与行为逻辑。
核心原则:
- 数据永远在宿主机
- 容器可随时删除 / 重建
- 端口、世界、MOD 行为完全一致
二、整体目录结构设计(脱敏示意)
宿主机统一使用一个工作目录:
/path/to/dst/
├── compose.yml
├── data/ # 游戏世界、配置、存档(关键)
│ └── DoNotStarveTogether/
│ └── Cluster_X/
│ ├── cluster.ini
│ ├── Master/
│ │ └── server.ini
│ └── Caves/
│ └── server.ini
├── runtime/ # SteamCMD / Workshop 缓存
└── mods/ # MOD 实际下载目录(可选挂载)
关键说明:
data/是唯一不可丢失目录- Docker 容器内的任何路径都视为临时运行态
- 所有 ini / lua 均沿用原服务器文件
三、Docker 镜像选择与原则
使用的镜像类型:
- DST 专用 Docker 镜像
- 内置 SteamCMD
- 支持 Master / Caves 分片模式
- 支持环境变量接管,但允许跳过自动生成
原则:
Docker 只负责“跑”,不负责“改”。
因此明确禁止镜像行为:
- ❌ 自动覆盖 cluster.ini
- ❌ 自动重写 server.ini
- ❌ 自动生成 modoverrides.lua
- ❌ 自动 chown / chmod
四、Docker Compose 设计要点(概念说明)
1️⃣ 使用 host 网络模式
network_mode: host
原因:
- DST 使用大量 UDP
- Steam Master / Auth 对 NAT 敏感
- 避免 Docker 端口映射复杂性
👉 所有端口直接由 ini 文件控制
2️⃣ Master / Caves 使用两个容器
逻辑拆分而不是合并运行:
- Master:地表世界
- Caves:洞穴世界
两者共享:
- 世界数据目录
- SteamCMD / Workshop 缓存
3️⃣ 明确“只读接管”策略
通过环境变量声明:
- 跳过配置生成
- 跳过权限修改
- 跳过 MOD 覆盖
目的只有一个:
让容器行为与原生服务器 100% 一致
五、MOD 管理策略(关键经验)
❌ 不推荐的方式
docker cp手动拷贝 MOD- 容器内临时下载 MOD
- 容器删除即丢失 MOD
✅ 实际采用方式
- 保留原有:
dedicated_server_mods_setup.luamodoverrides.lua
- 由 DST 服务启动时自动下载 Workshop MOD
- MOD 下载路径位于 SteamCMD 库中
- 游戏启动日志明确显示:
- Workshop 下载
- MOD 注册
- MOD 配置覆盖
结论:
Docker 环境下,DST 的 MOD 自动管理机制完全可复用,无需任何人工拷贝。
六、端口配置完整核对(脱敏说明)
服务器共使用 5 类端口,分别对应不同功能。
| 功能 | 来源文件 | 协议 | 说明 |
|---|---|---|---|
| Master 世界端口 | Master/server.ini | UDP | 地表玩家连接 |
| Caves 世界端口 | Caves/server.ini | UDP | 洞穴玩家连接 |
| Shard 通信端口 | cluster.ini | TCP | Master ↔ Caves |
| Steam Master 注册 | server.ini | UDP | 服务器对外可见 |
| Steam Auth | server.ini | UDP | 玩家身份验证 |
验证方式:
- 启动日志显示 shard 成功连接
- Steam Master 注册成功
- 客户端可见服务器
- 洞穴 / 地表互通正常
七、日志验证关键点
迁移是否成功,只需关注以下日志信号:
✅ 分片启动
[Shard] Starting master server
[Shard] Secondary shard connected
✅ MOD 加载完成
SUCCESS: Loaded modoverrides.lua
Registering Mod workshop-xxxxxx
ModIndex: Load sequence finished successfully
✅ 世界加载完成
World generated
Server registered via geo DNS
无崩溃、无回滚、无重启循环,即为成功。
八、容器删除与数据保留策略
一旦验证成功:
- 停止容器
- 删除容器
- 不删除任何宿主机目录
Docker 的角色至此明确:
只是一个“随时可启动的运行壳”。
九、旧版本清理策略
历史原生安装、旧 Steam 目录、旧 .klei 备份:
- 已确认不再使用
- 与当前 Docker 运行路径无交集
- 可安全删除或归档
原则:
- 先验证
- 再清理
- 绝不反向依赖
十、总结
这次迁移的核心不是 Docker,而是三点:
- 尊重 DST 原生配置体系
- 让 Docker 成为透明运行环境
- 以日志而非“感觉”判断成功
最终结果:
- 世界完整
- MOD 全量生效
- 分片稳定
- 数据完全可控
- Docker 可随时丢弃
这是一次工程级成功迁移,而不是“能跑就行”。