官方的Docker Hub是一个用于管理公共镜像的,我们可以找到想要的镜像,也可以把我们自己的镜像推送上去。但有时候,我们的使用场景需要拥有一个私有的镜像仓库来管理我们自己的镜像。这个可以通过开源软件Registry搭建私有仓库。
搭建私有仓库的优点:
1、部署快捷,镜像不必从Docker Hub下载,只需从私有仓库下载即可
2、私有镜像,包含敏感信息,不方便公开对外,可在公司内部使用
搭建私有仓库
下载镜像registry
docker pull registry
创建用户密码文件,用于docker的登陆
docker run --entrypoint htpasswd registry -Bbn testuser testpassword > /etc/ssl/docker/registry.htpasswd
启动容器
docker run -p 127.0.0.1:5000:5000 --restart=always --name=registry #--restart:docker服务重启后重启此容器
-v /etc/ssl/docker:/etc/ssl/docker
-e "REGISTRY_AUTH=htpasswd"
-e "REGISTRY_AUTH_HTPASSWD_REALM=Docker Registry"
-e "REGISTRY_AUTH_HTPASSWD_PATH=/etc/ssl/docker/registry.htpasswd"
-e "REGISTRY_STORAGE_DELETE_ENABLED=true" #上传的镜像是否允许删除
-v /var/docker/registry:/var/lib/registry
-d registry
-d:后台运行
-p:将容器的5000端口映射到宿主机的5000端口
--restart:docker服务重启后重启此容器
--name:容器名称
-e: 设置环境变量
-v:将容器内的/var/docker/registry映射到宿主机的/var/lib/registry目录
上传镜像到私有仓库
登陆私有仓库
docker login www.example.com
例如将本地的registry上传到仓库
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest d1fd7d86a825 2 months ago 33.3 MB
修改镜像tag
docker tag docker.io/registry www.example.com/registry
查看
$ docker ps -a
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/registry latest d1fd7d86a825 2 months ago 33.3 MB
www.example.com/registry latest d1fd7d86a825 2 months ago 33.3 MB
上传镜像
docker push www.example.com/registry
获取私有仓库镜像
docker pull www.example.com/registry
如果出现
docker pull www.example.com/registry
Trying to pull repository www.example.com/registry ...
Pulling repository d www.example.com/registry
Error: image registry not found
则需要先登陆到私有仓库,即: docker login www.example.com
删除镜像
获取上传镜像的digest
$ curl -H "Accept: application/vnd.docker.distribution.manifest.v2+json" -I -X HEAD -u<user:password> https://www.example.com/v2/<image name>/manifests/<image tag>
HTTP/1.1 200 OK
Server: nginx/1.13.10
Date: Thu, 22 Mar 2018 06:33:38 GMT
Content-Type: application/vnd.docker.distribution.manifest.v2+json
Content-Length: 948
Connection: keep-alive
Docker-Content-Digest: sha256:28507809a90c80fa49c05ef87227835d569a0f84dd76f4be655394c8d1ca230e #即为当前镜像的digest
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:28507809a90c80fa49c05ef87227835d569a0f84dd76f4be655394c8d1ca230e"
X-Content-Type-Options: nosniff
Docker-Distribution-Api-Version: registry/2.0
获取镜像tag
$ curl -u<user:password> https://www.example.com/v2/<image name>/tags/list
获取镜像列表
$ curl -u<user:password> https://www.example.com/v2/_catalog
删除镜像
curl -X DELETE -u<user:password> https://www.example.com/v2/<image name>/manifests/<digest>
执行grabage-collect并且重启(垃圾回收, 释放本地空间)
docker exec registry /bin/registry garbage-collect /etc/docker/registry/config.yml #registry即容器名,也可以是容器ID
docker restart registry
垃圾回收之后, /v2/_catalog查看仍然存在,直接删除/var/docker/registry/docker/registry/v2/repositories/registry即可