【问题标题】:Docker mysql image - move internal container DB to the volumeDocker mysql 映像 - 将内部容器数据库移动到卷
【发布时间】:2017-10-13 02:49:54
【问题描述】:

我已经开始使用 docker 和 docker-compose 我定义了数据库。由于我没有在配置中定义卷(我的错误),数据库已经在容器内创建,现在当我下次运行 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

【问题讨论】:

  • 如果你没有删除你的容器,你可以在你的主机文件系统中找到/var/lib/docker/中的所有文件。

标签: docker docker-compose


【解决方案1】:

运行docker pull mysql:5.6 不会丢失数据,因为您运行的是mydbimage 的实例。

此外,除非您使用docker rm -v 删除容器,否则不会丢失数据。 Docker Compose 也不会删除卷,除非您运行 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
【解决方案2】:

如果您仍然拥有包含该数据的容器(已退出并停止),则第一步是将其作为图像提交,以便丢失数据。
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

【讨论】:

  • A docker commit 从不保存容器的卷。
  • @RicardoBranco 这个问题的重点是容器根本没有 no 卷。提交的目标是保存容器中写入的任何内容。
  • 这取决于原始图像(mysql、postgres等)是否定义了一个卷。
  • @RicardoBranco 可能,但“因为我没有定义卷”告诉我不然。让我们等待OP对此的评论。
  • @RicardoBranco 我添加了一个卷备份过程的链接,以防 OP 的容器确实包含它自己的卷。这应该涵盖这两种情况。
猜你喜欢
  • 2015-02-18
  • 2015-01-26
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
  • 1970-01-01
  • 2014-02-24
  • 2015-02-25
相关资源
最近更新 更多