MikeVelazco Asked: 2020-05-27 08:06:19 +0800 CST2020-05-27 08:06:19 +0800 CST 2020-05-27 08:06:19 +0800 CST 是否有可能有一个故障转移/备份 docker 注册表? 772 自从上周quay.io 失败以来,公司里的每个人都认识到服务的重要性。这在我脑海中提出了这个问题: 如果再次发生这种情况,我的基础设施如何准备好使用辅助 docker 容器注册表以防第一个不可用? amazon-web-services docker-registry docker amazon-ecr 1 个回答 Voted Best Answer BMitch 2020-05-30T07:15:30+08:002020-05-30T07:15:30+08:00 到目前为止,docker 引擎有一个--registry-mirror选项,但仅适用于配置 Docker hub 的镜像。关于是否或如何调整以允许镜像其他注册管理机构存在一些悬而未决的问题,但没有足够的牵引力来做出这种改变。如果您的上游注册表是 docker hub,使用此标志指向本地缓存或镜像非常有用,因为对集线器的请求会自动首先尝试此镜像,然后在失败时会尝试上游注册表。这意味着您无需调整图像名称或担心本地中断。 Containerd 也有类似的选择,它支持任何上游注册中心,所以我相信这就是我们最终将要做的。但是,如果您使用的是 docker,即使使用了 containerd,我相信 docker 引擎仍在进行图像推送和拉取。 由于无法在 containerd 中进行配置,我已经看到了一些用于缓存来自其他注册表的图像的选项: 配置像 squid 这样的 HTTP 缓存代理。您确实希望确保这会定期刷新可变响应,例如图像清单。图层本身应保持不变,以便您可以将它们缓存很长时间。 直接从另一个镜像或缓存注册表中提取。 使用一些 DNS/TLS 劫持将请求发送到您的缓存或镜像。 通过缓存注册表配置拉取非常简单: docker run -p 5000:5000 -e REGISTRY_PROXY_REMOTEURL=<upstream-url> registry:2 但是,我倾向于运行镜像,因为通过缓存配置了7 天的条目过期时间。因此,如果发生中断并且您的条目最近从您的拉取缓存中过期,您将受到该中断的影响。 运行镜像涉及运行注册表,就像通过缓存拉取一样,然后复制您想要镜像的那些图像。想到Harbor,一些注册中心提供镜像作为一项功能。您指定要镜像到或从哪些远程注册表。我个人使用 shell 脚本进行镜像,因为它允许我备份旧图像(如果标签在上游被替换,大多数镜像将替换标签,让您没有恢复选项)。然后,我将该脚本包含在我的 CI/CD 工作流程中,以便在适当的时间运行,例如在 sprint 开始时或每周一早上。此镜像脚本的示例在我的演示文稿存储库中。 在本地注册表中获得可用映像后,您需要将 docker 配置为从该注册表中提取。如果没有该--registry-mirror选项,您要么需要调整映像名称,要么在网络/docker 主机上配置 DNS/TLS,以将请求指向本地注册表而不是上游注册表。后一个选项看起来很有吸引力,因为它允许您在不进行任何更改的情况下运行 docker 命令,图像构建、组合堆栈、掌舵图等都可以像与远程注册表对话一样工作。但是,管理您自己的 TLS 证书和自签名 CA 更容易出错,您网络上的所有主机都需要配置为信任。所以对我来说最简单的选择就是调整注册表名称。在我的 Dockerfile 中,我会有类似的东西: ARG REGISTRY=docker.io FROM ${REGISTRY}/library/alpine:3.9 这允许该图像由网络之外的其他人构建。然后在我的网络上的构建命令中,我将用我的本地镜像覆盖 arg: docker build --build-arg REGISTRY=local-mirror:5000 . 我在docker-compose.yml带有变量的文件中做同样的事情: image: ${REGISTRY:-docker.io}/my/repo:and-tag 然后在本地部署,例如: REGISTRY=local-mirror:5000 docker-compose up -d 我在我的 DockerCon 演示文稿中介绍了这一点。幻灯片发布在我的 github 上:https ://github.com/sudo-bmitch/presentations/tree/master/registry 演示在线:https ://www.youtube.com/watch?v=Bm7g0saAC9k
到目前为止,docker 引擎有一个
--registry-mirror
选项,但仅适用于配置 Docker hub 的镜像。关于是否或如何调整以允许镜像其他注册管理机构存在一些悬而未决的问题,但没有足够的牵引力来做出这种改变。如果您的上游注册表是 docker hub,使用此标志指向本地缓存或镜像非常有用,因为对集线器的请求会自动首先尝试此镜像,然后在失败时会尝试上游注册表。这意味着您无需调整图像名称或担心本地中断。Containerd 也有类似的选择,它支持任何上游注册中心,所以我相信这就是我们最终将要做的。但是,如果您使用的是 docker,即使使用了 containerd,我相信 docker 引擎仍在进行图像推送和拉取。
由于无法在 containerd 中进行配置,我已经看到了一些用于缓存来自其他注册表的图像的选项:
配置像 squid 这样的 HTTP 缓存代理。您确实希望确保这会定期刷新可变响应,例如图像清单。图层本身应保持不变,以便您可以将它们缓存很长时间。
直接从另一个镜像或缓存注册表中提取。
使用一些 DNS/TLS 劫持将请求发送到您的缓存或镜像。
通过缓存注册表配置拉取非常简单:
但是,我倾向于运行镜像,因为通过缓存配置了7 天的条目过期时间。因此,如果发生中断并且您的条目最近从您的拉取缓存中过期,您将受到该中断的影响。
运行镜像涉及运行注册表,就像通过缓存拉取一样,然后复制您想要镜像的那些图像。想到Harbor,一些注册中心提供镜像作为一项功能。您指定要镜像到或从哪些远程注册表。我个人使用 shell 脚本进行镜像,因为它允许我备份旧图像(如果标签在上游被替换,大多数镜像将替换标签,让您没有恢复选项)。然后,我将该脚本包含在我的 CI/CD 工作流程中,以便在适当的时间运行,例如在 sprint 开始时或每周一早上。此镜像脚本的示例在我的演示文稿存储库中。
在本地注册表中获得可用映像后,您需要将 docker 配置为从该注册表中提取。如果没有该
--registry-mirror
选项,您要么需要调整映像名称,要么在网络/docker 主机上配置 DNS/TLS,以将请求指向本地注册表而不是上游注册表。后一个选项看起来很有吸引力,因为它允许您在不进行任何更改的情况下运行 docker 命令,图像构建、组合堆栈、掌舵图等都可以像与远程注册表对话一样工作。但是,管理您自己的 TLS 证书和自签名 CA 更容易出错,您网络上的所有主机都需要配置为信任。所以对我来说最简单的选择就是调整注册表名称。在我的 Dockerfile 中,我会有类似的东西:这允许该图像由网络之外的其他人构建。然后在我的网络上的构建命令中,我将用我的本地镜像覆盖 arg:
我在
docker-compose.yml
带有变量的文件中做同样的事情:然后在本地部署,例如:
我在我的 DockerCon 演示文稿中介绍了这一点。幻灯片发布在我的 github 上:https ://github.com/sudo-bmitch/presentations/tree/master/registry
演示在线:https ://www.youtube.com/watch?v=Bm7g0saAC9k