如何在不丢失数据的情况下更新特定Docker容器的镜像(以itzg/minecraft-bedrock-server为例)
嘿,我来帮你搞定这个MC服务器更新的问题!其实核心思路就是把游戏数据和容器本身分离开——这也是Docker设计的初衷,这样不管容器怎么删更,你的存档和配置都能稳稳保留。结合你用QNAP NAS+Container Station的环境,我给你两种可行的方案,命令行和GUI都有,你选顺手的来:
方法一:用SSH命令行操作(更高效可靠)
毕竟你已经有SSH权限,用命令行处理起来会更直接:
定位并停止旧容器
先列出所有容器,找到你的MC服务器容器的名字或ID:docker ps -a找到对应
itzg/minecraft-bedrock-server的那一行,记下容器名(比如假设是mc-bedrock-old),然后停止它:docker stop mc-bedrock-old不用担心容器 shutdown,我们只是要安全备份数据。
备份数据到NAS本地
itzg的MC基岩服镜像默认把世界存档、配置文件都存在容器内的/data目录,我们把整个目录复制到NAS的本地存储(比如/share/Public/mc-backup,你可以换成自己喜欢的路径):docker cp mc-bedrock-old:/data /share/Public/mc-backup等复制完成,你的所有数据就都安全存在NAS本地了。
删除旧容器并拉取最新镜像
现在可以放心删掉旧容器了:docker rm mc-bedrock-old然后拉取最新版本的镜像:
docker pull itzg/minecraft-bedrock-server用新镜像创建带数据挂载的新容器
关键来了——这次创建容器时,把刚才备份的本地目录挂载到新容器的/data路径,这样数据就和容器彻底分离了:docker run -d -it \ -p 19132:19132/udp \ -v /share/Public/mc-backup:/data \ --name mc-bedrock-new \ itzg/minecraft-bedrock-server解释一下参数:
-d -it:让容器在后台运行并保持交互模式-p 19132:19132/udp:映射基岩服需要的UDP端口(这个和你之前的设置一致就行)-v:把NAS本地的备份目录挂载到容器内的/data,这样新容器会直接用你旧的存档和配置--name:给新容器起个好记的名字
方法二:用Container Station GUI操作(适合可视化偏好者)
如果你更习惯用QNAP的图形界面,也能一步步搞定:
停止旧容器并备份数据
打开Container Station,找到你的MC服务器容器,点击「停止」。
进入容器的「详情」页面,切换到「文件」标签,找到/data目录,选中后点击「下载」,把整个目录保存到NAS的本地文件夹(比如Public目录下的mc-backup)。删除旧容器并创建新容器
回到容器列表,删掉旧容器。
点击「创建」,选择itzg/minecraft-bedrock-server的最新镜像(如果没自动更新,先点击「拉取」获取最新版本)。
在「存储」设置里,点击「添加」,选择「绑定挂载」:- 主机路径:选择你刚才备份数据的本地目录(比如
/share/Public/mc-backup) - 容器路径:填写
/data
接着配置好端口(确保UDP 19132映射正确)和其他你之前设置的参数,最后启动新容器即可。
- 主机路径:选择你刚才备份数据的本地目录(比如
后续更新的简化操作
这次搞定后,以后再更新镜像就简单多了:
- 停止当前容器:
docker stop mc-bedrock-new - 删除容器:
docker rm mc-bedrock-new - 拉最新镜像:
docker pull itzg/minecraft-bedrock-server - 用之前的
docker run命令重新创建容器——因为数据存在NAS本地的挂载目录里,完全不会丢失!
最后提醒一句:定期把NAS本地的mc-backup目录备份到其他存储(比如外接硬盘),双重保险更放心~
备注:内容来源于stack exchange,提问作者Evgeni Nabokov




