跳转至

Docker平台的一个强大之处在于,从中心位置使用镜像非常容易。Docker Hub是首选的图像仓库,拥有数千个官方图像供您使用。同样容易的是,您可以将自己的镜像推送到Docker Hub注册中心,以便每个人都可以从您的Docker化应用中受益。

但是,在某些场景中,您可能不想将您的镜像推送到防火墙之外。在这种情况下,您可以使用开源软件项目Distribution设置一个本地注册中心。在本文中,我们将看一下如何设置和配置Distribution项目的本地实例,您的团队可以使用他们已经知道的docker命令共享镜像:docker pushdocker pull

先决条件

要完成本教程,您需要以下内容:

运行Distribution服务

Distribution项目已经作为Docker Hub的官方镜像进行了打包。要在本地运行一个版本,执行以下命令:

$ docker run -d -p 5000:5000 --name registry registry:2.7

-d标志将以分离模式运行容器。-p标志在您的本地机器的网络上发布了5000端口。我们还使用--name标志给我们的容器一个名字。查看我们的文档,了解有关docker run命令的所有标志。

从本地registry推送和拉取

现在我们已经在本地运行了我们的registry,让我们跟踪容器的日志,以便我们可以验证我们的镜像正在被本地推送和拉取:

$ docker logs -f registry

打开另一个终端,并从Docker Hub获取官方Ubuntu镜像。我们将在下面的示例中使用这个镜像:

$ docker pull ubuntu

要向我们的本地registry推送或从我们的本地registry拉取,我们需要将registry的位置添加到仓库名称中。格式如下:my.registry.address:port/repositoryname

在我们的例子中,我们需要将my.registry.address.port替换为localhost:5000,因为我们的registry正在我们的localhost上运行,并且正在监听5000端口。这是完整的仓库名称:localhost:5000/ubuntu。为此,我们将运行docker tag命令:

$ docker tag ubuntu localhost:5000/ubuntu

现在我们可以向我们的本地registry推送。

$ docker push localhost:5000/ubuntu

注意

Docker通过寻找"."(作为域的分隔符)或":"(作为端口的分隔符)来识别存储库名称的第一部分是否为位置,而非用户名。如果仅有localhost而没有.localdomain:5000(任一都行),Docker会误以为localhost是一个用户名,如同在localhost/ubuntusamalba/hipache中的情况。此时,Docker会尝试向默认的注册表,也就是Docker Hub进行推送。而在名字的第一部分含有点或冒号,就告知了Docker,这个名字包含了主机名,应当向指定位置进行推送。

返回至我们正跟踪的,记录注册表日志的终端。你若仔细审阅这些日志,就能发现记录着我们保存ubuntu镜像请求的条:

...
172.17.0.1 - - [26/Feb/2021:18:10:57 +0000] "POST /v2/ubuntu/blobs/uploads/ HTTP/1.1" 202 0 "" "docker/20.10.2 go/go1.13.15 git-commit/8891c58 kernel/4.19.121-linuxkit os/linux arch/amd64 UpstreamClient(Docker-Client/20.10.2 \\(darwin\\))"

172.17.0.1 - - [26/Feb/2021:18:10:57 +0000] "POST /v2/ubuntu/blobs/uploads/ HTTP/1.1" 202 0 "" "docker/20.10.2 go/go1.13.15 git-commit/8891c58 kernel/4.19.121-linuxkit os/linux arch/amd64 UpstreamClient(Docker-Client/20.10.2 \\(darwin\\))"

172.17.0.1 - - [26/Feb/2021:18:10:57 +0000] "POST /v2/ubuntu/blobs/uploads/ HTTP/1.1" 202 0 "" "docker/20.10.2 go/go1.13.15 git-commit/8891c58 kernel/4.19.121-linuxkit os/linux arch/amd64 UpstreamClient(Docker-Client/20.10.2 \\(darwin\\))"
...

现在,我们先把本地的localhost:5000/ubuntu镜像删除,然后从本地仓库拉取,去验证本地仓库运行正常。

首先,打印现在本地中的镜像列表:

$ docker images
REPOSITORY  TAG       IMAGE ID      CREATED           SIZE
registry    2.7       5c4008a25e05  40 hours ago      26.2MB
ubuntu      latest    f63181f19b2f  5 weeks ago       72.9MB
localhost:5000/ubuntu latest f63181f19b2f 5 weeks ago 72.9MB

现在删除镜像localhost:5000/ubuntu

$ docker rmi localhost:5000/ubuntu
Untagged: localhost:5000/ubuntu:latest
Untagged: localhost:5000/ubuntu@sha256:3093096ee188f8...8c091c8cb4579c39cc4e

再次查看镜像列表确认镜像已经删除:

$ docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
registry     2.7       5c4008a25e05   40 hours ago   26.2MB
ubuntu       latest    f63181f19b2f   5 weeks ago    72.9MB

最后,从我们的本地注册表中拉取镜像,并验证它现在已经被拉取到我们的Docker本地实例:

$ docker pull localhost:5000/ubuntu
Using default tag: latest
latest: Pulling from ubuntu
Digest: sha256:sha256:3093096ee188f8...8c091c8cb4579c39cc4e
Status: Downloaded newer image for localhost:5000/ubuntu:latest
localhost:5000/ubuntu:latest

$ docker images
REPOSITORY              TAG       IMAGE ID       CREATED        SIZE
registry                2.7       5c4008a25e05   40 hours ago   26.2MB
ubuntu                  latest    f63181f19b2f   5 weeks ago    72.9MB
localhost:5000/ubuntu   latest    f63181f19b2f   5 weeks ago    72.9MB

总结

在这篇文章中,我们探索了如何在本地运行一个镜像注册表。我们还从Docker Hub拉取了一个镜像,用我们本地的注册表为镜像贴上标签,然后将该镜像推送到我们正在运行Distribution的本地注册表中。

如果你对Distribution项目有更深一步的了解兴趣,可以直接前往GitHub上的开源项目主页,同时也别忘了阅读它的文档

评论