如何将 Docker Registry 作为服务运行?
实现私有 Docker Registry 的 Swarm 模式的分步指南。
引言
高可用性和可伸缩性是 IT 领域面临的巨大挑战。假设您要将私有注册表作为服务提供,并且预计到注册表的高流量,那么您必须仔细设计基础设施以支持上述项目。在本文中,我们将探讨如何使用 Docker Swarm 来实现私有注册表的高可用性和可伸缩性。
Docker Swarm 是一个由加入集群的 Docker 运行节点组成的集合。Swarm 有两种类型的节点:一种是管理器,另一种是工作节点。管理器使用各种策略将任务分发给工作节点和它自己。
Docker Swarm 服务提供自动伸缩、流量分配以及密码、TLS 证书等敏感数据的安全存储。
这是我的私有 Docker 注册表系列的最后一部分,以下列表显示了该系列的提纲:
- 第一部分:如何设置您的私有 Docker 仓库?
- 私有 Docker 仓库设置
- 存储自定义
- 第二部分:如何保护您的私有 Docker 仓库?
- CA 证书
- 自签名证书
- 基本身份验证
- 第三部分:如何将您的私有仓库作为服务运行?
- 配置 Swarm
- 生成密钥
- 将注册表作为服务运行
要将私有注册表配置为服务,我们有以下三个主要步骤:
- 配置 Swarm
- 生成密钥
- 将注册表作为服务运行
配置 Swarm
对于您的私有注册表,您将创建两个集群:一个用于管理器,另一个用于工作节点,但您可以创建任意数量的集群。
在 Hyper-V 中配置虚拟交换机
Hyper-V 包含在 Windows 10 中,因此无需在 Win 10 计算机上安装任何额外的虚拟机管理程序,如 VirtualBox 或 VMware Workstation 等。但 Hyper-V 需要虚拟交换机来创建集群,并且仅在使用 Hyper-V 时才需要。请按照以下步骤在 Hyper-V 中创建虚拟交换机。
- 打开 Hyper-V 管理器。
- 点击右侧菜单中的“虚拟交换机管理器”。
- 点击“创建虚拟交换机”。
- 选择“外部”作为类型。
- 将其命名为
hyphub
。 - 选择您的主机主要网络适配器。
创建 Swarm 节点
- 打开 PowerShell 控制台(Linux 中的终端)。
- 使用以下命令创建一个管理器节点。
Windows 10: docker-machine create -d hyperv --hyperv-virtual-switch "hyphub" hubmgr Window 7/Linux: docker-machine create -d virtualbox hubmgr
- 使用以下命令创建一个工作节点集群。
Windows 10: docker-machine create -d hyperv --hyperv-virtual-switch "hyphub" hubworker01 Window 7/Linux: docker-machine create -d virtualbox hubworker01
- 检查新创建集群的状态。
Windows/Linux: docker-machine ls
配置 Swarm
- 以管理员模式打开一个新的 PowerShell 控制台(Linux 中的终端)。
- 键入以下命令连接到管理器节点。
Windows/Linux: docker-machine ssh hubmgr
- 将提示符终端更改为 Manager。您可以像这样更改提示符:
PS1="Manager#
”。 - 键入以下命令配置 Swarm。
Windows/Linux: docker swarm init
- 以管理员模式打开一个新的 PowerShell 控制台(Linux 中的终端)。
- 键入以下命令连接到工作节点。
Windows/Linux: docker-machine ssh hubworker01
- 将提示符终端更改为
Worker
。您可以像这样更改提示符:PS1="Worker01#
”。 - 使用以下命令加入 Swarm。
Windows/Linux: docker swarm join {join token} {manager ip}:{port}
- 一旦工作节点成功加入集群,请返回到管理器控制台并使用以下命令检查节点列表。
Windows/Linux: docker node list
- 这将显示两个节点,一个管理器和一个工作节点。
生成密钥
Docker Swarm 支持安全地存储敏感信息并在集群中的节点之间共享。在本节中,我们将了解如何为私有注册表 (hub.docker.local
) 创建和使用 TLS 证书的密钥。
- 打开一个新的 PowerShell 控制台(Linux 中的终端)。
- 导航到C:\localhub (请记住,我们在本系列的第一篇文章中创建了此文件夹)。对于 Linux,是/home/localhub。
- 我们需要将 TLS 文件从主机移动到管理器节点,以便将其添加到密钥存储区。在移动文件之前,请确保管理器在/home/docker下有一个 certs 文件夹。如果不存在,请创建它。
Windows: docker-machine scp /C/localhub/certs/localhub.key docker@192.168.1.105:/home/docker/certs docker-machine scp /C/localhub/certs/localhub.crt docker@192.168.1.105:/home/docker/certsy
- 转到管理器控制台并导航到/home/docker文件夹。
- 输入以下命令生成 TLS 证书的密钥。
Linux: docker secret create localhub.crt certs/localhub.crt docker secret create localhub.key certs/localhub.key
将仓库作为服务运行
现在我们可以启用注册表服务了,请执行以下步骤:
- 转到管理器控制台。
- 键入以下命令为工作节点添加标签,这将有助于我们设置约束,仅在工作节点上运行注册表,但这是可选的。
Linux: docker node update --label-add registry=true hubworker01
- 键入以下命令,创建注册表服务。
Windows/Linux: docker service create --name registry --secret localhub.crt --secret localhub.key --constraint 'node.labels.registry==true' -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/run/secrets/localhub.crt -e REGISTRY_HTTP_TLS_KEY=/run/secrets/localhub.key --publish published=443,target=443 --replicas 1 registry
- 重复步骤以从您的私有注册表中拉取和推送镜像。
Windows/Linux: docker pull alpine docker tag alpine hub.docker.local/alpine docker push hub.docker.local/alpine docker rmi hub.docker.local/alpine docker images docker pull hub.docker.local/alpine docker images docker run hub.docker.local/alpine ls
目前,我们只使用一个副本,因为我们还没有设置集中式存储。如果您在未配置集中式存储的情况下增加副本数量,将会产生影响,因为镜像将无法在容器之间同步。在增加副本之前,您需要为/mnt/registry设置 bind-mounts,使用 SSD 或 SND 或存储驱动器,或者从管理器节点挂载一个目录。最佳实践是使用更可靠和可伸缩的存储模型。
结论
贯穿整个系列,我们学习了如何创建自己的私有 Docker 注册表来存储 Docker 镜像,如何保护注册表,以及如何借助 Docker Swarm 为注册表应用高可用性和可伸缩性。尽管本系列以私有注册表为例,但存储自定义、安全性、高可用性和伸缩性等概念对于其他应用程序也同样适用。感谢阅读本文,希望您有所收获。请在下方分享您的评论。