Docker Can';t在swarm中运行时从专用注册表推/拉

Docker Can';t在swarm中运行时从专用注册表推/拉,docker,docker-swarm,docker-registry,swarm,Docker,Docker Swarm,Docker Registry,Swarm,当我在swarm中运行docker注册表时: docker service create \ --name docker-registry \ --mount type=bind,src=/some/path,dst=/var/lib/registry \ -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \ --publish 5000:5000 \ --replicas 2 \ registry:2 并尝试(从另一台服务器)推送或拉入它挂起的注册

当我在swarm中运行docker注册表时:

docker service create \
  --name docker-registry \
  --mount type=bind,src=/some/path,dst=/var/lib/registry \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
  --publish 5000:5000 \
  --replicas 2 \
  registry:2
并尝试(从另一台服务器)推送或拉入它挂起的注册表:

$ docker tag hello-world:latest 111.222.333.333:5000/hello-world
$ docker push 111.222.333.333:5000/hello-world
The push refers to a repository [111.222.333.333:5000/hello-world]
428c97da766c: Retrying in 1 second
但当我将其作为容器运行时,它会起作用:

docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name docker-registry \
  -v /some/path:/var/lib/registry \
  registry:2
我将IP注册表添加到不安全的注册表中。我做错了什么?

您已经为服务设置了
--replication2
,它们从主机装载
/some/path
。这意味着:

  • 2
    docker注册表
    同一主机上的容器访问
    /some/path
  • 2
    docker注册表
    不同主机上的容器访问
    /some/path
在这两种情况下,
docker registry
如何管理本地存储与此类配置不兼容。Swarm将在实例之间分发所有API请求,导致数据损坏和意外行为

必须确保
docker注册表
始终运行在具有相同
/some/path的同一主机上


对于高可用性配置,中提到了

你从0.0.0.0:5000开始拉,但是你想推到111.222.333.333:5000?当您运行docker login时,是否确保您也在推到正确的注册表?发生了什么?根据手册
0.0.0.0:5000
只是设置注册表端口。我正在从另一台服务器推/拉到正确的注册表-我确信这一点。我不使用登录,它是在我的专用网络中打开的注册表。@Taz,您已经为服务设置了
--replications 2
,它们从主机装载
/some/path
。您确定两个复制副本都在同一物理主机上运行吗?如果它们位于不同的位置,那么您的请求将在它们之间进行负载平衡,从而生成不一致的数据。例如,
push
将路由到主机1上的replica1,但
pull
将路由到主机2上的replica2。我建议运行
registry
服务,其中至少包含
--副本1
。然后,在任何情况下,如果该复制副本在前几天在host2上重新启动,它将以新的空注册表开始。如果有,请选择共享存储,或者确保您的
注册表
服务始终在同一主机上运行,装载相同的
/some/path
。作为一种选择,如果您处于Swarm模式,您可以使您的网络
--可连接
,并创建
注册表
,而不是作为服务,而是作为常规容器。更改为
--副本1
解决了问题:)因此,我现在不确定扩展是如何工作的,因为它们都在同一台主机上,所以我认为当两次拉或推同时发生时,每个进程都会得到一个副本,而不会阻塞第二个副本。