docker私有仓库搭建与管理(实践可行)
Docker仓库在2.1版本中支持了删除镜像的API,但这个删除操作只会删除镜像元数据,不会删除层数据。在2.4版本中对这一问题进行了解决,增加了一个垃圾回收命令,删除未被引用的层数据。
一 本地仓库搭建步骤
1.拉取最新的官方镜像registry:
[root@docker ~]$ docker pull registry
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
registry latest ee585077aecf 21 months ago 33.19 MB
2.新建docker配置文件,其内容为
[root@LeoLinux tempfile]# cat /home/user/registry-conf/config.yml
version: 0.1
log:
fields:
service: registry
storage:
cache:
blobdescriptor: inmemory
filesystem:
rootdirectory: /var/lib/registry
delete: # 注意这里是新加入的配置,有了这个配置就可以删除仓库中的镜像了
enabled: true
http:
addr: :5000
headers:
X-Content-Type-Options: [nosniff]
health:
storagedriver:
enabled: true
interval: 10s
threshold: 3
3.启动容器
[root@docker ~]# docker run -d -p 5000:5000 --restart=always --name registry -v /home/user/registry-conf/config.yml:/etc/docker/registry/config.yml -v /data/docker/registry:/var/lib/registry registry
- –restart=always:容器的重启策略,always表示总是重启
- 分别挂载容器的配置文件和容器中的镜像仓库的存放位置
4.修改访问协议:默认情况下docker仓库的访问是通过https来访问的,要想通过http访问需要增加一个配置,如下是CentOS 6.5中的配置方法:
# 方法一
[root@docker ~]# cat /etc/docker/daemon.json
{
"insecure-registries": ["XXX.XXX.XXX:5000"] # 修改这一行,xxx是你仓库的IP地址
}
[root@docker ~]# service docker restart
# 方法二
sudo vim /etc/sysconfig/docker
other_args="--insecure-registry xxx.xxx.xxx.xxx:5000" # 修改这一行,xxx是你仓库的IP地址
sudo /etc/init.d/docker restart
5.上传镜像
- 首先给需要上传的镜像重命名,命名规则:IP:PORT/image_name:tag,例如:docker tag alpine:latest 192.168.1.1:5000/alpine:latest
- 然后执行docker push命令:docker push 192.168.1.1:5000/alpine:latest
6.查看仓库
# curl -X GET http://registry:5000/v2/_catalog
# curl -X GET http://registry:5000/v2/image_name/tags/list
二 镜像删除和垃圾回收
1.首先获取镜像的sha256值:
# curl -I -X GET http://registry:5000/v2/your_image_name/manifests/your_image_name_tag
HTTP/1.1 200 OK
Content-Length: 1193
Content-Type: application/vnd.docker.distribution.manifest.v1+prettyjws
Docker-Content-Digest: sha256:01774f52c29287c2fde82a66fb7b2aa4fe7d36ab54ba816b21ae0fa1f212bff2
Docker-Distribution-Api-Version: registry/2.0
Etag: "sha256:01774f52c29287c2fde82a66fb7b2aa4fe7d36ab54ba816b21ae0fa1f212bff2"
X-Content-Type-Options: nosniff
Date: Tue, 30 Jul 2019 02:33:09 GMT
# 这是正常情况下的返回,在registry2.3及其以后的版本,为了防止误删除,在取 digest 的时候,必须提供一个特殊的头:
# curl --header "Accept: application/vnd.docker.distribution.manifest.v2+json" \
-I \
-X HEAD http://registry:5000/v2/your_image_name/manifests/your_image_name_tag
# 否则删除的时候会报错{"errors":[{"code":"MANIFEST_UNKNOWN","message":"manifest unknown"}]}
2.执行删除操作
curl -X DELETE http://registry:5000/v2/your_image_name/manifests/sha256:01774f52c29287c2fde82a66fb7b2aa4fe7d36ab54ba816b21ae0fa1f212bff2
3.删除成功后,会发现实际上挂载的文件夹的大小并没有改变,还需要进入仓库容器执行垃圾回收,这下就能彻底删除了:
# docker exec -it reqistry_container_id /bin/sh
# registry garbage-collect /etc/docker/registry/config.yml
11万+

被折叠的 条评论
为什么被折叠?



