我在Docker容器中运行了一个小的webapp。它使用在同一个盒子上运行的mariadb数据库,基于官方的“mariadb”图像。
当我第一次设置这些容器时,我使用“内部”数据库启动了mariadb容器。我给了“/ var / lib / mysql”一个卷名,但我没有将它映射到主机上的目录(“-v vol-name:/ var / lib / mysql”)。实际上,我甚至不确定为什么我给它一个卷名。我几个月前就设置了这个,我不知道为什么我会这样做。
无论如何,我已经得出结论,拥有容器内部的数据库并不是一个好主意。我已经确定我确实需要将实际数据库存储在主机上并使用卷映射来引用它。我知道如何从头开始设置这个,但是现在应用程序正在运行,我需要将数据库移动到主机并重新启动容器指向它。我不确定实现这一目标的所有正确步骤。
此外,我还需要使用基于相同图像的容器来设置此应用程序的第二个实例。第二个数据库也将存储在主机上,在另一个目录旁边的目录中。我可以使用第一个数据库中的备份文件初始化第二个数据库,但我可能会手动清空第二个实例中的大多数表。
我确实在容器内使用mysqldump来转储数据库,然后我将该备份文件复制到主机。
我知道如何在“docker run”中设置卷映射,以将容器中的/ var / lib / mysql映射到主机上的某个位置。
此时,我不确定该如何处理此备份文件,因此我可以使用修改后的卷映射重新启动容器。我知道我可以运行“mysql dbname< backup.sql”,但我不确定其后果。
答案 0 :(得分:1)
当容器正在运行时,运行docker cp
-a CONTAINER:/var/lib/mysql /local/path/to/folder
将MariaDB数据库从容器复制到本地计算机。将“CONTAINER”替换为MariaDB容器的名称或ID。
完成后,您可以停止容器并重新启动它,将/local/path/to/folder
绑定到容器的/var/lib/mysql
路径。
如果您使用的旧版本的docker不支持-a
或--archive
标记,则可以复制没有该标记的文件但是您需要确保该文件夹在主机上具有正确的所有权:文件夹的UID和GID必须与Docker容器中文件夹的UID和GID匹配。
注意:如果您正在使用SELinux,您可能还需要设置适当的权限,因为MariaDB图像的documentation表示:
请注意,启用了SELinux的主机系统上的用户可能会遇到此问题。当前的解决方法是将相关的SELinux策略类型分配给新的数据目录,以便允许容器访问它:
$ chcon -Rt svirt_sandbox_file_t /my/own/datadir