Docker push需要很长时间

13

我有一个使用Docker的部署设置,流程如下:

  1. 在我的开发机上通过Dockerfile构建一个镜像
  2. 将该镜像推送到注册表(尝试过Docker Hub和Quay.io)
  3. 将此镜像拉到部署服务器,并重新启动容器。

我希望尽快完成这些步骤,但它们需要非常长的时间。即使对于一个中等大小的镜像(750MiB,包括标准的ubuntu和相关软件),在进行小修改后,部署需要17分钟。我优化了我的Dockerfile中项目的顺序,以便大多数时间都可以命中缓存的镜像,但好像没有什么作用。

主要问题是docker push 步骤,无论是Docker Hub还是Quay.io,推送镜像需要不现实地长时间。在我进行的一项简单基准测试中,我连续执行了两次docker push,因此之前的所有镜像都已经在注册表中了。所以我只看到了这些行:

...
bf84c1d841244f: Image already pushed, skipping
...

但是如果我按时推送,性能就很糟糕。即使所有镜像都已经在服务器上,推送到 Quay.io 需要3.5分钟!而推送到Docker Hub需要约12分钟

显然有什么地方出了问题,因为许多人都在生产中使用 Docker,这些时间完全与持续交付相反。

我该如何使其运行更快?其他人也遇到这种性能问题吗?这是否与注册表服务有关,或者与我的本地机器有关?

我正在 Mac OS X 下使用 Docker。

3个回答

6
注意:我运行自己的docker注册表,它是本地机器上发出“docker push”命令的,但仍需要花费很长时间。这绝对不是来自磁盘的I/O速率问题,因为它们由SSD支持(并且要澄清的是,它们与使用它们的任何其他内容一样高效,可达到每秒约500MB)。然而,docker push命令似乎需要的时间与将其发送到远程站点一样长。我认为还有一些超出“带宽”问题的东西。我的怀疑是,尽管我的注册表是本地的,但它仍然试图使用NIC传输数据(这似乎是有道理的,因为需要URI作为推送目标,而注册表本身是一个容器)。
话虽如此,我可以将相同的文件复制到它们最终驻留在本地注册表的位置,比推送命令快几个数量级。也许解决方案就是这样。然而,唯一明确的事情是,单独的问题不是带宽问题,而是可能是数据路径的一般问题。
无论如何,运行本地注册表不太可能(完全)解决OP的问题。虽然我刚开始调查,但我怀疑需要对docker进行代码更改才能解决这个问题。我认为这不是一个错误,而是一个设计上的挑战。即使源和目标是同一台机器/主机/容器,URI和/或主机<->主机通信也需要网络堆栈。

尽管你的评论很有用,但并未完全回答问题。你可以试着把评论简洁一些,并作为一个评论添加进去。 - Javier Elices
我实际上是想把它作为评论,很抱歉。我对iPosts还比较新。我是一个数据隐士。 - That one guy from the movie
没关系,没有任何伤害发生 :-). 您可以点击“添加评论”在问题下方进行评论。您也可以点击“删除”在您的回答下方进行删除。回答会被投票,应该回答问题并具有一定的质量。请参阅此处了解回答的要求。 - Javier Elices

1

先前的答案所述,您可能应该使用本地注册表。它安装和使用起来并不困难,在这里您可以找到相关信息以便开始使用。这样做可能会更快,因为您不受提供商上传速度限制的限制。顺便说一下,您总是可以将图像从本地注册表推送到Docker Hub或其他本地注册表(例如安装在客户网络中的注册表)。

还有一件事,我可以建议在持续集成和交付方面使用一些持续集成服务器,在Linux操作系统上自动构建映像,而无需使用boot2docker或docker-machine。对于测试和开发目的,您可以在本地构建映像,而不必进行远程注册表推送。


是的,Quay.io 3.5 分钟的加载时间可能是由于 OP 家宽上传带宽不够造成的。 - Adrian Mouat
@stanislav 感谢您的回复。我会研究运行本地注册表,但是为了明确起见,您认为问题是Quay和Docker Hub没有足够的容量供所有人使用吗? - user1496984
@AdrianMouat 感谢您的评论,但是如果每个图像都显示“跳过”,那么我的上传带宽如何成为瓶颈呢?您是否在暗示Docker会上传整个镜像,计算注册表上的校验和,将其与先前的校验和进行比较,如果不同,则重新上传它? - user1496984
哦,抱歉,我没有意识到这是一个空上传。不,我认为它应该只上传元数据并进行比较。很烦人,需要这么长时间。 - Adrian Mouat
但是依赖于Docker Hub来进行生产可能不是一个好主意,该服务经常有点起伏不定。 - Adrian Mouat
@user1496984 这只是一个建议。我曾经使用 Docker Hub 一段时间,只是为了学习目的,从未用于生产。但我可以想象,在高峰期负载期间,这些服务可能会降低性能。我在docker github帐户上看到了一些有关将镜像推送到Docker Hub时速度缓慢的问题,因此我宁愿没有任何有价值的原因而不依赖它。 - Stanislav

0
因此,组织通常在本地网络上运行自己的注册表。这也使组织掌控自己的数据,避免依赖外部服务。
您还会发现,像Google容器引擎和亚马逊容器服务这样的云主机提供托管注册表,以为用户提供快速的本地下载。

2
很抱歉,这个答案引起了一些混淆。关于“控制自己的数据”和“依赖外部服务”的观点是不相关的。所有的代码都完全在云上运行,而我的源代码也在Github上。其次,我不明白云提供商如何拥有快速、本地的注册表?据我所知,那些只是专门为单个公司/账户提供的注册表。所以你是在暗示Quay和Docker的性能问题源于他们没有足够的容量来运行他们的服务吗? - user1496984

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接