推送到端口转发的 docker 注册表

Prv*_*aak 4 docker docker-registry docker-machine

背景

有一个我无法控制的私有 docker 注册表。无法从我的计算机访问此注册表,但可以从我有权访问的远程服务器访问。

这是我当前(效率很低)的工作流程:

# On my machine
$ docker save IMAGE > FILE
$ scp FILE SERVER
$ ssh SERVER
# On the server
$ docker load < FILE
$ docker tag -f IMAGE REGISTRY:5000/IMAGE
$ docker push REGISTRY:5000/IMAGE
Run Code Online (Sandbox Code Playgroud)

问题

即使大多数 docker 层没有变化,我也需要保存、上传和加载整个 tarball 来推送图像。

我尝试使用 ssh 将 docker 注册表端口(5000)转发到我机器上的端口:

$ ssh -L 5042:REGISTRY:5000 SERVER
Run Code Online (Sandbox Code Playgroud)

现在我可以从我的机器与注册表进行通信:

$ curl localhost:5042/v2/
{}
Run Code Online (Sandbox Code Playgroud)

但是 docker 不会向它推送图像:

$ docker tag IMAGE localhost:5042/IMAGE
$ docker push localhost:5042/IMAGE
The push refers to a repository [localhost:5042/IMAGE] (len: 1)
Sending image list
FATA[0000] Put http://localhost:5042/v1/repositories/IMAGE/: dial tcp 127.0.0.1:5042: connection refused
Run Code Online (Sandbox Code Playgroud)

我有一种感觉,问题出在图像的不同名称/标签中。在服务器上,我需要将其标记为,REGISTRY:5000/IMAGE但在 localhost 上这是没有意义的,因为REGISTRY无法从我的计算机访问该url。

或者问题可能是由于我通过 docker-machine 运行 docker 造成的。

我可以以某种方式推送到端口转发到本地端口的私有 docker 注册表吗?

Prv*_*aak 5

需要有两个 ssh 隧道。一台来自本地机器(此一台由 docker 客户端使用),另一台来自 docker-machine(此一台由 docker 守护程序使用)。

docker-machine ssh
ssh -L 5042:REGISTRY:5000 SERVER
Run Code Online (Sandbox Code Playgroud)