当前位置: 首页 > 知识库问答 >
问题:

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

闾丘昊然
2023-03-14

我已经开始在定义数据库的地方使用docker和docker组合。因为我没有在配置中定义卷(我的错误),所以数据库已经在容器中创建,现在下次运行docker-拉的时候,我将重新创建这个数据库,导致我的数据丢失。在不丢失数据的情况下将数据移出容器的最佳方法是什么?

  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个答案

戚同
2023-03-14

如果您仍然拥有包含该数据的容器(退出并停止),您的第一步将是将其作为映像提交,以免丢失数据
请参见docker容器提交。这将保存容器内容,而不是其卷...但是无论如何它没有卷。

如果您的容器定义了自己的内部卷,请查看“我如何用它的数据卷备份Docker容器?”适用于您的情况。

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

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

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

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

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

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

请参阅"Docker上的MySQL:构建容器映像"

但如果容器停止运行,则无法在其中执行命令(问题30361)

艾星河
2023-03-14

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

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

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

docker运行--rm--卷-从$容器ubuntu tar-zcvf- /var/lib/mysql

注意:用容器的名称或ID替换$container

然后可以将tarball解压缩到主机上的某个位置,比如/var/mysql,如果需要,可以更新mydbimage,并将这一行添加到Docker文件中:

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

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

 类似资料:
  • 安装配置镜像仓库docker-distribution 安装 # yum -y install docker-distribution # systemctl enable docker-distribution.service # systemctl start docker-distribution.service # systemctl status docker-distribution.

  • 好的,我需要一个功能,我需要能够在图像本身的框架内正确定位图像。 正如您在图像中看到的,图像容器的大小是固定的,如果图像大于框架本身,我需要能够在框架内重新定位图像。我尝试用矩形剪切图像并将图像定位在矩形内,但剪辑会创建一个等于矩形大小的新图像,因此到目前为止还没有成功。类中是否有任何属性可以让我们移动图像位置?所以我找不到任何属性。非常感谢任何帮助。谢谢。

  • 我们注意到我们的容器占用了很多空间,其中一个原因是图像。 我们想移动图像。 我知道现在它们存储在

  • 我在Jackrabbit节点内容从一个路径移动到另一个路径时遇到了问题。 尝试将节点下的文档列表(从jcr中的临时节点)移动到新路径(新节点,不包含任何文档)。 节点是混合类型的。 以下是创建文档节点的部分代码片段: 节点类型说明: 希望使用jcr api本身移动内容,而不是让所有子节点迭代并移动到目标文件夹。 使用Jackrabbit core 2.6.0和JCR 2.0。

  • 使用dockerfile打包太麻烦了!比如我想自己搭建一套php的开发环境,做成镜像,以后随时可用。并且我习惯使用堡塔作为面板工具。如果使用dockerfile的化,成本就太高了。 使用commit或者import/export的方式会导致镜像非常大! 是否有其他高效的打包方式可以,将容器打包成镜像?

  • 我正在使用PostgreSQL创建一个简单的Spring Boot应用程序。我使用“docker-comush up”创建了2个图像和容器,我还使用Flyway将我的数据库表迁移到容器中。 问题是如何移动数据,或者如何在Docker容器应用程序上访问本地计算机上的数据库数据? 我在Docker容器上运行我的应用程序,并使用获取HTTP方法,但没有数据。我得到一个空的JSON,而如果我不使用Dock