在 Docker 中运行我的世界服务器

构建我的世界服务器基础镜像

创建 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
FROM openjdk:21

# 设置工作目录
WORKDIR /workspace

# 复制入口脚本到根目录
COPY entrypoint.sh /entrypoint.sh

# 声明暴露端口(TCP协议)
EXPOSE 25565 25575

# 设置容器启动时执行的入口点
ENTRYPOINT ["/entrypoint.sh"]

创建入口脚本 entrypoint.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/sh

# 检查start.sh是否存在,不存在则创建
if [ ! -f ./start.sh ]; then
echo "#!/bin/sh" > ./start.sh
echo "echo '启动脚本执行'" >> ./start.sh
echo "echo '容器工作目录: $(pwd)'" >> ./start.sh
echo "echo 'Java版本信息:'" >> ./start.sh
echo "java --version" >> ./start.sh
chmod +x ./start.sh
fi

# 执行start.sh并传递所有参数
exec ./start.sh "$@"

赋予可执行权限

1
chmod +x entrypoint.sh

构建镜像

1
docker build -t minecraft-server:0.0.1 .

运行

1
docker run -it -p 25565:25565 -v /data/docker/minecraft/server:/workspace --name minecraft-server-1.21.3 minecraft-server:0.0.1

镜像第一次运行时会创建 start.sh 脚本,在脚本内执行服务器运行命令,如:

1
2
#!/bin/sh
java -Xmx10G -Xms1G -jar paper-1.21.3-81.jar nogui

上传好服务端启动文件等基础文件之后再次启动容器即可。

使用 MCSM 托管我的世界服务器

这里使用 Docker 托管 MCSM,不直接在主机上面安装

创建如下 docker-compose.yml 文件,用来运行 mcsmanager-daemon,可自需更改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
services:
mcsm-daemon:
image: docker.1ms.run/githubyumao/mcsmanager-daemon:v10.5.0
container_name: mcsmanager-daemon
restart: always
networks:
- 1panel-network
ports:
- "40000:24444"
volumes:
- /data/docker/mcsm/daemon:/opt/mcsmanager/daemon/data
- /data/docker/mcsm/daemon:/data/docker/mcsm/daemon
- /var/run/docker.sock:/var/run/docker.sock
labels:
createdBy: "Apps"
networks:
1panel-network:
external: true

安装好 MCSManager 前后端之后,正常创建Docker实例即可。

使用 Docker 运行 MCSM 后端时的注意点

daemon 与 mc-server 容器是平级的,daemon 容器中有 /opt/mcsmanager/daemon/data,因为已经挂载,但是主机当中没有,这时候 mc-server 容器启动时想要挂载 /opt/mcsmanager/daemon/data,会出现找不到目录的报错,/data/docker/mcsm/daemon:/data/docker/mcsm/daemon daemon 多挂载一个目录,将 /data/docker/mcsm/daemon 作为 daemon 配置的工作目录,这时候 daemon 在启动 mc-server 容器时,会自动配置成 /data/docker/mcsm/daemon,这个目录在主机中是存在的,所以就避免报错了。

如果 daemon 前后挂载点都是 /opt/mcsmanager/daemon/data 的话,是不会出现这个问题的,我认为这是一个BUG,但是这个BUG能在代码层次之外解决掉。