docker compose搭建Minecraft整合包服务端
序言
本文将演示如何使用 docker compose 搭建 Minecraft 模组服务端。后续内容以「All the mods 10」(简称 ATM-10)整合包 v7.0 版本(neoforge 服务端)为例,其他整合包或版本的操作思路也基本一致。
镜像准备
开服需要以下两个镜像:
eclipse-temurin:21-jre-jammyminecraft-atm10-server:7.0
其中 eclipse-temurin 可直接从公共仓库拉取,minecraft-atm10-server 则需要我们自行构建。
拉取 Java 运行环境镜像
ATM-10 服务端要求 Java 21 运行环境,这里选用 eclipse-temurin 镜像:
1 | docker pull eclipse-temurin:21-jre-jammy |
docker pull经常遇到拉取缓慢、超时甚至直接失败的问题,建议在有稳定网络环境下执行、配置国内镜像加速服务,或者使用DockerPull工具。
构建 Minecraft 服务端镜像
接下来构建 Minecraft 服务端镜像,首先下载服务端整合包。
本文示例 ATM-10 整合包发布地址
https://www.curseforge.com/minecraft/modpacks/all-the-mods-10
在发布页面右侧栏「Recent Files」>「Minecraft 1.21 Server Packs」中,找到「ServerFiles-7.0.zip」并下载。
在任意位置创建 Docker 镜像构建工程目录 build_mcserver_atm-10_7.0,将 ServerFiles-7.0.zip 解压到该目录下的 ServerFiles-7.0 文件夹,解压后的文件结构如下:
1 | build_mcserver_atm-10_7.0/ |
正常情况下,启动服务端应运行 startserver.bat(Windows 环境)或 startserver.sh(Linux 环境)。脚本会检查当前目录下是否存在 libraries 资源文件夹,如果不存在则自动执行 java -jar neoforge-21.1.228-installer.jar -installServer 来下载依赖资源。
然而网络环境比较差时这一步通常都会出问题,资源下载很难一次成功,通常是部分资源下载成功、部分失败。而 startserver 脚本只检测 libraries 文件夹是否存在,不检查资源完整性,只要文件夹存在,就会直接启动服务端,最终因缺失资源文件导致启动失败。
因此我们先不运行 startserver 脚本,改为手动执行服务端安装命令,直到所有资源下载完毕。
确保本机已安装 Java 环境(执行 java -version 能正常输出版本号),打开 PowerShell 或 CMD 执行:
1 | java -jar neoforge-21.1.228-installer.jar -installServer |
installer.jar的文件名请以你实际解压出来的为准。
运行后可能会出现部分资源下载失败的情况,错误提示类似:
1 | These libraries failed to download. Try again. |
反复执行上述命令,直到出现成功提示:
1 | java -jar neoforge-21.1.228-installer.jar -installServer |
1 | The server installed successfully |
资源下载完成后,在 ServerFiles-7.0 目录下新建 eula.txt 文件,内容如下:
1 | eula=true |
然后在 build_mcserver_atm-10_7.0 目录下创建 Dockerfile,内容如下:
1 | # 使用官方的 Eclipse Temurin Java 21 镜像作为基础镜像 |
最终的目录结构如下:
1 | build_mcserver_atm-10_7.0/ |
将 build_mcserver_atm-10_7.0 整个目录上传到安装了 Docker 的服务器(如果你是直接在服务器上进行上述操作则可跳过此步)。
进入该目录,执行以下命令开始构建镜像(注意:不要遗漏命令末尾的一个点「 . 」,它表示指定构建上下文为当前目录):
1 | cd /home/minecraft/build/build_mcserver_atm-10_7.0 # 替换成你的路径 |
构建完成后查询镜像列表确认:
1 | docker images |
如果出现以下镜像,说明构建成功:
1 | REPOSITORY TAG |
docker compose 运行服务端
准备 compose 工程
新建 docker compose 工程目录(例如 /home/minecraft/atm10_7.0),在该目录下创建 server-data 文件夹用于存放服务端数据,再创建 docker-compose.yml 配置文件,内容如下:
1 | services: |
关于挂载方式的说明:服务端根目录下有大量配置文件,为了便于修改,笔者选择将整个服务端根目录映射到宿主机。如果使用普通的 bind mount 方式,初次启动容器时 Docker 会将宿主机路径(此时为空)覆盖到容器内的
/minecraft,导致工作目录下所有文件被清空,从而启动失败。这里采用了driver: local+bind配合driver_opts的方式来实现持久化的 bind mount,初次创建容器时不会覆盖容器内的已有文件。使用前请确保device指定的宿主机目录已创建。
此时 compose 工程的目录结构应为:
1 | atm10_7.0/ |
启动与验证
一切就绪后,进入 compose 工程目录启动容器:
1 | cd /home/minecraft/atm10_7.0 # 替换成你的目录 |
等待几分钟到十几分钟,让服务端完成启动。大功告成!你可以通过以下命令查看实时日志,或者直接查看 server-data/logs/latest.log 文件:
1 | docker compose logs -f |