【问题标题】:Docker push takes a really long timeDocker 推送需要很长时间
【发布时间】:2015-10-28 14:20:53
【问题描述】:

我有一个使用 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。

【问题讨论】:

    标签: performance docker boot2docker


    【解决方案1】:

    请注意:我运行自己的 docker 注册表,该注册表位于我正在发出“docker push”命令的机器上,但仍然需要大量时间。这绝对不是磁盘的 I/O 速率问题,因为它们由 SSD 支持(并且澄清一下,它们的性能与使用它们的任何其他设备相比具有约 500+MB/秒的性能)。但是, docker push 命令似乎与我将其发送到远程站点一样长。我认为除了“带宽”问题之外还有一些事情正在发生。我的怀疑是,不管我的注册表是本地的,它仍在尝试使用 NIC 来传输数据(这似乎是有道理的,因为需要一个 URI 作为推送目标并且注册表是一个容器本身)。

    话虽如此,我可以将相同的文件复制到它们最终驻留在本地注册表中的位置,其速度比 push 命令快几个数量级。也许解决方案就是这样。然而,有一点很清楚的是,问题本身并不是带宽本身,而是一般可能的数据路径。

    无论如何,运行本地注册表不可能(完全)解决 OP 的问题。虽然我刚刚开始调查,但我怀疑需要对 docker 进行代码更改才能解决此问题。我不认为这是一个错误,而是一个设计挑战。 URI 和/或主机主机通信需要网络堆栈,即使源和目标是同一台机器/主机/容器。

    【讨论】:

    • 您的评论虽然有用,但并不能完全回答问题。您可以尝试缩短您的评论并将其添加为评论。
    • 我实际上是想发表评论,抱歉。我对 iPosts 有点陌生。我是数据隐士。
    • 没有伤害:-)。您可以通过点击问题下方的add a comment 来添加评论。您也可以点击答案下方的delele 删除您的答案。答案经过投票,应该解决问题并具有最低质量。请参阅here 了解答案应该是什么样的。
    【解决方案2】:

    previews answer 中是否说过,您可能应该使用本地注册表。安装使用也不是很难,here你可以找到资料,如何入手。它可能会更快,因为您不受供应商上传速度限制的限制。顺便说一句,您始终可以将映像从本地注册表推送到 Docker Hub 或其他本地注册表(例如,安装在您的客户网络中)。

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

    【讨论】:

    • 是的,到码头的 3.5 分钟。可能是因为 OP 的宽带上传带宽。
    • @stanislav 感谢您的回复。我会考虑运行一个本地注册表,但为了清楚起见,您认为问题在于 Quay 和 Docker Hub 没有足够的容量供所有人使用?
    • @AdrianMouat 感谢您的评论,但是如果对于每张图片都显示“跳过”,我的上传带宽怎么会成为瓶颈?你是不是建议 Docker 上传整个镜像,在注册表上计算校验和,与之前的校验和比较,如果不同则重新上传?
    • 哦,抱歉,我没有意识到这是一个空上传。不,我认为它应该只上传元数据并进行比较。烦人的时间太长了。
    • 但是依赖 Docker Hub 进行生产可能是个坏主意;服务经常有点起伏。
    【解决方案3】:

    因此,组织通常在本地网络上运行自己的注册表。这也使组织能够控制自己的数据并避免依赖外部服务。

    您还会发现,Google Container Engine 和 Amazon Container Service 等云主机提供托管注册表,以便为用户提供快速的本地下载。

    【讨论】:

    • 恐怕这个答案会引起一些混乱。关于“控制我自己的数据”和“依赖外部服务”的观点是无关紧要的。所有的代码都完全在云端运行,而我的源代码无论如何都在 Github 上。其次,我看不到云提供商如何拥有快速的本地注册中心?据我了解,这些只是专门用于单个公司/帐户的注册表。所以你认为这个性能问题的根源是 Quay 和 Docker 没有以足够的容量运行他们的服务?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-07
    • 2020-08-26
    相关资源
    最近更新 更多