如何将docker volume从一台机器复制到另一台机器?

时间:2017-03-23 10:26:07

标签: postgresql docker

我在本地计算机上为postgres创建了一个docker卷。

docker create volume postgres-data

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

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

之后我做了一些数据库操作,这些操作自动存储在postgres-data中。现在我想将该卷从本地计算机复制到另一台远程计算机。怎么做。

注意 - 数据库大小非常大

2 个答案:

答案 0 :(得分:7)

如果第二台机器启用了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

希望这有帮助。

答案 1 :(得分:3)

我有一个完全相同的问题,但就我而言,两个卷都位于单独的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 dashboard中找到NGROK_AUTHTOKEN,并且DVSYNC_TOKEN在其标准输出中显示dvsync-server

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