通过SSH推送Docker镜像(分布式)

TL; DR基本上,我正在寻找这个:

docker push myimage ssh://myvps01.vpsprovider.net/ 

我没有把握整个Docker Hub / Registry的基本原理。 我知道我可以运行一个私人registry,但为此我必须build立实际运行服务器的基础设施。

我深入了解Docker的内部工作(至less是文件系统),看起来像Docker的图像层只是一堆压缩文件,或多或less地有一些精心devise的文件命名。 我天真地认为这不是一个简单的Python脚本来做分布式推/拉,但当然我没有尝试,所以这就是为什么我问这个问题。

有没有技术上的原因,为什么docker不能像Git或Mercurial一样分布式(无服务器)推/拉?

我认为这将是一个巨大的帮助,因为我可以将我在笔记本电脑上构build的映像直接推送到应用程序服务器上,而不是先推到某个地方的repo服务器,然后从应用程序服务器上拉出。 或者,也许我刚刚误解了这个概念,registry是我绝对需要的一个非常重要的function?

编辑一些上下文,希望解释为什么我想这个,考虑以下情况:

  • 开发,testing在我的笔记本上完成(OSX,运行Docker机器,使用docker-compose来定义服务和依赖)
  • 通过脚本部署到实时环境(自编写,bash,在dev机器上很less依赖,基本上只是Docker机器)
  • 部署到除SSH访问和Docker守护程序之外的依赖性很less的新VPS。
  • 没有“永久性”服务在任何地方运行,即我特别不想托pipe一个永久运行的registry(特别是所有的VPS实例都不可访问,尽pipe这可能会通过一些聪明的SSH隧道来解决)

目前最好的解决scheme是使用Docker机器指向VPS服务器并重build它,但是它会减慢部署,因为我必须每次都从源代码构build容器。

如果你想将Docker镜像推送给给定的主机,Docker中已经有了一切可以允许这样做。 以下示例显示如何通过ssh推送泊坞窗图像:

 docker save <my_image> | ssh -C user@my.remote.host.com docker load 
  • docker保存将产生一个您的docker图像(包括其图层)的tar档案,
  • -C是为了ssh来压缩数据stream
  • docker装载从tar档案创build一个docker图像

请注意,docker registry + docker pull命令的组合具有仅下载缺失图层的优点。 所以如果你经常更新一个Docker镜像(添加新的图层或者修改最后几层),那么docker pull命令会比通过ssh推送完整的docker镜像产生更less的networkingstream量。

将图像保存/加载到Docker主机并推送到registry(私有或集线器)是两回事。

前者@Thomasleveil已经解决了。

后者实际上确实有“聪明”只推动所需的层次。

您可以使用私人registry和几个派生图像轻松地testing这个。

如果我们有两个图像,一个是从另一个图像派生的,那么就这样做:

 docker tag baseimage myregistry:5000/baseimage docker push myregistry:5000/baseimage 

将推送所有尚未在registry中find的图层。 但是,当您然后再推送派生的图像:

 docker tag derivedimage myregistry:5000/derivedimage docker push myregistry:5000/derivedimage 

你可能会注意到,只有一个层被推送 – 只要你的Dockerfile被构build,它只需要一层(例如按照Dockerfile最佳实践链接RUN参数)。

在您的Docker主机上,您也可以运行一个Dockerised私有registry。

请参阅Containerized Dockerregistry

据我所知,截至写这篇文章时,registry推/拉/查询机制不支持SSH,但只支持HTTP / HTTPS。 这不像Git和朋友。

请参阅不安全的registry ,了解如何通过HTTP运行私有registry,尤其要注意的是您需要更改Docker引擎选项并重新启动它:

打开/ etc / default / docker文件或/ etc / sysconfig / docker进行编辑。

根据您的操作系统,引擎守护程序启动选项。

编辑(或添加)DOCKER_OPTS行并添加–insecure-registry标志。

例如,此标志采用registry的URL。

DOCKER_OPTS =“ – 不安全registrymyregistrydomain.com:5000”

closures并保存configuration文件。

重新启动你的Docker守护进程

您还将find使用自签名证书的说明,允许您使用HTTPS。

使用自签名证书

 [...] 

这比不安全的registry解决scheme更安全。 您必须configuration每个需要访问您的registry的docker守护进程

 Generate your own certificate: mkdir -p certs && openssl req \ -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key \ -x509 -days 365 -out certs/domain.crt Be sure to use the name myregistrydomain.com as a CN. Use the result to start your registry with TLS enabled Instruct every docker daemon to trust that certificate. This is done by copying the domain.crt file to /etc/docker/certs.d/myregistrydomain.com:5000/ca.crt. Don't forget to restart the Engine daemon.