游戏服用 Docker 部署有很多好处:环境隔离不污染系统、一条命令拉起、升级就是删容器重建、多游戏共存互不干扰。
这篇用幻兽帕鲁和方舟两个例子,讲游戏服 Docker 化的完整方案:镜像选择、容器编排、数据持久化、自动更新。全程命令可抄。
需要现成的游戏云服务器,可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上,主流游戏都能快速部署,不想折腾 Docker 的直接用面板开服。
一、游戏服 Docker 化的收益
| 痛点 | Docker 方案 |
|---|---|
| 依赖库污染系统(wine、32 位库) | 全在镜像里,宿主机干干净净 |
| 多游戏共存环境冲突 | 每游戏一个容器,彻底隔离 |
| 升级服务端要手动折腾 | 删容器拉新镜像,一分钟搞定 |
| 换机器迁移 | 数据卷打包 + docker-compose,整体搬走 |
| 资源限制 | 容器直接限制 CPU/内存,比 systemd 更细 |
代价:多一层抽象,磁盘占用大一点(镜像几百 MB 到几个 G),极少数性能敏感场景有损耗。对绝大多数游戏服,收益远大于代价。
二、Docker 基础(没装的先看这)
# 安装 Docker(官方一键脚本)
curl -fsSL https://get.docker.com | bash
# 启动并设为开机自启
systemctl enable --now docker
# 验证
docker --version
docker run hello-world详细安装和命令见Docker 安装与基础命令。
三、实战一:幻兽帕鲁容器化部署
幻兽帕鲁是 SteamCMD + Wine 运行,依赖一堆 32 位库,是最适合 Docker 化的游戏。
docker-compose.yml
version: "3.8"
services:
palworld:
image: thijsvanloef/palworld-server-docker:latest
container_name: palworld
restart: unless-stopped
ports:
- "8211:8211/udp" # 游戏端口
- "27015:27015/udp" # 查询端口
environment:
- PUID=1000
- PGID=1000
- PORT=8211
- PLAYERS=16
- MULTITHREADING=true
- RCON_ENABLED=true
- RCON_PORT=25575
- ADMIN_PASSWORD=你的管理员密码
- SERVER_NAME=我的帕鲁服务器
- SERVER_DESCRIPTION=Docker 部署
- TZ=Asia/Shanghai
volumes:
- ./data:/palworld/Pal/Saved # 存档持久化(关键!)
deploy:
resources:
limits:
memory: 12G启动与管理
# 启动(后台)
docker compose up -d
# 看日志(第一次启动会下载服务端,耐心等)
docker compose logs -f
# 停止
docker compose down
# 重启
docker compose restart
# 看资源占用
docker stats palworld存档在哪
./data 目录(相对 compose 文件)里,映射到容器的 /palworld/Pal/Saved。这个目录就是命根子,备份它就行:
tar -czf palworld-backup-$(date +%F).tar.gz ./data/RCON 管理
# 用 RCON 客户端连(容器内 25575 端口,密码在 compose 里配)
# 宿主机执行:
docker exec -it palworld rcon-cli "Broadcast 大家好,服务器要重启了"
docker exec -it palworld rcon-cli "Shutdown 60 服务器60秒后重启"四、实战二:方舟生存进化
方舟的 Docker 镜像选择更多,用社区维护的 johnnykbg/ark-survival-ascended-server 或 hermsi/ark-server:
version: "3.8"
services:
ark:
image: johnnykbg/ark-survival-ascended-server:latest
container_name: ark
restart: unless-stopped
ports:
- "7777:7777/udp" # 游戏端口
- "7778:7778/udp" # 查询端口
- "7779:7779/udp" # 原始端口
- "27015:27015/udp" # Steam 查询
- "27020:27020/tcp" # RCON
environment:
- SESSION_NAME=我的方舟服
- SERVER_MAP=TheIsland_WP
- SERVER_PASSWORD=
- ADMIN_PASSWORD=你的管理员密码
- MAX_PLAYERS=20
- GAME_MOD_IDS= # MOD ID,逗号分隔
- TZ=Asia/Shanghai
volumes:
- ./ark-data:/app/arkserver/ShooterGame/Saved启动后第一次要下载 100G+ 的服务端(方舟 ASA 特别大),先确认磁盘够:
df -h # 方舟 ASA 要 100G+ 空间下载慢可以挂加速或者提前手动下载好挂载。
五、实战三:我的世界 Java 版
version: "3.8"
services:
minecraft:
image: itzg/minecraft-server:latest
container_name: minecraft
restart: unless-stopped
ports:
- "25565:25565"
environment:
- EULA=TRUE # 必须同意 EULA
- VERSION=1.20.1
- MEMORY=4G
- TYPE=PAPER # PAPER/FABRIC/FORGE/VANILLA
- DIFFICULTY=normal
- MAX_PLAYERS=20
- MOTD=我的 MC 服务器
- TZ=Asia/Shanghai
volumes:
- ./mc-data:/data# 控制台
docker attach minecraft # 进入控制台,Ctrl+P+Q 退出(不关容器)
# 或者发命令
docker exec -i minecraft rcon-cli say 大家好
# 看内存
docker stats minecraft六、多游戏共存:一个 compose 管所有
游戏多了,一个 compose 文件管所有最方便:
# /opt/games/docker-compose.yml
version: "3.8"
services:
palworld:
image: thijsvanloef/palworld-server-docker:latest
container_name: palworld
restart: unless-stopped
ports: ["8211:8211/udp"]
environment: [PORT=8211, PLAYERS=16]
volumes: [./palworld-data:/palworld/Pal/Saved]
deploy:
resources:
limits: {memory: 10G}
terraria:
image: beardedio/terraria:latest
container_name: terraria
restart: unless-stopped
ports: ["7777:7777"]
environment: [WORLD_SIZE=3]
volumes: ["./terraria-data:/data"]
deploy:
resources:
limits: {memory: 1G}
valheim:
image: lloesche/valheim-server:latest
container_name: valheim
restart: unless-stopped
ports: ["2456:2456/udp", "2457:2457/udp"]
environment: [SERVER_NAME=我的英灵殿, WORLD_NAME=Dockerland]
volumes: ["./valheim-data:/config"]cd /opt/games
# 全部启动
docker compose up -d
# 看所有容器状态
docker compose ps
# 看资源占用
docker stats
# 单独重启一个
docker compose restart palworld
# 全部停
docker compose down
# 全部更新到最新镜像
docker compose pull && docker compose up -d端口规划原则(同物理机多服):每服一段端口,别撞车。详见多游戏共存一台服务器。
七、自动更新:Watchtower
游戏服务端更新频繁,手动更累。用 Watchtower 自动更新镜像:
# 加到同一个 compose 文件
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true # 更新后删旧镜像
- WATCHTOWER_POLL_INTERVAL=86400 # 每天检查一次
- WATCHTOWER_INCLUDE_STOPPED=true # 停着的也更新
- TZ=Asia/Shanghaidocker compose up -d watchtower之后每天自动检查镜像更新,有新的就拉取并重建容器。注意:更新会重启容器,选凌晨自动跑(Watchtower 自身不能定时到几点,用 cron 控制更精细,或者接受它 24 小时轮询的行为)。
不想自动更新的游戏(比如正在玩的服),给容器加标签:
docker run --label com.centurylinklabs.watchtower.enable=false ...八、备份策略
Docker 化的游戏服,备份就是备份数据卷:
#!/bin/bash
# /opt/scripts/docker-games-backup.sh
DATE=$(date +%Y%m%d)
GAMES_DIR="/opt/games"
for game in palworld terraria valheim; do
if [ -d "$GAMES_DIR/${game}-data" ]; then
tar -czf "$GAMES_DIR/backups/${game}-$DATE.tar.gz" \
-C "$GAMES_DIR" "${game}-data"
echo "$game 备份完成"
fi
done
# 保留 14 天
find "$GAMES_DIR/backups" -name "*.tar.gz" -mtime +14 -delete更稳的做法:停容器 → 备份 → 起容器,避免存档写入时打包:
docker stop palworld
tar -czf /backup/palworld-$DATE.tar.gz -C /opt/games palworld-data
docker start palworld云快照是最可靠的兜底,每周一次,见游戏服务器数据备份与恢复。
九、常见问题
Q:容器起来后游戏连不上?
端口映射没配对。UDP 端口要显式写 /udp:
ports:
- "8211:8211/udp" # 对
- "8211:8211" # 错!这只映射 TCPQ:镜像下载慢?
配国内镜像加速:
# /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
systemctl restart dockerQ:容器重启后存档没了?
没配 volume 或 volume 配错。数据必须在 volume 里,不能只在容器文件系统——容器删了数据就没了。
Q:Docker 占磁盘越来越大?
镜像层和旧容器累积。清理:
docker system df # 看占用
docker system prune -a # 清理所有不用的镜像、容器、缓存Q:NAT 型服务器用 Docker 有什么注意?
端口映射链条变长了:公网 → 网关映射 → 宿主机 → 容器。确认:
- 服务商网关映射了对应端口
- 宿主机防火墙放行
- Docker 端口映射正确(
docker ps看 PORTS 列) - 三层都对上,少一层就进不去
Q:性能比原生部署差吗?
网络场景 Docker 有 NAT 转发开销,UDP 游戏流量大时可能多 1-3% CPU。内存场景几乎无差别。可以接受,别为这点开销放弃 Docker 的管理便利。
小结
游戏服 Docker 化三步走:选镜像 → 写 compose(端口+数据卷+资源限制)→ 备份数据卷。多游戏用一个 compose 管,更新用 Watchtower 自动跑,迁移就是打包数据卷 + 拷贝 compose 文件。不想折腾的话,直接用带一键开服面板的服务商更省事。
更多 Docker 教程见财富云计算知识库:Docker 基础命令、Compose 编排、故障排查全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。
延伸阅读
- 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
- 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
- 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
- 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
- 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
- RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
- 短链接服务搭建:Shlink 自托管,链接数据自己掌握
- 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道

