我已经开始在docker-compose中使用docker来定义数据库。由于我没有在配置中定义卷(我的错误),数据库已在容器内创建,现在下次运行docker-pull时,我将重新创建此数据库,导致数据丢失。在不丢失数据的情况下将数据移出容器的最佳方法是什么?
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
答案 0 :(得分:3)
如果您在运行docker pull mysql:5.6
的实例时运行mydbimage
,则不会丢失数据。
此外,除非您使用docker rm -v
删除容器,否则不会丢失数据。除非您运行docker-compose rm -v
。
使用docker ps -a
获取运行mysql:5.6的容器的名称或ID并运行:
docker run --rm --volumes-from $container ubuntu tar -zcvf- /var/lib/mysql > /tmp/backup.tar.gz
注意:用容器的名称或ID替换$container
。
然后你可以将tarball解压缩到主机上的某个位置,比如/ var / mysql,如果你愿意,可以更新mydbimage
,并将这一行添加到你的Docker Compose YAML中:
volumes:
-v /var/mysql:/var/lib/mysql
注意:docker commit
永远不会将卷保存在容器中。
答案 1 :(得分:1)
如果您仍然拥有该数据的容器(退出并停止),您的第一步是将其作为图像提交,以便不松散数据。
见docker container commit
。这将节省容器内容,而不是其容量......但无论如何都没有容量。
如果您的容器已定义了自己的内部卷,请查看" How can I backup a Docker-container with its data-volumes?"适用于您的情况。
然后您可以基于该提交的图像(使用shell作为命令)运行新容器,这次是creating and mounting a new data volume container。
运行后,在该shell中,您可以将数据压缩/复制到卷路径(实际上将写入数据卷容器)
最后,您可以将该数据量容器重用到现有的docker-compose.yml
知道OP的图片是docker mysql:5.6,其Dockerfile defines its own internal volume,默认情况下不会备份。
在这种情况下,如果容器仍在运行,最简单的方法是制作dump of the database:
# Backup
docker exec CONTAINER /usr/bin/mysqldump -u root --password=root DATABASE > backup.sql
获得该数据后,您可以再次运行映像,这次是主机文件夹安装了卷,或者是数据卷容器。
请参阅" MySQL on Docker: Building the Container Image"
但是如果容器已停止,则无法在其中执行命令(issue 30361)