如何将本地卷移动到远程 docker 机器上

Ale*_*ail 5 docker docker-compose docker-machine docker-volume

我在云上有本地 docker 机器和远程 docker 机器。我的 docker-compose 应用程序有一个web具有以下配置的容器:

web:
  container_name: web
  restart: always
  build: ./web
  expose:
    - "8000"
  links:
    - postgres:postgres
  volumes:
    - /usr/src/app/static
    - ./data:/usr/src/app/data
  env_file: .env
  command: /usr/local/bin/gunicorn --workers 4 --timeout 120 --bind :8000 app:app
Run Code Online (Sandbox Code Playgroud)

重要的部分是第二卷。我有一个名为 data 的本地文件夹,其中包含大约 10GB 的数据。我首先将其设为一个卷,因为否则构建容器会花费很长时间。现在该应用程序已准备好投入生产,我想部署它。一个问题:现在我的远程web容器中安装了一个空数据文件夹。那么如何将数据从本地计算机移动到远程 docker 计算机上的容器中呢?我什至要把它移到哪里

似乎有两个工具可以实现此目的:

  • docker cp这似乎不适用于远程 docker 机器
  • docker-machine scp这似乎是为此而设计的,对吧?

我几乎肯定我需要使用其中的第二个,但由于我不太了解 docker 机器如何工作或它保存数据的位置,我不确定要使用什么目标路径:

  $  dm scp -r /Users/alex/Documents/Project/data remote-machine:/usr/src/app/data
Run Code Online (Sandbox Code Playgroud)

失败并显示错误消息:

scp: /usr/src/app/data: No such file or directory

我应该在哪里 scp 处理这些数据,以便将其正确安装在我的远程web容器上?

Dan*_*owe 2

本地路径与容器内路径

假设您将远程使用与本地使用的相同模型,请记住该路径是容器内的/usr/src/app/data路径。当您将文件从一个系统复制到另一个系统时,只需将它们从当前系统复制到远程系统,然后将它们放在 docker-compose 知道如何找到它们的路径中,以挂载到新容器中。

因此,您所要做的就是将它们从这里复制到那里,并使用相对于 的 docker-compose.yml相同路径。它只知道你的外部卷为./data,所以如果你把目录放在同一个地方(从 docker-compose 的角度来看),一切都应该是一样的。

如何复制文件

至于如何复制,这些只是文件,所以无所谓。scp -r应该可以,或者制作一个 zip 文件,复制它,解压缩到正确的位置,等等。复制文件的方法有很多,所以选择最适合您情况的方法。

具体需要复制什么?

在评论中,您对 docker-machine 中的本地操作与远程操作以及您还需要复制的内容表示困惑。这是更完整的解释:

在您的本地系统(我假设是您自己的 PC 或笔记本电脑)上,您安装了 docker-machine,并且您一直在使用它来进行所有开发。与此完全独立的是您要部署的新云实例。

要在云实例上运行本地已有的内容,云实例需要具有以下功能。

  1. 文件docker-compose.yml

    只要您计划使用 docker-compose 来运行它,它就必须可用。

  2. 你的.env文件。

    由于您在此设置中使用环境文件,因此它必须可用,否则 docker-compose 无法使用它。

  3. 你的web形象。

    您有build此容器的参数,但没有image参数。所以目前你唯一能做的就是docker-compose build web在本地生成一个镜像,然后 docker-compose 知道如何运行。

    另一种选择是添加一个image带有 的参数,repository:tag例如myuser/myapp_web:1.0,并将其推送到 Docker Hub。然后,在您的云实例上,可以从 Docker Hub 检索映像,而不是在本地构建它。

    在这种情况下,您可以在 docker-compose.yml 中imageweb容器添加参数,然后构建并推送它。

    docker-compose build web
    docker-compose push web
    
    Run Code Online (Sandbox Code Playgroud)

    然后在云实例上,您可以获取它:

    docker-compose pull web
    
    Run Code Online (Sandbox Code Playgroud)

    image由于docker-compose.yml 中的参数(也存在于云服务器上),docker-compose 将知道使用该映像。

    参考:在 Docker Hub 上创建新存储库

    这些选项中哪一个更可取取决于您想要如何管理事物。任何一种都可以,但“本地构建”选项将要求您将任何所需的源文件也复制到云实例(构建过程中使用的任何文件)。

  4. 我在你的问题中没有看到postgres容器来自哪里。如果您也在定制这个,那么对于web. 如果您为此使用公共图像,那么您不需要复制任何内容;docker-compose 会知道如何获取它,即你可以这样做:

    docker-compose pull postgres
    
    Run Code Online (Sandbox Code Playgroud)

docker cp 和 docker-machine scp 怎么样?

您在问题中提到了docker cp和。docker-machine scp

正如您已经确定的那样,docker cp这不是这里的解决方案。该命令用于在容器和主机文件系统之间复制文件。它与通过网络复制无关。

据我所知,docker-machine scp是在本地主机和docker-machine托管虚拟机之间复制文件。要将文件复制到云实例,您可以更轻松地使用更通用的工具,例如 scp 或 sftp。