通过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.
- 在Docker中,如果我将networking设置为主机,是否需要发布端口?
- 如何在Windows Server 2016上部署到远程Docker主机?
- PhpStorm只运行本地PHPUnitconfiguration。 如何强制它使用远程(Docker)?
- 使用Docker传递Dockerfiles的参数组成
- 在使用Docker-Compose时,使用JPDA远程debugging将不会通过eclipse连接到Tomcat
- 将通配符从Docker容器复制到主机
- Docker容器中的Docker命令
- 在容器中运行webserver之前,将文件从主机复制到docker容器
- docker-compose不能用flask来设置环境variables