Docker mysql图像 - 将内部容器DB移动到卷

时间:2017-05-14 04:54:04

标签: docker docker-compose

我已经开始在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

2 个答案:

答案 0 :(得分:3)

如果您在运行docker pull mysql:5.6的实例时运行mydbimage,则不会丢失数据。

此外,除非您使用docker rm -v删除容器,否则不会丢失数据。除非您运行docker-compose rm -v

,否则Docker Compose也不会删除卷

使用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"

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

但是如果容器已停止,则无法在其中执行命令(issue 30361