私有 Docker 注册表及高可用性

6
我们目前在一台服务器上运行私有仓库,其中存储着我们所有的镜像。 如果该服务器崩溃,我们就会失去所有的镜像。因此,我们希望寻找一种方法来实现镜像的高可用性。 我认为一个简单的解决方案是每个服务器上都有一个仓库实例。 负载均衡器将(Round robin)流量重定向到可用的注册表实例之一。注册表实例将共享相同的网络数据驱动器(NFS)以存储镜像。
您是否发现这种解决方案存在任何问题? 例如:如果一个用户在一个实例上推送一个镜像,而另一个用户在另一个实例上推送另一个镜像(负载均衡器轮询决策),那么是否会在NFS上创建任何锁文件?
感谢您的反馈。

备份和/或镜像图像文件不是更容易吗? - Adrian Mouat
这样做会更容易,但我们不希望出现任何服务中断。 - Florent Valdelievre
3个回答

3
可以按照这里所述的方法,使用S3备份注册表。最好将注册表运行在容器中,以便在发生灾难性主机/数据中心故障时可以立即启动另一个。注册表还支持GCloud和OpenStack。
如果您担心数据丢失,请向持久性添加冗余,并确保定期备份。您还应确保您的构建是幂等的,以便在绝对必要的情况下重新构建映像。

感谢您的反馈,非常感激。 - Florent Valdelievre

2
这里有一些{{link1:Docker Registry网站上的信息}}。简而言之,它似乎旨在支持多个注册表与同一数据存储交互,因此您不应该遇到任何问题。
如果可靠性对您来说是一个真正的问题,那么看看商业产品可能是明智的选择,例如{{link2:企业版Hub}}或{{link3:CoreOS企业注册表}}。(虽然这些似乎强调安全和访问控制,而不是HA)。

2

注册表需要缓存一些元数据,默认情况下使用内存。您可以更改缓存配置以使用redis。

https://docs.docker.com/registry/configuration/#cache

示例配置:

storage:
  filesystem:
    rootdirectory: /var/lib/registry
  cache:
    blobdescriptor: redis
redis:
  addr: redis-server-host:6379
  db: 1
  dialtimeout: 1s
  readtimeout: 1s
  writetimeout: 1s
  pool:
    maxidle: 16
    maxactive: 64
    idletimeout: 300s

您应该更改S3或任何其他全局存储的存储方法。我运行两个注册表以实现高可用性。


我已经设置了两个运行Docker注册表的EC2实例,使用S3作为存储。不久之后,尝试docker push失败,并显示“blob upload unknown”。我禁用了其中一个EC2实例(以排除故障),事情立即开始正常工作。这让我相信有些数据没有在S3中同步/存储。最终我找到了这篇文章,看起来是这样的。我将尝试使用redis池,但现在我禁用了另一个节点。感谢您分享这个,节省了我大量的时间。可悲的是,Docker今天没有一种将其存储在S3中的方法。 - makegofast

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