- 引用官方原文
Docker平台的一个强大之处在于,从中心位置使用镜像非常容易。Docker Hub是首选的图像仓库,拥有数千个官方图像供您使用。同样容易的是,您可以将自己的镜像推送到Docker Hub注册中心,以便每个人都可以从您的Docker化应用中受益。
但是,在某些场景中,您可能不想将您的镜像推送到防火墙之外。在这种情况下,您可以使用开源软件项目Distribution设置一个本地注册中心。在本文中,我们将看一下如何设置和配置Distribution项目的本地实例,您的团队可以使用他们已经知道的docker命令共享镜像:docker push
和 docker pull
。
先决条件¶
要完成本教程,您需要以下内容:
- 免费的Docker账户
- 您可以注册一个免费的Docker账户,并获得无限的公共仓库
- 本地运行的Docker
- 下载和安装Docker的说明
运行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/ubuntu
或samalba/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上的开源项目主页,同时也别忘了阅读它的文档。