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容器上?
假设您将远程使用与本地使用的相同模型,请记住该路径是容器内的/usr/src/app/data路径。当您将文件从一个系统复制到另一个系统时,只需将它们从当前系统复制到远程系统,然后将它们放在 docker-compose 知道如何找到它们的路径中,以挂载到新容器中。
因此,您所要做的就是将它们从这里复制到那里,并使用相对于 的 docker-compose.yml相同路径。它只知道你的外部卷为./data,所以如果你把目录放在同一个地方(从 docker-compose 的角度来看),一切都应该是一样的。
至于如何复制,这些只是文件,所以无所谓。scp -r应该可以,或者制作一个 zip 文件,复制它,解压缩到正确的位置,等等。复制文件的方法有很多,所以选择最适合您情况的方法。
在评论中,您对 docker-machine 中的本地操作与远程操作以及您还需要复制的内容表示困惑。这是更完整的解释:
在您的本地系统(我假设是您自己的 PC 或笔记本电脑)上,您安装了 docker-machine,并且您一直在使用它来进行所有开发。与此完全独立的是您要部署的新云实例。
要在云实例上运行本地已有的内容,云实例需要具有以下功能。
文件docker-compose.yml。
只要您计划使用 docker-compose 来运行它,它就必须可用。
你的.env文件。
由于您在此设置中使用环境文件,因此它必须可用,否则 docker-compose 无法使用它。
你的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
Run Code Online (Sandbox Code Playgroud)
然后在云实例上,您可以获取它:
docker-compose pull web
Run Code Online (Sandbox Code Playgroud)
image由于docker-compose.yml 中的参数(也存在于云服务器上),docker-compose 将知道使用该映像。
这些选项中哪一个更可取取决于您想要如何管理事物。任何一种都可以,但“本地构建”选项将要求您将任何所需的源文件也复制到云实例(构建过程中使用的任何文件)。
我在你的问题中没有看到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-machine托管虚拟机之间复制文件。要将文件复制到云实例,您可以更轻松地使用更通用的工具,例如 scp 或 sftp。
| 归档时间: |
|
| 查看次数: |
4574 次 |
| 最近记录: |