利用Docker搭建Minecraft服务器

Author Avatar
白菀枯
发表:2025-04-04 21:25:46
修改:2025-04-07 18:55:57

发表:2024-06-16 16:15:35

修改:2024-06-16 16:15:35

更新一下halo,重新出现的docker没想到把一年前误删的第一篇文章找回来了,太惊喜了;可惜的是,更新之前顺手把服务器里留存了一年多的Minecraft文件夹删了。以下均为原文:

被软硬件的限制折磨老实了.

实现步骤:

  1. 购买服务器等等硬件条件

  1. pull镜像

  2. 创建实例

具体实现:

0. 前置条件

这里不再赘叙,我也是刚弄好,具体是阿里云Ubuntu服务器+宝塔。然后提前安装好docker。除去docker的安装,其他应该都无所谓,也与这篇文章关联不大。

1. 拉取镜像

• 执行docker pull itzg/minecraft-server

• 如果你也在多次漫长等待后得到了一个pull失败的结果,可以尝试配置docker的镜像源。我是参考的这篇文章,简直是我的救命稻草。

这一部分是我的碎碎念,仅为了解决pull失败我痛苦且漫长具体过程如下:

1. 网络不好就挂梯子呗,反复调试,捯饬好久没效果才想起这是服务器,跟自己代理有什么关系。

2. 那就先在本地整好,再上传回服务器。在Windows上安装好了一直用不上的Linux终于在这里有了作用,随即重新上面过程。反复调试。

3. 但是本地的结果竟然也是相同,想起每次打开的第一行好像已经说明了缘由:wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。

4. 好嘛,不想多想,VMware里的Ubuntu蠢蠢欲动。问题又来了,凭什么之前都能共享代理,现在又访问不了外网了?继续百度,好在教程很轻易搜到了。

5. 终于能访问Google和YouTube了,然后呢,反复调试,pull失败。

6. 偶然发现,在宝塔上能直接拉取镜像,而且能从docker hub上找的,兴致冲冲地点击“拉取”。漫长的等待……重新打开怎么窗口消失了?成功了?创建实例怎么没有这个选项,再来一遍,成功?!找不到?!反复调试。仔细观察,retry倒计时结束后就算成功了?寄。

7. 那就从网上找这个镜像呗,找教程,找官网,找不到,终究都是上面那一个命令。

8. 做到这从下午断断续续弄到晚上,心思直接不用上述镜像了,直接搞一个Java的镜像,从头搭建。

9. 又发现官方镜像都pull不下来。行,docker都不用了,直接部署在服务器上。

10. Java用apt下载又失败了docker-compose也不能用。这个好说,更新apt源就好。

11. 连更新apt都失败,和docker.list文件错误什么关系???百度都没有那个报错,人家说的路径都不是那个!直接删除把!不是说source.list吗,我怎么还有个.d?直接删除!

12. 这时突然心思到,那我是不是更新一下镜像源就行了?而且注意到宝塔的Docker服务里有个URL加速功能,这不稳了?修改,确定,拉取!是不是回显不一样了!!怎么还是失败了,再来一遍。原来是没重启,OK,重启,拉取!确实不一样了,欣欣向荣的时候卡住了,成功了!

13. 哎?怎么还是选不到这个镜像?反复下载重试,无果。

14. 加速是不是还在阿里云看过一个什么Docker加速的什么功能,哎,找到答案了这不!教程还就两步,哈~我为什么没有那个目录啊,服务器的Docker版本太低了吧,教程里特别写了版本高低的问题。

15. 升级Docker怎么也那么难啊。真是“柳暗花明又一村”啊,看了一下Docker版本是新的啊,再把教程打开就行了,原来刚才白忙活了一会。一次怎么没行那就按着教程多来几次吧。

16. 一遍遍的等待后均是不出意外的没有效果,哈哈,原来是忘记restart了。又是一遍遍的等待,还是出人意料的没有效果。回到宝塔加速页面,又看到它提供了多个镜像源,先把所有都试一遍吧。

17. 不是,我服务器怎么连不上了???什么叫tail:no files remaining ?

18. 忘了怎么解决的了,大概就是加速的文件写错了,重新多写多试几次又正常了。然而仍然是pull失败。

19. 终于终于,既然现成的用不了,那就从网上自己找源,找到了,成功了!

