我已经在Docker中设置了一个基本的MariaDB实例-基本上是从使用Kitematic UI启动容器,更改设置,然后让它运行。
今天,我想做一个备份,所以我使用Kitematic更改端口,这样我就可以从一台机器访问它来进行自动备份。在Kitematic中更改端口后,它似乎已经启动了一个新的MariaDB容器(即我的所有数据似乎都被删除了)。
这是预期的行为吗?更重要的是,有没有办法恢复看似丢失的数据,或者它已经被完全删除了?
另外,如果数据确实被删除了,那么在不丢失所有更改的情况下更改设置(比如公开的端口)的首选方法是什么?docker commit
?
指出:
- 运行docker 1.12.0 beta for OS X
-
docker -ps a
显示数据库状态为"Up for X minutes",而原始数据库已经启动了几天
提前感谢!
更新:
看起来,保留数据(不创建卷或类似的)的推荐过程是:
- 提交更改(例如
docker commit <containerid> <name/tag>
) - 使集装箱脱机
- 更新设置,如暴露端口或其他
- 运行已提交更改的映像
…
是的,这是预期的行为。如果您希望您的数据是持久的,您应该从主机(通过--volume
选项docker run
)或从另一个容器挂载卷,并将您的数据库文件存储在这个卷上。
docker run --volume /path/on/your/host/machine:/var/lib/mysql mariadb
丢失更改实际上是容器的核心特性,因此不能省略。这样,您可以确保在每个docker run
之间,您可以获得新鲜的环境,而无需任何更改。如果你想让你的更改是永久的,你应该在你的图像的Dockerfile
,而不是在容器本身。
更多信息请访问官方文档:https://docs.docker.com/engine/tutorials/dockervolumes/
看起来您没有将容器卷挂载到特定路径。您可以在这里阅读卷和存储数据到容器
您需要运行带有卷选项的容器
$ docker run --name some-mariadb -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mariadb:tag
其中/my/own/datadir
为主机目录