Skopeo 镜像管理工具调研

Skopeo 镜像管理工具调研

不需要运行守护进程,用于对容器镜像与容器仓库执行管理操作的命令行工具,支持OCI镜像与Docker V2镜像

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:prometheus@v2.12.0
  • 验证参数
# 忽略证书校验参数
--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. 按镜像层进行更新,可以实现快速下载更新镜像,具有幂等性
posted @ 2024-01-25 21:53  梦_鱼  阅读(492)  评论(0编辑  收藏  举报