如何正确地将mariadb数据库从容器移动到主机

我有一个小的web应用程序在Docker容器中运行。 它使用基于官方的“mariadb”图像在同一个盒子上的另一个容器中运行的mariadb数据库。

当我第一次设置这些容器时,我使用“内部”数据库启动了mariadb容器。 我给“/ var / lib / mysql”一个卷名,但是我没有将它映射到主机上的一个目录(“-v vol-name:/ var / lib / mysql”)。 实际上,我甚至不知道为什么我给了它一个卷名。 我在几个月前就设置好了,我不确定为什么我会这样做。

无论如何,我已经得出结论,有一个数据库内部的容器是不是一个好主意。 我决定我真的需要在主机上存储实际的数据库,并使用卷映射来引用它。 我知道如何做到这一点,如果我从头开始设置,但现在应用程序正在运行,我需要将数据库移动到主机,并重新启动容器指向。 我不确定所有适当的步骤来做到这一点。

另外,我还需要使用基于相同图像的容器来设置此应用程序的第二个实例。 第二个数据库也将存储在主机上,在另一个目录旁边。 我可以用第一个备份文件初始化第二个数据库,但是我可能会在第二个实例中手动清空大部分表格。

我没有使用容器内的mysqldump转储数据库,然后我复制该备份文件到主机。

我知道如何在“docker run”中设置卷映射来将容器中的/ var / lib / mysql映射到主机上的一个位置。

在这一点上,我不确定如何处理这个备份文件,所以我可以用修改后的卷映射重新启动容器。 我知道我可以运行“mysql dbname <backup.sql”,但我不确定这会带来什么后果。

当容器运行时,运行docker cp -a CONTAINER:/var/lib/mysql /local/path/to/folder ,将MariaDB数据库从容器复制到本地机器。 将“容器”replace为MariaDB容器的名称或ID。

一旦你这样做,你可以停止容器,并重新启动绑定/local/path/to/folder到容器的/var/lib/mysqlpath。

如果您使用的是不支持-a--archive标志的较旧版本的--archive ,则可以复制没有该标志的文件,但是需要确保主机上的文件夹具有适当的所有权:文件夹的UID和GID必须与Docker容器中文件夹的UID和GID相匹配。

注意:如果您使用的是SELinux,则可能需要设置适当的权限,如MariaDB映像的文档所述:

请注意,启用了SELinux的主机系统上的用户可能会遇到问题。 目前的解决方法是将相关的SELinux策略types分配给新的数据目录,以便允许容器访问它:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir