Skopeo 镜像管理工具调研
不需要运行守护进程,用于对容器镜像与容器仓库执行管理操作的命令行工具,支持OCI镜像与Docker V2镜像
- Github地址:https://github.com/containers/skopeo
- 安装文档:https://github.com/containers/skopeo/blob/main/install.md
- 开源许可协议:Apache-2.0 license
1. 安装
- yum安装
# os: Centos7.6
sudo yum -y install skopeo
# 查询版本,发现skopeo相对Git版本比较旧
skopeo --version
# 输出
0.1.40
- 容器编译
编译skopeo依赖 go-md2man
# 下载源码
git git clone https://github.com/cpuguy83/go-md2man.git
# 构建 go-md2man
# 配置构建的镜像
BUILD_IMAGE="golang:latest"
cd go-md2man
docker run --name md2man-build -v $[PWD:/src](http://pwd/src) -w /src -e CGO_ENABLED=0 -e GOPROXY=[https://goproxy.cn,direct](https://goproxy.cn%2Cdirect/) golang:latest
sh -c "make"
# 拷贝命令到 PATH路径
cp ./bin/go-md2man /usr/bin/
# 检查
go-md2man --help
编译skopeo
# 下载源码, 通过--branch 指定分支,使用最新版本
git clone https://github.com/containers/skopeo.git
# 进入目录替换代理
cd skopeo
sed -i 's#[proxy.golang.org#](http://proxy.golang.org/)[https://goproxy.cn#g](https://goproxy.cn/#g)' skopeo/Makefile
# 使用golang镜像编译
# 编译依赖 go-md2man
# 构建 skopeo
cd skopeo
docker run --rm --name skopeo-build -v $[PWD:/src](http://pwd/src) -v /usr/bin/[go-md2man:/go/bin/go-md2man](http://go-md2man/go/bin/go-md2man) -w /src -e CGO_ENABLED=0 -e GOPROXY=[https://goproxy.cn,direct](https://goproxy.cn%2Cdirect/) golang:latest
sh -c 'make BUILDTAGS=containers_image_openpgp GO_DYN_FLAGS='
# 拷贝命名到 PAHT
cp bin/skopeo /usr/bin/
# 检查
skopeo --version
2. 基本命令
./skopeo --help # 子命令可采用如下命令 skopeo [command] --help 命令
Usage:
skopeo [flags]
skopeo [command]
Available Commands:
copy # 复制一个镜像从 A 到 B,这里的 A 和 B 可以为本地 docker 镜像或者 registry 上的镜像;
delete # 删除一个镜像 tag,可以是本地 docker 镜像或者 registry 上的镜像;
help # 帮助查看
inspect # 查看一个镜像的 manifest 或者 image config 详细信息;
list-tags # 列出存储库名称指定的镜像的tag
login # 登陆某个镜像仓库,类似于 docker login 命令
logout # 退出某个已认证的镜像仓库, 类似于 docker logout 命令
manifest-digest # 计算文件的清单摘要是一个sha256sum 值
standalone-sign # 使用本地文件创建签名
standalone-verify # 验证本地文件的签名
sync # 将一个或多个图像从一个位置同步到另一个位置 (该功能非常Nice)
Flags:
--command-timeout duration # 命令超时时间(单位秒)
--debug # 启用debug模式
--insecure-policy # 在不进行任何策略检查的情况下运行该工具(如果没有配置 policy 的话需要加上该参数)
--override-arch ARCH # 处理镜像时覆盖客户端 CPU 体系架构,如在 amd64 的机器上用 skopeo 处理 arm64 的镜像
--override-os OS # 处理镜像时覆盖客户端 OS
--override-variant VARIANT # 处理镜像时使用VARIANT而不是运行架构变量
--policy string # 信任策略文件的路径 (为镜像配置安全策略情况下使用)
--registries.d DIR # 在目录中使用Registry配置文件(例如,用于容器签名存储)
--tmpdir string # 用于存储临时文件的目录
-h, --help help for skopeo
-v, --version Version for Skopeo
3. 支持的镜像格式
Skopeo copy --help查询支持支持的传输格式,安装包使用:dir oci docker://两种格式
IMAGE NAMES(镜像格式) 说明 例子 dir: 保存在本地目录的镜像 dir:/PATH docker:// 存在register上的镜像 docker://http://k8s.gcr.io/kube-apiserver:v1.17.5 docker-daemon: pull下来的镜像,保存在主机文件系统上的docker卷中 docker-daemon:alpine:latest docker-archive: docker save 出来的镜像 docker-archive:alpine.tar (docker save) oci: OCI布局目录 oci:alpine:latest
4. 部署一个轻量级register
-
Docker Registry
# 文档: https://docs.docker.com/registry/
# 镜像地址:https://hub.docker.com/_/registry
# 启动rigster-server
docker run -d -p 5000:5000 --name registry registry:2
- 测试register
# 拉取镜像
docker pull ubuntu
# 对镜像名进行重新tag
docker image tag ubuntu localhost:5000/myfirstimage
# 推送到私有register
docker push localhost:5000/myfirstimage
# 从私有镜像仓库拉取镜像
docker pull localhost:5000/myfirstimage
- 停止并移除所有数据
# 停止镜像并移除所有数据
docker container stop registry && docker container rm -v registry
5. skopoe工具测试与使用
- 登录register
# 登录远程register,输入账号名与密码,登录成功会输出 Login Succeeded!
# -u 指定用户名 -p指定密码,后面是 域名:端口
# 登录成功的认证信息保存在用户家目录下 ~/.docker/config.json
skopeo login [harbor.tiduyun.com](http://harbor.tiduyun.com/)
- 查询镜像信息
# 检查register中的镜像
skopeo inspect [docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x](docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x)
# 查询镜像配置信息
skopeo inspect --config [docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x](docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x)
# 格式化输出
skopeo inspect --format "Name: {{.Name}}" [docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x](docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x)
- register之间拷贝镜像
# register A 拷贝到 register B
# 镜像拷贝直接拷贝layer层的blob文件,传输的是镜像在register中的原始格式
# 通过 --dest-authfile 指定目的地register的登录验证文件 /root/.docker/config.json
skopeo copy
--insecure-policy --src-tls-verify=false --dest-tls-verify=false
[docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x](docker://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x)
[docker://localhost:5000/wjy/steamer-ui:v8.0.0](docker://localhost:5000/wjy/steamer-ui:v8.0.0)
# 检查是否拷贝成功
# 输出{"repositories":["wjy/steamer-ui"]}表示拷贝成功
curl localhost:5000/v2/_catalog
- 从register拷贝镜像到本机目录
# 将镜像从register拷贝到本地目录
skopeo copy
--insecure-policy --src-tls-verify=false
[docker://localhost:5000/wjy/steamer-ui:v8.0.0](docker://localhost:5000/wjy/steamer-ui:v8.0.0)
dir:steamer-ui.v8.0.0
# 查询大小,结果是20M
du -h -d steamer-ui.v8.0.0
# 使用原始docker save方式
docker pull localhost:5000/wjy/steamer-ui:v8.0.0
docker save localhost:5000/wjy/steamer-ui:v8.0.0 -o steamer-ui.v8.0.0.amd64.image.tgz
# 查阅save格式文件大小,结果是67M
du -h steamer-ui.v8.0.0.amd64.image.tgz
# 结果镜像占用空间大小缩小了 (67-20)/67 = 70%
# 将镜像以oci格式保存
skopeo copy
--insecure-policy --src-tls-verify=false
[docker://localhost:5000/wjy/steamer-ui:v8.0.0](docker://localhost:5000/wjy/steamer-ui:v8.0.0)
oci:steamer-ui.v8.0.0.oci
# 查询文件大小,发现也是20M
du -h -d 1 steamer-ui.v8.0.0.oci
- 从本机目录拷贝镜像到register
# 将镜像从本地存储拷贝到register中,通过 --dest-authfile 指定目的地register登录验证
skopeo copy
--insecure-policy --dest-tls-verify=false
oci:steamer-ui.v8.0.0.oci
[docker://localhost:5000/wjy/steamer-ui-test:v8.0.1](docker://localhost:5000/wjy/steamer-ui-test:v8.0.1)
- 同步register镜像到本机目录
# 同步register与本地目录中的镜像文件
mkdir images
# sync可以通过Tag指定某个镜像,若没有tag则同步该镜像所有的tag版本
skopeo sync
--insecure-policy --src-tls-verify=false
--src docker --dest dir
[harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x](http://harbor.tiduyun.com/system/steamer-ui:8.0.x-yzf-1.0.x) ./images
- 同步本地目录到register镜像目录
# 同步本地目录到register
skopeo sync
--insecure-policy --dest-tls-verify=false
--src dir --dest docker
./images localhost:5000/wjy
- 处理其他架构的镜像
# 通过 --override-arch 和 --override-os 处理其他架构的镜像
skopeo copy --insecure-policy --src-tls-verify=false --override-arch=arm64 --override-os=linux [docker://harbor.tiduyun.com/steamer-package/prometheus:v2.12.0-arm64](docker://harbor.tiduyun.com/steamer-package/prometheus:v2.12.0-arm64) dir:[email protected]
- 验证参数
# 忽略证书校验参数
--insecure-policy # 不安全访问 http方式
--src-tls-verify=false # 不验证源tls
--dest-tls-verify=false # 不验证目的tls
6. 优点
1. 不用本地运行docker-daemon即可实现register到文件、文件到register、register到register之间的镜像拷贝、同步、重新tag、查询镜像元数据
2. 通过skopeo方式保存镜像,通过测试steamer-ui,可以将镜像保存体积缩小70%,镜像保存成文件差距是因为docker save没有做gzip压缩
3. 后续将skopeo集成到安装包安装与打包过程,将镜像部分与安装逻辑进行分离
4. 按镜像层进行更新,可以实现快速下载更新镜像,具有幂等性
标签:--,管理工具,steamer,ui,skopeo,镜像,docker,Skopeo
From: https://www.cnblogs.com/2bjiujiu/p/17988274