我们目前正在一台托管所有图像的服务器上运行私有注册表。如果服务器崩溃,我们基本上会丢失所有图像。我们希望找到一种方法来在我们的图像上实现高可用性。我看到一个简单的解决方案是每个服务器都有一个注册表实例。负载均衡器会将流量重定向(循环)到可用的注册表实例之一。注册表实例将共享相同的网络数据驱动器(NFS)来存储映像。
你觉得这个解决方案有什么问题吗?即:如果用户在实例上推送图像,而另一个推送另一个(负载平衡器循环决策),它会在NFS上创建任何锁定文件吗?
感谢您的反馈意见
有一些information on this on the docker-registry website。简而言之,它似乎旨在支持多个注册管理机构与同一个数据存储区通信,因此您不应该看到任何问题。
如果可靠性对您来说是一个真正的问题,那么查看其中一个商业产品可能是明智的。 enterprise Hub或CoreOS Enterprise Registry。 (虽然这些似乎强调安全性和访问控制而不是HA)。
如here所述,可以使用S3支持注册表。值得在容器中运行注册表,以便在发生灾难性主机/数据中心故障时立即启动另一个注册表。注册表也支持GCloud和OpenStack。
如果您担心数据丢失,请为持久性添加冗余并确保定期备份。您还应确保构建是幂等的,以便在绝对必要时重建图像。
注册表需要缓存一些元数据,默认情况下使用inmemory。您可以更改缓存配置以使用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或任何其他全局存储的存储方法。我运行两个注册表以获得高可用性。