[...]sudo apt-get install -y lib32gcc-s1 lib32stdc++6 libssl1.1:i386更省事的方案:直接用 Docker 跑,依赖全在镜像里,宿主机零污染,见Docker 部署游戏服务器。1.4 内存不足直接被杀(Killed)启动没报错,进程就消失,dmesg 里看到 Out of memory: Killed process:dmesg | tail -[...]
2026-10-14 回复
[...]docker compose up -d铁律:生产环境跑带版本号的镜像,永远不要跑 latest。回滚就是 docker compose up -d 前把镜像标签改回旧版本号,30 秒搞定。配合 CI 更香:GitHub Actions / Gitee Go 里跑 docker build + Trivy 扫描 + 推送,推代码自动出镜像,详细玩法见Docker 部署网站实战。九、常见问题速查现象[...]
2026-10-14 回复
[...]restart: unless-stopped升级服务端 = 删容器拉新镜像重建,数据卷岿然不动——这就是容器化最大的爽点,完整玩法见Docker 部署游戏服务器。二、Docker 网络:五种模式模式隔离性性能适用bridge(默认)容器独立网段,NAT 上网好单机多容器,默认用这个host共享宿主机网络栈最好高性能游戏服(省一层 NAT)none无网络——离线任务container:和指定容器共[...]
2026-10-15 回复
[...]docker run -d --name blog --memory=1g ...容器化部署详见Docker 部署游戏服务器和Docker Compose 编排实战。2. 资源限额游戏服是大户,必须限额,防止它 OOM 时把网站一起杀掉:# 容器内存限额(Docker 方式)[...]
2026-10-18 回复
[...]docker system prune -f --volumes六、扩展:往这套里加什么需求加什么自己的博客Typecho 容器(Typecho 搭建)数据库MySQL/PostgreSQL 容器(SQLite 与 MySQL 怎么选先想清楚)游戏服用容器跑也行(Docker 部署游戏服务器),但注意性能和存档位置密码管理Vaultwarden(Bitwarden 自建)RSS 阅读FreshRS[...]
2026-10-18 回复
[...]netsh advfirewall firewall add rule name="GameRange" dir=in action=allow protocol=UDP localport=26901-26903完整的 Windows 环境准备(远程桌面连接、运行库安装、SteamCMD 用法、开机自启、8 个常见坑)见:《Windows 云服务器开服通用前置教程》→ htt[...]
2026-10-18 回复