20. 漫长的等待后,itzg/minecraft-server的镜像终于下好了,之前做了多少无用功啊,现在不仅是docker源弄好了,apt也更新好了,VMware走代理弄好了。

2.创建实例

• 执行docker run -d -it --name myserver -p 25565:25565 -e EULA=TRUE -e TYPE=PAPER -e ONLINE_MODE=FALSE -e VERSION=1.20.2 -v /home/minecraft/data:/data itzg/minecraft-server

其中值得注意的有:

--name myserver:把容器名设为myserver。名字可以随便起,方便识别即可。

-p 25565:25565:主机的25565映射到容器的25565,这是Minecraft的默认端口。所以请务必在服务器开放此端口!

-v /home/minecraft/data:/data:指定挂载点的路径,即将这个mc服务器数据保存在/home/minecraft/data中,自己选择合适的目录即可。可以忽略这一部分,默认保存在/var/lib/docker/volumes/ 目录下,可以用docker inspect命令查看具体挂载点。

-e的部分除EULA=TRUE均可直接省略,如docker run -d -it --name myserver -p 25565:25565 -e EULA=TRUE-v /home/minecraft/data:/data itzg/minecraft-server,这样就会采取默认的方式

以下是-e的具体功能:

-e TYPE=PAPER:指定使用 Paper 服务器类型,Paper 是 Spigot 的一个高性能分支,提供更多功能和优化。默认为Vanilla服务器(香草服务器,纯净服)。

-e ONLINE_MODE=FALSE:正版登录验证。TURE为是;FALSE为否。默认为是。

-e VERSION=1.20.2:指定 Minecraft 服务器的版本。默认为最新版本。

其余意思的是:

-d:后台运行。

-it:分别是交互模式和分配一个伪输入终端。用于创建一个交互式的终端会话,并将它附加到正在运行的Docker容器中。

-e EULA=TRUE:设置环境变量,同意 Minecraft EULA。

itzg/minecraft-server:使用的Docker 镜像。

这时候一个基础的生存服务器就建好了,很难不让人打开游戏连接试一下。

• 找到自己服务器的公网ip形如192.0.0.1,然后在后面加上:25565就是自己服务器的地址。打开相应版本的mc,选择多人游戏的添加服务器,输入192.0.0.1:25565即可

如果这时候想继续配置游戏的信息,可以在/home/minecraft/data(即刚才创建路径的位置)路径下,找到server.properties文件,相应修改即可。至于如何在Linux打开修改,可以参考vim等等的编辑器教程。修改完成后记得docker restart myserver,相当于重启刷新一下。

具体内容可参考Minecraft WIKI的server.properties,其中在ai的翻译下,该文件的具体作用如下:

# Minecraft server properties

#(时间戳)

# 是否接受玩家之间的物品传送(仅在部分插件或mod中适用)

accepts-transfers=false

# 是否允许玩家飞行模式(需要在某些游戏模式下开启,如创造模式)

allow-flight=false

# 是否允许进入下界(Nether)

allow-nether=true

# 是否将控制台消息广播给所有OP玩家

broadcast-console-to-ops=true

# 是否将RCON消息广播给所有OP玩家

broadcast-rcon-to-ops=true

# 游戏难度设置,范围:peaceful, easy, normal, hard

difficulty=easy

# 是否启用命令方块

enable-command-block=false

# 是否启用JMX监控

enable-jmx-monitoring=false

# 是否启用GameSpy4协议服务器查询

enable-query=false

# 是否启用远程控制台(RCON)

enable-rcon=false

# 是否启用服务器状态查询(允许查询服务器状态)

enable-status=true

# 是否强制玩家使用安全档案登录(需要1.19+版本的客户端)

enforce-secure-profile=true

# 是否强制使用白名单

enforce-whitelist=false

# 实体广播范围百分比,用于控制实体更新的范围

entity-broadcast-range-percentage=100

# 是否强制使用默认游戏模式

force-gamemode=false

# 函数权限等级,范围:1-4(决定命令方块和函数的权限)

function-permission-level=2

# 默认游戏模式,范围:survival, creative, adventure, spectator

gamemode=survival

# 是否生成结构(如村庄、庙宇等)

generate-structures=true

# 自定义世界生成设置(通常用于定制世界生成器)

generator-settings={}

# 是否启用极限模式(死亡后世界删除)

hardcore=false

# 是否隐藏在线玩家列表

hide-online-players=false

# 初始禁用的资源包

