此前,《Docker 容器镜像是怎么炼成的》一文简单提到了容器镜像的一些知识,并介绍了镜像在 registry 中存储的目录结构。本文从文件系统层面分析了 registry GC 的原理,相比源码分析更加直观。
部署 registry 容器
首先我们在本地部署一个 registry 容器,再使用 skopeo 工具替代 Docker 命令行客户端进行 copy 镜像和 delete 镜像。
自签 SSL 证书
这样我们在使用 skopeo 时不用加额外参数。
信任证书,根据不同的发行版选择相应的路径和命令行即可。
创建密码 auth 认证 auth.htpasswd 文件
由于 push 镜像和 delete 镜像是通过 HTTP 请求 registry 的 API 完成的,每个请求都需要一个 token 才能完成操作,这个 token 则需要使用 AUTH 文件进行鉴权。我们使用 htpasswd
来生成一个明文的用户、密码即可。
启动 registry 容器,docker run!
-
-v /var/lib/registry:/var/lib/registry
,将本地的存储目录挂载到容器内的 registry 存储目录下。 -
-v pwd/certs:/certs
,将生成的 SSL 证书挂载到容器内。 -
-e REGISTRY_STORAGE_DELETE_ENABLED=true
,添加该参数才能进行 DELETE 镜像操作,不然的话会提示 Error in deleting repository in a private registry V2 #1573 这种错误。
docker login
这一步是为了在 ~/.docker/.config.json
中添加 auth 认证,方便后面使用 skopeo。
copy 镜像到 registry