1. 搭建

Docker官方有提供一个私有仓库的镜像为“Registry”,只需要将镜像下载下来,并运行在5000端口即可使用。具体指令如下所示:

1
2
$ docker pull registry:2
$ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --name myregistry registry:2

上述指令表示,将registry镜像以后台方式运行在5000端口并将容器内部路径的/var/lib/registry挂载至/opt/registry外部路径下。

随后使用Curl命令进行测试,测试结果如下说明私有库已成功搭建。

1
2
$ curl http://localhost:5000/v2
<a href="/v2/">Moved Permanently</a>

2. 验证

选择一台联网的请求资源机,随后查看本地镜像:

1
2
3
4
5
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest b4f6a90c69a4 4 days ago 647MB
registry 2 2d4f4b5309b1 5 weeks ago 26.2MB
openjdk 11.0.7-jdk fcfdce4526df 6 weeks ago 627MB

随后将要推送的image的名称更改为 3.2 镜像命名格式 中的正确格式 ,如下所示:

1
$ docker tag image_name:tag domain_name:5000/image_name:tag

随后使用push命令提交至私有库尝试是否有效:

1
2
$ docker pull domain_name:5000/imagename:tag
Error response from daemon: Get https://localhost:5000/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

出现上述情况,则说明请求端未创建Docker网络注册,可通过 3.1 请求端配置 中所述方法,添加私库IP至注册文件中

再次进行镜像推送,无发现问题,如下所示:

1
2
3
4
5
$ docker push 192.168.3.xxx:5000/testimage:latest
The push refers to repository [192.168.3.xxx:5000/testimage]
f8fbfaa06b1b: Pushed
df64d3292fd6: Pushed
latest: digest: sha256:95620571bbadef953aef8d378ea254b177745d1bf954d635b0349926c53f4f21 size: 2614

至此,Docker私有库搭建完成。

3. 配置

3.1 请求端配置

与Docker Regisry通信Pull或Push镜像资源,需要在请求端配置如下属性,其中可配置域名或IP地址,对应端口号。

1
2
3
4
5
6
7
8
[dockers@dockerhub ~]$ sudo vim /etc/docker/daemon.json
{
"insecure-registries": [
"domain_name:5000",
"192.168.3.xxx:5000"
]
}
# :wq保存后退出

在配置完成后进行保存并通过systemctl restart docker指令重启docker服务。

3.2 镜像命名格式

由于镜像需要正确在命名格式才能正确识别并Push或Pull。因此,镜像应命名为域名:端口号/镜像名称:TAG标记格式,并确保所命名的域名与端口号已通过 3.1 请求端配置 ,如下所示。

1
2
# 重命名镜像名称
$ docker tag image_name:tag domain_name:5000/image_name:tag

4. 其他

4.1 如何查看已PUSH镜像

  • 网页方式

直接访问http://domain_name:5000/v2/_catalog即可。

  • 指令方式
1
2
$ curl domain_name:5000/v2/_catalog
{"repositories":["xxxx","testimage","xxxx"]}

4.2 Registry查看配置

1
2
# 查看默认配置
$ docker exec -it registry sh -c 'cat /etc/docker/registry/config.yml'

4.3 Registry开启删除

1
2
3
# 开启删除(添加  delete: enabled: true)
$ docker exec -it registry sh -c "sed -i '/storage:/a\ delete:'/etc/docker/registry/config.yml
$ docker exec -it registry sh -c "sed -i '/delete:/a\ enabled: true' /etc/docker/registry/config.yml"

4.4 重启Registry

1
$ docker restart registry

4.5 查询镜像

1
2
3
4
5
# 查询镜像
$ curl <仓库地址>/v2/_catalog

# 查询镜像tag(版本)
$ curl <仓库地址>/v2/<镜像名>/tags/list

4.6 删除镜像

1
2
3
4
5
6
# 删除镜像API
$ curl -I -X DELETE "<仓库地址>/v2/<镜像名>/manifests/<镜像digest_hash>"

# 获取镜像digest_hash
$ curl <仓库地址>/v2/<镜像名>/manifests/<tag> \
--header "Accept: application/vnd.docker.distribution.manifest.v2+json"