与独立容器相比, Swarm 服务提供了几个优势。他们使用声明性模型,这意味着您定义了所需的状态,Docker 将您的服务保持在该状态。服务提供自动负载平衡扩展,以及控制服务分布的能力,以及其他优势。服务还允许您将敏感数据(例如 TLS 证书)存储在 secrets中。
您使用的存储后端决定了您是使用完全扩展的服务还是仅具有单个节点或节点约束的服务。
如果您使用分布式存储驱动程序,例如 Amazon S3,则可以使用完全复制的服务。每个工作人员都可以写入存储后端而不会引起写入冲突。
如果您使用本地绑定挂载或卷,则每个工作节点都会写入自己的存储位置,这意味着每个注册表都包含不同的数据集。您可以通过使用单副本服务和节点约束来解决此问题,以确保只有单个工作人员正在写入绑定挂载。
以下示例将注册表作为单副本服务启动,该服务可在端口 80 上的任何 swarm 节点访问。假设您使用与前面示例中相同的 TLS 证书。
首先,将 TLS 证书和密钥保存为机密:
$ docker secret create domain.crt certs/domain.crt
$ docker secret create domain.key certs/domain.key
接下来,将标签添加到要运行注册表的节点。要获取节点的名称,请使用docker node ls. 用您的节点名称替换 node1下面的名称。
$ docker node update --label-add registry=true node1
接下来,创建服务,授予它访问这两个秘密的权限,并将其限制为仅在带有标签的节点上运行registry=true。除了约束之外,您还指定一次只能运行一个副本。/mnt/registry示例将swarm 节点上的绑定挂载到/var/lib/registry/ 容器内。绑定挂载依赖于预先存在的源目录,因此请确保/mnt/registry存在于node1. docker service create您可能需要在运行以下命令之前创建它。
默认情况下,秘密被挂载到一个服务中/run/secrets/。
$ docker service create \
--name registry \
--secret domain.crt \
--secret domain.key \
--constraint node.labels.registry==true \
--mount type=bind,src=/mnt/registry,dst=/var/lib/registry \
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/run/secrets/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/run/secrets/domain.key \
--publish published=443,target=443 \
--replicas 1 \
registry:2
您可以在任何 swarm 节点的 443 端口访问该服务。Docker 将请求发送到运行服务的节点。
0 留言