13 10 月 2026

游戏服用 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/Shanghai
docker 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"        # 错!这只映射 TCP

Q:镜像下载慢?
配国内镜像加速:

# /etc/docker/daemon.json
{
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
systemctl restart docker

Q:容器重启后存档没了?
没配 volume 或 volume 配错。数据必须在 volume 里,不能只在容器文件系统——容器删了数据就没了。

Q:Docker 占磁盘越来越大?
镜像层和旧容器累积。清理:

docker system df          # 看占用
docker system prune -a    # 清理所有不用的镜像、容器、缓存

Q:NAT 型服务器用 Docker 有什么注意?
端口映射链条变长了:公网 → 网关映射 → 宿主机 → 容器。确认:

  1. 服务商网关映射了对应端口
  2. 宿主机防火墙放行
  3. Docker 端口映射正确(docker ps 看 PORTS 列)
  4. 三层都对上,少一层就进不去

Q:性能比原生部署差吗?
网络场景 Docker 有 NAT 转发开销,UDP 游戏流量大时可能多 1-3% CPU。内存场景几乎无差别。可以接受,别为这点开销放弃 Docker 的管理便利。

小结

游戏服 Docker 化三步走:选镜像 → 写 compose(端口+数据卷+资源限制)→ 备份数据卷。多游戏用一个 compose 管,更新用 Watchtower 自动跑,迁移就是打包数据卷 + 拷贝 compose 文件。不想折腾的话,直接用带一键开服面板的服务商更省事。

更多 Docker 教程见财富云计算知识库:Docker 基础命令、Compose 编排、故障排查全系列。需要云服务器可以看看财富云计算:一键开服面板,NAT 型无独立公网 IP,价格比独立 IP 机型省一半以上。

延伸阅读
  1. 网站环境怎么选:LNMP 手动 / 宝塔面板 / Docker / 云开发
  2. 问卷表单系统搭建:SurveyKing / Formbricks,数据自己收
  3. 图床搭建:Lsky Pro / Lychee,自托管图片托管方案
  4. 邮件列表搭建:listmonk 自托管 Newsletter,把读者握在自己手里
  5. 文档站点搭建:MkDocs / VuePress / Docsify,产品文档与技术手册方案
  6. RSS 阅读器搭建:FreshRSS 自托管,把信息流拿回自己手里
  7. 短链接服务搭建:Shlink 自托管,链接数据自己掌握
  8. 网站状态监控页搭建:Uptime Kuma,服务器挂了第一时间知道
更多阅读
  1. 上一篇:Redis 持久化详解:RDB 与 AOF 怎么配、怎么选、怎么恢复
  2. 下一篇:游戏服 MOD 与插件管理完全指南:安装、更新、排错、防崩服
发表评论 6

取消回复