3分钟用Docker一键搭建DNF私服
2026/8/18 18:29:40 网站建设 项目流程

3分钟用Docker一键搭建DNF私服

【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf

搭建DNF私服最劝退的不是游戏本身,而是没完没了的环境配置:依赖装不上、端口对不上、服务起不来。现在,一个Docker容器化部署方案把整个服务端打包进单一镜像,几条命令就能跑通全流程,全程只需3分钟。这篇实战指南按新手最容易卡住的5个问题来组织,照做就能跑通。

准备环境:先满足三个硬性条件再动手

动手前先看清门槛,避免白折腾:

项目要求
内存4GB以上(2GB最低,必须配置swap)
磁盘至少20GB可用空间
系统CentOS 7+ / Ubuntu 18.04+(非ARM架构)
软件Docker与Docker Compose

就这些,不需要装任何游戏依赖。项目基于官方CentOS基础镜像,把登录、频道、公会、拍卖行、数据库等服务全部整合进镜像1995chen/dnf,用环境变量控制配置,所以服务器上只需一个Docker。

装好后验证一下环境是否就绪:

docker --version

能看到版本号,就进入下一步。

一键部署:docker run 拉起完整游戏服务

这一节分两小步:先建数据目录,再启动容器。

前置条件:Docker已安装,内存不低于2GB。

第一步,创建数据目录。日志、数据库、PVF都落在宿主机上,方便备份和迁移:

mkdir -p /data/log /data/mysql /data/data

第二步,一键启动。下面命令可直接复制,只需把PUBLIC_IP换成你的公网IP(局域网部署填内网IP):

docker run -d \ -e PUBLIC_IP=你的公网IP \ -e WEB_USER=root -e WEB_PASS=123456 \ -e DNF_DB_ROOT_PASSWORD=88888888 \ -e GM_ACCOUNT=gmuser -e GM_PASSWORD=gmpass \ -e CLIENT_POOL_SIZE=10 \ -v /data/log:/home/neople/game/log \ -v /data/mysql:/var/lib/mysql \ -v /data/data:/data \ -p 2000:180 -p 3000:3306/tcp -p 7600:7600/tcp -p 881:881/tcp \ -p 7001:7001/tcp -p 7001:7001/udp \ -p 30011:30011/tcp -p 31011:31011/udp \ -p 30052:30052/tcp -p 31052:31052/udp \ -p 7300:7300/tcp -p 7300:7300/udp \ -p 2311-2313:2311-2313/udp \ --cap-add=NET_ADMIN --hostname=dnf \ --cpus=1 --memory=1g --memory-swap=-1 --shm-size=8g \ --name=dnf 1995chen/dnf:centos5-2.1.9.fix1

几个关键参数先混个脸熟:

参数默认值含义
PUBLIC_IP对外IP,客户端靠它连服务器
OPEN_CHANNEL11,52开启的频道,可写1-20,52-56
CLIENT_POOL_SIZE10客户端缓冲池,单人玩可降到3
GM_ACCOUNT / GM_PASSWORDgmuser / gmpass网关登录账号密码
--shm-size=8g不可删除共享内存,Docker默认64M带不动服务

启动后等待1~2分钟,首次运行会自动初始化MySQL数据。

验证是否成功,看三处:

  1. 看初始化日志,出现5条GeoIP Allow Country Code(圈内俗称"五国")即代表游戏服初始化完成:
tail -f /data/log/siroco11/Log$(date +%Y%m%d).init
  1. 看游戏进程是否存活:
docker exec dnf ps -ef | grep df_game
  1. 浏览器访问http://你的IP:2000,用WEB_USER/WEB_PASS登录Supervisor管理页,可实时查看每个进程的状态和日志。

想用 docker-compose 管理(群晖NAS推荐)?先克隆项目:

git clone https://gitcode.com/gh_mirrors/dnf/dnf

然后进入deploy/dnf/docker-compose/basic目录,执行docker-compose up -d即可,效果与上面命令一致。

读懂端口:一张架构图弄清服务分层

先看整体架构,一秒理解系统是怎么运转的:

服务大致分四层:接入层(stun打洞、relay中继、channel分流)负责客户端接入;游戏服务层(game频道服务器)承载核心玩法;功能模块层(公会、拍卖行、点券、监控)提供配套功能;数据存储层(MySQL)负责数据持久化。

对应到部署命令里,各端口作用如下:

端口作用
881统一网关(登录器连接入口)
7600登录器端口
2000Supervisor进程管理Web页面
3000MySQL数据库(注意不是3306)
7001频道分流服务 df_channel_r
30011/3101111频道游戏服务 df_game_r
30052/3105252频道游戏服务
7300P2P中继 df_relay_r
2311-2313NAT打洞 df_stun_r

想开更多频道?改环境变量OPEN_CHANNEL=1-20,52-56即可,每个频道大约多占200~300MB内存,按服务器配置量力而行。详细部署方式可参考doc/OtherDeploy.md

连接客户端:三步配置网关生成登录器

服务端就绪后,客户端要完成三件事。

第一步,装补丁:打开DOF补丁里的DNF.toml,把服务器地址改成你的PUBLIC_IP,再将补丁文件复制到游戏客户端根目录。

第二步,配置统一网关,参数如下:

配置项
网关地址你的PUBLIC_IP
网关端口881
登录账号 / 密码gmuser / gmpass
通信密钥763WXRBW3PFTC3IXPFWH
登录器端口7600
登录器版本20180307

第三步,生成登录器:点击"生成登录器",把生成的登录器和Config.ini复制到游戏根目录,双击即可进游戏。首次登录记得先在游戏里注册账号。

排查故障:三个高频报错当场解决

新手翻车基本集中在这三处,对号入座即可。

坑1:服务启动失败,一直卡在 Init DataManager 日志循环

  • 原因:内存或swap不足。
  • 解法:执行free -m确认swap是否生效;为服务器增加8G swap空间并同步调大--shm-size;内存实在不够就只开1个频道(OPEN_CHANNEL=11)。

坑2:客户端能进频道但点不进去(灰频道)

  • 原因:防火墙或安全组未放行对应端口。
  • 解法:关闭服务器防火墙;在云厂商安全组放行881、7600、3000、7001、7300、30011/31011等端口;最后确认PUBLIC_IP是客户端能访问到的地址。

坑3:统一网关提示无法连接数据库

  • 原因:数据库端口记成了3306。
  • 解法:本项目MySQL对外端口是3000,用户名root、密码默认88888888,确认3000端口已在安全组放行。

写在最后:记住这5点就够了

  • 整个服务就是一个容器,数据全在/data下,备份=打包目录,迁移=换机器重新run。
  • 配置全靠环境变量,改IP、频道、密码后执行docker restart dnf即可生效。
  • 内存不够优先加swap,别硬扛;单人玩把CLIENT_POOL_SIZE降到3,能省一大截内存。
  • 进程被系统杀掉很常见,docker restart dnf一键拉起,或在2000端口页面手动重启。
  • 想上多频道、站库分离、多大区甚至K8s?项目提供了现成编排文件,入口在deploy/dnf/docker-compose/deploy/dnf/k8s-deploy/,插件扩展见plugin/目录,照着示例改就能用。

最后提醒:本项目仅供学习研究使用,请勿用于商业运营。把服务器跑起来,叫上朋友重温阿拉德的冒险,这才是容器化部署最快乐的地方。

【免费下载链接】dnf项目地址: https://gitcode.com/gh_mirrors/dnf/dnf

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询