将 docker 容器传送到远程主机的最佳方式是什么?

What is the best way to deliver docker containers to remote host?

我是 docker 和 docker-compose 的新手。我正在使用 docker-compose 文件和多种服务。当我使用 docker-compose 时,我在本地机器上有容器和图像,我的任务是将它们传送到远程主机。 我找到了几个解决方案:

  1. 我可以构建我的图像并将它们推送到某个注册表并拉取 他们在生产服务器上。但是对于这个选项我需要私人 注册表。正如我所认为的,注册表是一个不必要的元素。我 想 运行 直接反驳。

  2. 将 docker 图像保存到 tar 并将其加载到远程主机。我看到这个 post ,但在这种情况下,我需要 shell 脚本。或者我可以使用 docker直接 (Docker image push over SSH (distributed)), 但在这种情况下,我失去了 docker-compose.

    的好处
  3. 使用docker-machine (https://github.com/docker/machine)一般驱动。但在这种情况下,我只能将其用于部署 一台机器,否则我需要配置证书 ()。而且,对于我来说,这不是简单的解决方案。

  4. 使用 docker-compose 和参数主机 (-H) - 但在最后一个选项中,我需要在远程主机上构建图像。是否有可能 在本地机器上构建镜像并将其推送到远程主机?

  5. 我可以使用 docker-compose push (https://docs.docker.com/compose/reference/push/) 到远程主机, 但是为此我需要在远程主机上创建注册表并且我需要 每次添加主机名并将其作为参数传递给 docker compose。

将 docker 容器传送到远程主机的最佳做法是什么?

通过注册表(您的第一个选项)。所有 container-oriented 工具都支持它,并且在像 Kubernetes 这样的集群环境中本质上是必需的。您可以使用 Docker Hub,或来自 public-cloud 提供商的图像注册表,或 third-party 选项,或 运行 您自己的。

如果您不能使用注册表,那么 docker save/docker load 是下一个最佳选择,但我只建议您使用它处于类似 air-gapped 的环境中,构建系统和生产系统之间没有网络连接。

无法将图像从一个系统直接推送到另一个系统。出于安全原因,您应该避免启用 Docker 网络 API:任何可以访问 network-exposed Docker 套接字的人几乎都可以轻松地获取其主机。


独立于图像,您还需要将 docker-compose.yml 文件本身以及您 bind-mount 的任何配置文件传输到容器中。普通 scprsync 在这里工作正常。无法在纯 Docker 生态系统中转移这些。