泊坞窗的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容器映像 ”
但是,如果容器停止,你不能执行命令( 问题30361 )
- 如何在Docker构build中将jar / war部署到nexus?
- Docker dm_task_run失败的错误
- 春季启动dockerized应用程序之间的沟通
- 连接Docker Swarm集群时出错 – wsarecv:现有连接被远程主机强制closures
- Docker与Make:构buildDockerfile上的图像变化
- Dockerizing现有的Django项目
- 当docker容器closures时,MySQL数据库不见了
- Docker:在内存文件系统中
- 在Docker-image microsoft / aspnetcore-build:1.1.0-msbuild中构buildASP.NET Core 1.1 preview4项目