泊坞窗的MySQL图像 – 将内部容器数据库移动到卷

我已经开始在Docker-compose中使用docker,在那里定义数据库。 由于我没有在configuration中定义的卷(我的错误),数据库已经在容器内创build,现在下次运行docker-pull时,我将重新创build数据库,导致数据丢失。 将数据移出容器而不丢失数据的最佳方法是什么?

db: image: "mydbimage" environment: MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}" MYSQL_DATABASE: "jirio" MYSQL_USER: "${DB_USERNAME}" MYSQL_PASSWORD: "${DB_PASSWORD}" 

Dockerfile

 FROM mysql:5.6 ADD schema.sql /docker-entrypoint-initdb.d/schema.sql 

如果您运行docker pull mysql:5.6您将不会丢失数据,因为您正在运行mydbimage一个实例。

另外,除非使用docker rm -v删除容器,否则不会丢失数据。 除非运行docker-compose rm -v ,否则Docker Compose不会除去卷。

获取正在运行mysql的容器的名称或标识:5.6使用docker ps -a并运行:

docker run --rm --volumes-from $container ubuntu tar -zcvf- /var/lib/mysql > /tmp/backup.tar.gz

注意:使用$container的名称或IDreplace$container container。

然后你可以解压tarball到主机上的某个位置,如/ var / mysql,如果你愿意的话可以更新mydbimage ,并且添加这行到你的Docker Compose YAML:

 volumes: -v /var/mysql:/var/lib/mysql 

注意: docker commit从不将卷保存在容器中。

如果您仍然拥有使用该数据的容器(退出和停止),那么您的第一步就是将其作为图像提交以便丢失数据。
请参阅docker container commit 。 这将节省容器的内容,而不是它的容量…但无论如何没有卷。

如果您的容器定义了自己的内部卷,请参阅“ 如何备份带有数据卷的Docker容器? ”适用于您的案例。

然后,您可以基于提交的映像(使用shell作为命令)运行一个新的容器,这次创build并装入一个新的数据容器 。
一旦运行,在该shell中,您可以将数据压缩/复制到卷path(实际上将写入到您的数据卷容器中)

最后,您可以将该数据卷容器重用到现有docker-compose.yml


知道OP的镜像是docker mysql:5.6 ,它的Dockerfile定义了自己的内部卷 ,默认情况下是不支持的。

在这种情况下,如果容器仍在运行,最简单的方法是创build数据库转储 :

 # Backup docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql 

获得该数据后,可以再次运行该映像,这次是使用装入卷的主机文件夹或数据卷容器。

请参阅“ Docker上的MySQL:构build容器映像 ”

http://severalnines.com/sites/default/files/blog/node_4752/image09.png

但是,如果容器停止,你不能执行命令( 问题30361 )