Fork me on GitHub

Docker私有仓库

官方的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即可

轻轻的我走了,正如我轻轻的来