gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:38:46 25 4
gpt4 key购买 nike

我有一个小型 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 数据库从容器复制到本地计算机。将“CONTAINER”替换为您的 MariaDB 容器的名称或 ID。

完成后,您可以停止容器并重新启动它,将 /local/path/to/folder 绑定(bind)到容器的 /var/lib/mysql路径。

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

注意:如果您使用 SELinux,您可能还需要设置适当的权限,如 documentation对于 MariaDB 镜像状态:

Note that users on host systems with SELinux enabled may see issues with this. The current workaround is to assign the relevant SELinux policy type to the new data directory so that the container will be allowed to access it:

$ chcon -Rt svirt_sandbox_file_t /my/own/datadir

关于mysql - 如何正确地将 mariadb 数据库从容器移动到主机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45923749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com