我使用了对此问题提供的答案的变体:How to deal with persistent storage (e.g. databases) in docker。特别是,我遇到了备份/恢复过程的问题。这是故事......
我创建了一个简单的图像用作容器。 Dockerfile看起来像这样:
FROM busybox
VOLUME /var/lib/mysql
CMD /bin/sh
我使用以下命令从此图像创建了一个容器:
docker build -t myimages/datastore .
docker run --name mysql_data myimages/datastore true
然后我构建了tutum/mariadb图像并创建了一个容器:
docker run -d -p 3306:3306 --volumes-from mysql_data tutum/mariadb
一切正常。我可以使用mysql
客户端连接到数据库并执行数据库操作。具体来说,我这样做了:create database testdb;
和create table testtbl select 1 as 'id', 'hello' as 'word';
。
接下来,我试图备份我的容器。在回答上述问题(稍作修改)之后,我做到了这一点:
docker run --rm --volumes-from mysql_data -v $(pwd):/backup busybox \
tar cvf /backup/backup.tar /var/lib/mysql
瞧瞧!我在主机上的备份文件夹中有一个backup.tar
文件。
因此,作为最后一步,我尝试使用以下一系列命令恢复备份:
docker run --name mysql_data2 myimages/datastore true
docker run --rm --volumes-from mysql_data2 -v $(pwd):/backup busybox \
tar xvf /backup/backup.tar -C /var/lib/mysql/
我创建了一个新的MariaDB容器,用于从新数据容器中导入卷:
docker run -d -p 3308:3306 --volumes-from mysql_data2 tutum/mariadb
新的数据库容器启动得很好,我用mysql
客户端连接到它,并检查了数据库。问题出现在哪里:我没有testdb
数据库(如上所述),而是拥有var
数据库;而不是在新数据库中有一个testtbl
表,没有表。
谁能看到我做错了什么?谢谢!
答案 0 :(得分:2)
由于MySQL存储数据的方式,似乎以这种方式进行(通过将数据库文件复制出容器)根本不起作用。具体来说,InnoDB文件不能被复制 - this documentation表明
如果您的数据库包含InnoDB表,则表文件复制方法不起作用...因为InnoDB不一定将表内容存储在数据库目录中。此外,即使服务器没有主动更新数据,InnoDB仍然可能已将修改后的数据缓存在内存中而不会刷新到磁盘。
所以对这个问题的简短回答是"它不能以这种方式完成"。答案很长就是使用mysqldump
或类似的工具来做到这一点。