Docker 之十五 Docker 私有仓库搭建与使用实战

创建 Docker 私有仓库

1
2
3
4
5
# 下载Docker官方的registry镜像
# docker pull registry

# 创建并启动registry容器,添加5000端口映射和数据卷,其中/var/lib/registry目录是registry容器存放Docker镜像的位置
# docker run -d -p 5000:5000 --name docker-registry --restart=always -v /container/registry:/var/lib/registry registry

查看私有仓库列表

1
2
3
4
5
6
7
# 使用命令查看私有仓库列表,默认值为:{"repositories":[]}
# curl -X GET http://127.0.0.1:5000/v2/_catalog
{"repositories":["clay-tomcat"]}

# 使用命令查看指定私有仓库的版本列表,clay-tomcat是私有仓库的名称
# curl -X GET http://127.0.0.1:5000/v2/clay-tomcat/tags/list
{"name":"clay-tomcat","tags":["1.0"]}

Push 本地镜像到私有仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 首先下载Docker官方的Tomcat镜像
# docker pull tomcat

# 查看镜像列表
# docker images
EPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 7ee26c09afb3 3 days ago 462MB

# 给Tomcat镜像添加一个带有私有仓库IP的TAG,其中7ee26c09afb3是Tomcat镜像的ID,clay-tomcat是私有仓库的名称,1.0是私有仓库中镜像的版本号(默认为latest)
# docker tag 7ee26c09afb3 127.0.0.1:5000/clay-tomcat:1.0

# 将Tomcat镜像Push到私有仓库
# docker push 127.0.0.1:5000/clay-tomcat:1.0

# 查看私有仓库列表
# curl -X GET http://127.0.0.1:5000/v2/_catalog
{"repositories":["clay-tomcat"]}

Pull 私有仓库中的镜像到本地

1
2
3
4
5
6
7
8
9
# 首先删除上面创建的TAG镜像与Docker官方的Tomcat镜像,因为本地不存在对应镜像层时Docker才会从私有仓库下载镜像
# docker rmi tomcat
# docker rmi 127.0.0.1:5000/clay-tomcat:1.0

# 将私有仓库中的镜像Pull到本地,clay-tomcat是私有仓库的名称,1.0是私有仓库中镜像的版本号(默认为latest)
# docker pull 127.0.0.1:5000/clay-tomcat:1.0

# 使用刚Pull下来的Tomcat镜像,创建并启动Tomcat容器,可以通过浏览器测试访问Tomcat页面:http://127.0.0.1:8080/
# docker run -d --name tomcat -p 8080:8080 127.0.0.1:5000/clay-tomcat:1.0

删除私有仓库中的镜像

Docker 官方不建议直接删除镜像的镜像层数据,所以没有接口直接删除镜像;删除镜像会很麻烦,一般如果删除某镜像只需删除该镜像的元数据,也就是 curl 命令查看到的镜像信息,而对于该镜像的镜像层数据需要进行垃圾回收才会真的被删除。如果删除的镜像与未删除的镜像公用了一些镜像层数据,垃圾回收之后再也用不了这些镜像了,因此删除元数据就好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 官方推荐使用digest_hash参数删除私有仓库中的镜像数据,具体教程请自行网上搜索。

# 连接Registry容器,docker-registry是容器名称,也可以使用容器ID
# docker exec -it docker-registry /bin/sh

# 删除对应镜像的所有版本,其中clay-tomcat是镜像名称
# rm -rf /var/lib/registry/docker/registry/v2/repositories/clay-tomcat

# 执行垃圾回收操作,注意2.4版本以上的registry才有此功能
# docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml

# 删除后需要重启Registry容器
# docker restart docker-registry

# 查看私有仓库列表
# curl -X GET http://127.0.0.1:5000/v2/_catalog
{"repositories":[]}

访问远程私有仓库

访问远程私有仓库之前,必须确认远程私有仓库所在服务器的防火墙开放了 Registry 端口(例如 5000)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 查看远程私有仓库列表
# curl -X GET http://192.168.1.130:5000/v2/_catalog

# 由于Docker Registry默认采用Http协议,而Docker本地客户端默认需要使用Https协议执行Pull操作,因此如果Docker本地客户端直接从远程私有仓库中Pull镜像会提示以下错误信息
Error response from daemon: Get https://192.168.1.130:5000/v2/: http: server gave HTTP response to HTTPS client

# 配置Docker本地客户端允许使用Http协议,其中192.168.1.130:5000是远程私有仓库的IP和端口,配置内容必须符合JSON格式
# vim /etc/docker/daemon.json
{
"insecure-registries":["192.168.1.130:5000"]
}

# 重启Docker服务,使用配置生效
# systemctl daemon-reload
# systemctl restart docker

# 从远程私有仓库Pull镜像到本地
# docker pull 192.168.1.130:5000/clay-tomcat:1.0

# 将本地镜像Push到远程私有仓库
# docker pull hello-world
# docker tag fce289e99eb9 192.168.1.130:5000/hello-world:1.0
# docker push 192.168.1.130:5000/hello-world:1.0
# curl -X GET http://192.168.1.130:5000/v2/_catalog

创建带身份验证的 Docker 私有仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 下载Docker官方的registry镜像
# docker pull registry

# 创建保存私有仓库帐号信息的目录
# mkdir -p /etc/docker/registry-auth

# 为clay用户名生成一条密码为123456的用户信息,并保存在文件/etc/docker/registry-auth/htpasswd,其中registry:latest表示使用registry镜像的latest版本
# docker run --entrypoint htpasswd registry:latest -Bbn clay 123456 >> /etc/docker/registry-auth/htpasswd

# 用户密码默认会加密保存到本地磁盘
# cat /etc/docker/registry-auth/htpasswd
clay:$2y$05$nkzz4O9BARoZb8O61WHmLelm29GI/qOv3gUKimy5aTtDvm1tmg30e

# 创建并启动带身份验证的registry容器,添加5000端口映射和数据卷,其中/var/lib/registry目录是registry容器存放Docker镜像的位置
# 这里必须通过数据卷将宿主机保存私有仓库帐号信息的目录/etc/docker/registry-auth挂载到registry容器内的目录/auth,然后Docker验证用户身份时会在容器内找"REGISTRY_AUTH_HTPASSWD_PATH"指向的文件
# docker run -p 5000:5000 --restart always --name docker-registry \
-v /container/registry:/var/lib/registry \
-v /etc/docker/registry-auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-d registry

# 登录私有仓库,成功后帐号信息默认存放在~/.docker/config.json
# docker login --username=clay 127.0.0.1:5000

# 查看私有仓库列表,此时通过cul命令访问带身份验证的私有仓库,必须指定用户名/密码
# curl -X GET -u clay:123456 http://127.0.0.1:5000/v2/_catalog

# 执行"docker login"操作之后,就可以往私有仓库Push或者Pull镜像了
# docker pull 127.0.0.1:5000/clay-tomcat:1.0