如何迁移主机之间的Docker卷?

Docker的文档指出卷可以被“迁移” – 我假设这意味着我应该能够将卷从一个主机移动到另一个主机。 (非常乐意在这一点上予以纠正。)但是,相同的文档页面不提供如何执行此操作的信息。

所以,我发现了一个较老的问题(大约是2015年),说这是不可能的,但考虑到这个问题还有两年的时间,我想我会再问一次。

如果有帮助,我正在开发一个使用[TinyDB] +本地磁盘作为数据存储的Flask应用程序 – 我已经确定,我不需要任何更多的花式; 这是一个目前为了学习而完成的项目,所以我决定变得非常轻便。 该项目的结构如下:

/project_directory |- /app |- __init__.py |- ... |- run.py # assumes `data/databases/ and data/files/` are present |- Dockerfile |- data/ |- databases/ |- db1.json |- db2.json |- files/ |- file1.pdf |- file2.pdf 

我有我的.dockerignore.gitignore文件夹data/* ,以便它们不被放置在版本控制下,并在构build图像时被Docker忽略。

在开发应用程序时,我也尝试使用尽可能接近真实世界的数据库条目和PDF,因此我在应用程序中embedded了一小部分真实数据,这些数据存储在已安装的卷上直接到data/当Docker容器被实例化时。

我想要做的是将容器部署在远程主机上,但是远程主机需要使用启动器数据(理想情况下,这是本地使用的卷,为了最大限度的方便)。 稍后在远程主机上添加更多的数据时,我希望能够将其撤回,以便在开发过程中使用最终用户input的最新数据。

环顾四周,我想要做的“hacky”的方式是简单地使用rsync ,这可能会工作得很好。 但是,如果有一个解决scheme我错过了,我将不胜感激指导!

我会这样做的方法是生成一个Docker容器,该容器存储要为开发环境提供种子数据的副本。 然后,您可以将该容器中的数据作为卷展示,最后将该卷装入您的开发容器中。 我将用一个例子来演示:

创build数据容器

首先,我们将创build一个包含您的种子数据的Docker容器,而不是别的。 我将在~/data/Dockerfile创build一个Dockerfile~/data/Dockerfile提供以下内容:

 FROM alpine:3.4 ADD . /data VOLUME /data CMD /bin/true 

然后你可以用下面的方法构build它

docker build -t myproject/my-seed-data .

这将为您创build一个标记为myproject/my-seed-data:latest的Docker镜像。 该图像仅包含您想为环境播种的所有数据,存储在图像中的/data中。 每当我们创build一个图像的实例作为一个容器,它会将/data中的所有文件作为一个卷来展示。

将卷装入另一个Docker容器

我想你正在运行你的Docker容器,像这样:

docker run -d -v $(pwd)/data:/data your-container-image <start_up_command>

现在你可以扩展它来执行以下操作:

 docker run -d --name seed-data myproject/my-seed-data docker run -d --volumes-from seed-data your-container-image <start_up_command> 

我们在这里做的是首先创build你的种子数据容器的一个实例。 然后,我们创build一个开发容器的实例,并将数据容器中的卷装入其中。 这意味着您将在开发容器中的/data处获取种子数据。

这会让你有一点点痛苦,那就是你需要运行两条命令,所以我们可以继续前进,用Docker Compose进行更好的编排

使用Docker Compose进行简单的编排

Docker Compose是一种同时运行多个容器的方法。 你可以声明你的环境需要看起来像做定义一样的事情:

“我的开发容器取决于我的种子数据容器的一个实例”

你创build一个docker-compose.yml文件来布置你需要的东西。 它看起来像这样:

 version: 2 services: seed-data: image: myproject/my-seed-data:latest my_app: build: . volumes_from: - seed-data depends_on: - seed-data 

然后,您可以使用docker-compose up -d my_app立即启动所有容器。 Docker Compose足够聪明,可以首先启动数据容器的实例,最后启动应用容器。

在主机之间共享数据容器

最简单的方法是将数据容器作为镜像推送到Docker Hub 。 一旦你build立了图像,它可以被推送到Docker Hub,如下所示:

docker push myproject/my-seed-data:latest

它在概念上非常类似于将Git提交推送到远程存储库,而在这种情况下,您正在推送一个Docker镜像。 然而,这意味着现在任何环境都可以获取这个图像并使用其中包含的数据。 这意味着当您有新的种子数据时,您可以重新生成数据映像,使用:latest标签将其推送到Docker Hub,当您重新启动您的开发环境时,将拥有最新的数据。

对我来说,这是共享数据的“Docker”方式,它使Docker环境之间的事情保持一致。 您也可以像Jenkins一样在CI环境中定期生成数据容器。