如何将Docker卷从一台机器复制到另一台机器?

15

我在本地机器上为Postgres创建了一个Docker卷。

docker create volume postgres-data

然后我使用这个卷并运行了一个Docker。

docker run -it -v postgres-data:/var/lib/postgresql/9.6/main postgres

之后我进行了一些数据库操作,这些操作自动存储在postgres-data中。现在我想将该卷从我的本地机器复制到另一台远程机器上。如何做到。

注意 - 数据库大小非常大


你在Docker中是否有叠加网络或已配置两台主机的Swarm模式? - BMitch
请查看http://stackoverflow.com/questions/27692915/can-docker-containers-not-docker-images-be-moved/27693337#27693337以及评论中提到的讨论。 - user2915097
@BMitch - 两台机器都在局域网中。 - murli2308
2个回答

17
如果第二台机器启用了SSH,您可以在第一台机器上使用Alpine容器映射卷并将其打包发送到第二台机器。具体操作如下:

在第一台机器上运行以下命令:

docker run --rm -v <SOURCE_DATA_VOLUME_NAME>:/from alpine ash -c \
    "cd /from ; tar -cf - . " | \
    ssh <TARGET_HOST> \
    'docker run --rm -i -v <TARGET_DATA_VOLUME_NAME>:/to alpine ash -c "cd /to ; tar -xpvf - "'

您需要更改:

  • SOURCE_DATA_VOLUME_NAME
  • TARGET_HOST
  • TARGET_DATA_VOLUME_NAME

或者,您可以尝试使用这个辅助脚本https://github.com/gdiepen/docker-convenience-scripts

希望这可以帮到您。


我在cli中遇到了一个错误。在另一台机器上,docker是通过sudo安装的。因此,我在你的命令中添加了sudo。 sudo:没有tty present和no askpass程序指定write / dev / stdout:broken pipe - murli2308
我解决了sudo问题。现在我遇到了“tar:short read. write /dev/stdout: broken pipe”错误。我尝试在另一台机器上运行docker,但它无法获取数据。 - murli2308
你在使用哪种方法?是单行代码还是辅助脚本? - Simon I
这一行是一个tar文件,如果你想尝试压缩它,那么你可以在两端添加-z选项,看起来像这样:docker run --rm -v <SOURCE_DATA_VOLUME_NAME>:/from alpine ash -c "cd /from ; tar -cfz - . " | ssh <TARGET_HOST> 'docker run --rm -i -v <TARGET_DATA_VOLUME_NAME>:/to alpine ash -c "cd /to ; tar -xpvfz - " - Simon I
注意:答案中的命令在行末缺少一个 ',否则它可以正常工作。在复制卷之前,请确保目标容器已停止。 - Peter Theill
显示剩余3条评论

4

我曾经有过完全相同的问题,但在我的情况下,两个卷位于不同的VPC中,无法向外界公开SSH。最终我创建了dvsync,它使用ngrok在它们之间创建隧道,然后使用rsync over SSH复制数据。在您的情况下,您可以在您的机器上启动dvsync-server:

$ docker run --rm -e NGROK_AUTHTOKEN="$NGROK_AUTHTOKEN" \
  --mount source=postgres-data,target=/data,readonly \
  quay.io/suda/dvsync-server

然后在目标机器上启动dvsync-client

docker run -e DVSYNC_TOKEN="$DVSYNC_TOKEN" \
  --mount source=MY_TARGET_VOLUME,target=/data \
  quay.io/suda/dvsync-client

NGROK_AUTHTOKEN 可以在 ngrok 控制面板 中找到,DVSYNC_TOKEN 则会在 dvsync-server 的 stdout 中显示。

同步完成后,dvsync-client 容器将停止运行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接