背景
有一个我无法控制的私有(private) 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
问题
推送图像需要很长时间,因为我需要保存、上传和加载整个 tarball,即使大多数 docker 层没有变化。
我尝试使用 ssh 将 docker 注册表端口(5000)转发到我机器上的端口:
$ ssh -L 5042:REGISTRY:5000 SERVER
现在我可以从我的机器上与注册表进行通信:
$ curl localhost:5042/v2/
{}
但是 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
我感觉问题出在图像的不同名称/标签上。在服务器上,我需要将其标记为
REGISTRY:5000/IMAGE
但在 localhost 上,REGISTRY
毫无意义无法从我的计算机访问 url。或者问题可能是由于我通过 docker-machine 运行 docker 造成的。
问题
我可以以某种方式推送到端口转发到本地端口的私有(private) docker 注册表吗?
最佳答案
需要有两个 ssh 隧道。一个来自本地机器(这个由 docker 客户端使用)和一个来自 docker-machine(这个由 docker 守护进程使用)。
docker-machine ssh
ssh -L 5042:REGISTRY:5000 SERVER
关于docker - 推送到端口转发的 docker 注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34997254/