initial-disabled-packs=

# 初始启用的资源包

initial-enabled-packs=vanilla

# 世界名称

level-name=world

# 世界种子(用于生成固定的世界)

level-seed=

# 世界类型,范围:minecraft:normal, flat, largeBiomes, amplified, buffet

level-type=minecraft:normal

# 是否记录玩家IP

log-ips=true

# 最大链式邻居更新次数(防止卡顿)

max-chained-neighbor-updates=1000000

# 最大玩家数量

max-players=20

# 最大游戏刻时间(防止服务器卡顿)

max-tick-time=60000

# 世界最大尺寸

max-world-size=29999984

# 服务器的MOTD(欢迎信息)

motd=A Minecraft Server

# 网络压缩阈值(低于此字节数的包不压缩)

network-compression-threshold=256

# 是否开启在线模式(在线模式验证玩家身份)

online-mode=true

# OP玩家的权限等级,范围:1-4

op-permission-level=4

# 玩家空闲超时时间(分钟),0表示不踢出空闲玩家

player-idle-timeout=0

# 是否防止代理连接

prevent-proxy-connections=false

# 是否开启PVP(玩家之间可以互相伤害)

pvp=true

# 服务器查询端口

query.port=25565

# 连接速率限制(每秒允许的最大连接数),0表示无限制

rate-limit=0

# RCON密码

rcon.password=

# RCON端口

rcon.port=25575

# 区域文件压缩类型

region-file-compression=deflate

# 是否要求使用资源包

require-resource-pack=false

# 资源包URL

resource-pack=

# 资源包ID(用于更新资源包)

resource-pack-id=

# 资源包提示信息

resource-pack-prompt=

# 资源包SHA1哈希值(用于验证资源包完整性)

resource-pack-sha1=

# 服务器IP地址(通常留空)

server-ip=

# 服务器端口

server-port=25565

# 模拟距离(影响实体行为的范围)

simulation-distance=10

# 是否生成动物

spawn-animals=true

# 是否生成怪物

spawn-monsters=true

# 是否生成NPC

spawn-npcs=true

# 重生点保护范围(非OP玩家无法在此范围内破坏或放置方块)

spawn-protection=16

# 是否同步区块写入(提高数据一致性,但可能会降低性能)

sync-chunk-writes=true

# 文本过滤配置文件(通常用于聊天过滤)

text-filtering-config=

# 是否使用本地传输(通常用于提高Linux系统上的网络性能)

use-native-transport=true

# 可视距离(客户端可见的区块数)

view-distance=10

# 是否启用白名单

white-list=false

3. 需要额外了解的东西

如果你无意间点进这个文章,这里就科普一下有关docker的最基本操作。

首先docker可以理解为一台虚拟机,这样管理、迁移起来什么的就不受买的那台服务器的限制了。

然后第一步pull的是一个镜像,第二部运行的叫做容器。镜像可以简单理解为在官网提供给你的像是Windows系统,容器就相当于笔记本电脑,笔记本需要用系统来充实自己。所以镜像需要运行在容器里,对于在容器里具体对镜像的操作,也不会影响到原本的镜像文件。

而在这里,我们就是用到了人家专门用于Minecraft联机的镜像。然后把这个镜像具体变成一个实际的服务器,就是步骤二所做的事情了。

docker ps:查看当前运行的容器

• 其中可以在STATUS一列看到当前的状态。

docker ps -a:查看所有容器

docker images:查看下载好的镜像

docker start myserver :打开myserver服务器

docker stop myserver :停止myserver服务器

docker restart myserver :重启myserver服务器

docker logs -f myserver:查看服务器日志

docker rmi myserver:删除myserver服务器

我又要开始碎碎念了:

  1. 麻了,还没褪去下载好镜像的喜悦,创建并打开实例后,服务器又连不上了。那怎么办,只能重启服务器了,md连服务器根本停不下来,顶不住了,十点多钟不想搞也没法继续弄了。等它重启到什么时候呢,先结束吧。

  2. 今天终于整好了,可为什么第二个人又连接不上?原来是正版验证没关。

  3. 为什么刚准备测试,服务器就崩了,彻底连不上的那种?估计是服务器配置太低了,直接崩溃了。关键是每次重启服务器就要花老长时间,恼。

  4. 总之,切换到1.7.10之后,终于稳定下来,开始总结了。花了整整一天时间就为了两行代码。

评论