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

时间:2017-01-14 14:46:55

标签: 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

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

似乎有两种工具可供选择:

  • docker cp似乎不适用于远程泊坞机
  • docker-machine scp似乎为此做了,对吗?

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

  $  dm scp -r /Users/alex/Documents/Project/data remote-machine:/usr/src/app/data

失败并显示错误消息:

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

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

2 个答案:

答案 0 :(得分:1)

本地路径与容器内路径

假设您将远程使用本地使用的相同模型,请记住路径/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中的image容器中添加web参数,然后构建并推送它。

    docker-compose build web
    docker-compose push web
    

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

    docker-compose pull web
    
    由于docker-compose.yml中的image参数(也存在于云服务器上),

    docker-compose将知道使用该图像。

    参考:Creating a new repository on Docker Hub

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

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

    docker-compose pull postgres
    
  5. docker cp和docker-machine scp怎么样?

    您在提问时提到了docker cpdocker-machine scp

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

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

答案 1 :(得分:0)

不确定哪个docker版本,但与问题中的陈述和@Dan_Lowe答案相反,这很好用:

docker cp ./data container:/usr/src/app/ 

docker cp是API的正常部分,因此它可以像任何其他命令一样工作,甚至可以远程执行。