docker compose搭建Minecraft整合包服务端

序言

本文将演示如何使用 docker compose 搭建 Minecraft 模组服务端。后续内容以「All the mods 10」(简称 ATM-10)整合包 v7.0 版本(neoforge 服务端)为例,其他整合包或版本的操作思路也基本一致。

镜像准备

开服需要以下两个镜像:

  • eclipse-temurin:21-jre-jammy
  • minecraft-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
2
3
4
5
6
7
8
9
10
11
12
13
build_mcserver_atm-10_7.0/
└─ ServerFiles-7.0/
├─ config/
├─ datapacks/
├─ defaultconfigs/
├─ kubejs/
├─ local/
├─ mods/
├─ neoforge-21.1.228-installer.jar
├─ server-icon.png
├─ startserver.bat
├─ startserver.sh
└─ user_jvm_args.txt

正常情况下,启动服务端应运行 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
2
3
4
5
6
7
8
These libraries failed to download. Try again.

(下载失败的资源名称)
...
...
...

There was an error during installation

反复执行上述命令,直到出现成功提示:

1
java -jar neoforge-21.1.228-installer.jar -installServer
1
2
The server installed successfully
You can delete this installer file now if you wish

资源下载完成后,在 ServerFiles-7.0 目录下新建 eula.txt 文件,内容如下:

1
eula=true

然后在 build_mcserver_atm-10_7.0 目录下创建 Dockerfile,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 使用官方的 Eclipse Temurin Java 21 镜像作为基础镜像
FROM eclipse-temurin:21-jre-jammy

# 设置工作目录
WORKDIR /minecraft

# 复制文件
COPY ServerFiles-7.0/. /minecraft/

RUN ls -la \
&& chmod +x startserver.sh

# 设置环境变量,指向 Java 21
ENV ATM10_JAVA=/opt/java/openjdk/bin/java

# 设置容器启动时运行的命令
CMD ["./startserver.sh"]

最终的目录结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
build_mcserver_atm-10_7.0/
├─ ServerFiles-7.0/
│ ├─ config/
│ ├─ datapacks/
│ ├─ defaultconfigs/
│ ├─ kubejs/
│ ├─ libraries/
│ ├─ local/
│ ├─ mods/
│ ├─ eula.txt
│ ├─ neoforge-21.1.228-installer.jar
│ ├─ run.bat
│ ├─ run.sh
│ ├─ server-icon.png
│ ├─ startserver.bat
│ ├─ startserver.sh
│ └─ user_jvm_args.txt
└─ Dockerfile

build_mcserver_atm-10_7.0 整个目录上传到安装了 Docker 的服务器(如果你是直接在服务器上进行上述操作则可跳过此步)。

进入该目录,执行以下命令开始构建镜像(注意:不要遗漏命令末尾的一个点「 . 」,它表示指定构建上下文为当前目录):

1
2
cd /home/minecraft/build/build_mcserver_atm-10_7.0  # 替换成你的路径
docker build -t minecraft-atm10-server:7.0 .

构建完成后查询镜像列表确认:

1
docker images

如果出现以下镜像,说明构建成功:

1
2
REPOSITORY                TAG
minecraft-atm10-server 7.0

docker compose 运行服务端

准备 compose 工程

新建 docker compose 工程目录(例如 /home/minecraft/atm10_7.0),在该目录下创建 server-data 文件夹用于存放服务端数据,再创建 docker-compose.yml 配置文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
mcserver_atm10_7.0:
image: minecraft-atm10-server:7.0 # 刚刚构建的镜像名称
container_name: mcserver_atm10_7.0
restart: unless-stopped
ports:
- "25565:25565" # 服务端端口
- "25575:25575" # Rcon 服务端口(若开启 Rcon 则需要)
volumes:
- mcserver_data_atm10_7.0:/minecraft # 映射数据卷

volumes:
mcserver_data_atm10_7.0:
driver: local
driver_opts:
type: none
o: bind
device: /home/minecraft/atm10_7.0/server-data # 替换为你的数据存放路径

关于挂载方式的说明:服务端根目录下有大量配置文件,为了便于修改,笔者选择将整个服务端根目录映射到宿主机。如果使用普通的 bind mount 方式,初次启动容器时 Docker 会将宿主机路径(此时为空)覆盖到容器内的 /minecraft,导致工作目录下所有文件被清空,从而启动失败。这里采用了 driver: local + bind 配合 driver_opts 的方式来实现持久化的 bind mount,初次创建容器时不会覆盖容器内的已有文件。使用前请确保 device 指定的宿主机目录已创建。

此时 compose 工程的目录结构应为:

1
2
3
atm10_7.0/
├─ server-data/
└─ docker-compose.yml

启动与验证

一切就绪后,进入 compose 工程目录启动容器:

1
2
cd /home/minecraft/atm10_7.0  # 替换成你的目录
docker compose up -d

等待几分钟到十几分钟,让服务端完成启动。大功告成!你可以通过以下命令查看实时日志,或者直接查看 server-data/logs/latest.log 文件:

1
docker compose logs -f