利用Docker搭建Minecraft服务器
发表:2024-06-16 16:15:35
修改:2024-06-16 16:15:35
更新一下halo,重新出现的docker没想到把一年前误删的第一篇文章找回来了,太惊喜了;可惜的是,更新之前顺手把服务器里留存了一年多的Minecraft文件夹删了。以下均为原文:
被软硬件的限制折磨老实了.
实现步骤:
购买服务器等等硬件条件
pull镜像
创建实例
具体实现:
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服务器
我又要开始碎碎念了:
麻了,还没褪去下载好镜像的喜悦,创建并打开实例后,服务器又连不上了。那怎么办,只能重启服务器了,md连服务器根本停不下来,顶不住了,十点多钟不想搞也没法继续弄了。等它重启到什么时候呢,先结束吧。
今天终于整好了,可为什么第二个人又连接不上?原来是正版验证没关。
为什么刚准备测试,服务器就崩了,彻底连不上的那种?估计是服务器配置太低了,直接崩溃了。关键是每次重启服务器就要花老长时间,恼。
总之,切换到1.7.10之后,终于稳定下来,开始总结了。花了整整一天时间就为了两行代码。