首页 > 其他分享 >Skopeo 镜像管理工具调研

Skopeo 镜像管理工具调研

时间:2024-01-25 21:55:27浏览次数:23  
标签:-- 管理工具 steamer ui skopeo 镜像 docker 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:[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

相关文章

  • DOCKER 镜像创建
    DOCKER镜像创建 基于现有镜像创建 #创建个新的容器 #进入创建的容器里,下载epel源 #再下载个nginx #启动nginx #配置测试文件 #创建个新的镜像 #没有起来,基于本地的容器创建的镜像所创建的容器没有启动命令,要加上启动命令#根据新镜像创建个容器 #进......
  • 阿里云服务器Centos镜像解决方案apt-get: command not found
    阿里云服务器Centos镜像解决方案apt-get:commandnotfound:https://blog.csdn.net/qq_45848361/article/details/110359637?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170616908216800227442979%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257......
  • docker -- images镜像消失问题排查
    1.问题描叙安装model-serving组件时,错误日志输出push时对应的tag不存在,导致镜像推送失败2.问题排查#找到对应镜像,尝试手动推送dockerimages|grepmlserver#发现未找到,尝试手动loadcdmodel-serving/imagesdockerload-imlserver.tar.gz#等待加载完成,再次通过d......
  • 用 UNPKG/CDNJS 国内镜像优化网页加载速度
    unpkg.com和cdnjs.cloudflare.com这两个官方域名的加载速度实在令人汗颜。抽了一下午找了些国内能用的高速稳定镜像,批量更换一下就能加速访问了。unpkg用Zstatic的镜像,把原来的unpkg.com换成s4.zstatic.net/npmcdnjs用360或者Zstatic的镜像,把原来的cdnjs.cloudfl......
  • 光纤资源数字管理工具能为我们解决什么问题?
    光纤资源数字管理工具基于GIS地图结合数字孪生与物联网技术,以可视化的方式管理光纤资源,使得管理者更加高效、准确的做出决策。今天,我们结合nVisual来看一下,光纤资源数字管理工具能够为我们解决哪些问题?1、资产管理我们都有哪些设备与线路资源?资源位置在那?当故障问题发生时,如何快速......
  • cosign 镜像签名工具
    起因我最近在搞ACS(ADVANCEDCLUSTERSECURITYFORKUBERNETES),其中有一个功能是验证镜像签名。它是个什么?Cosign是一个用于签名和验证容器镜像的工具,它允许用户对镜像进行数字签名,并验证签名以确保镜像的完整性和来源。通过使用Cosign,你可以创建和管理镜像的签名,并在部署时验证......
  • k8s 镜像
    目录k8s镜像镜像名称更新镜像镜像拉取策略默认镜像拉取策略ImagePullBackOff使用私有仓库配置节点向私有仓库进行身份验证config.json说明提前拉取镜像在Pod上指定ImagePullSecrets使用DockerConfig创建Secret使用案例k8s镜像镜像名称容器镜像通常会被赋予pause、ex......
  • containerd 像Docker一样丝滑操作镜像【转】
    containerd像Docker一样丝滑操作镜像• 我们知道DockerCLI工具提供了需要增强用户体验的功能,containerd同样也提供一个对应的CLI工具:ctr,不过ctr的功能没有docker完善,但是关于镜像和容器的基本功能都是有的。接下来我们就先简单介绍下ctr的使用。➜  ~ ctrN......
  • PNET上传镜像
    PNET上传镜像--------##记得修复镜像不然镜像启动不了QEMU的镜像,官方对于该镜像的上传和识别有着相应的标准。就是QEMU的镜像需要放在符合命名规则的目录下面,这样才能够被识别和使用。QEMU镜像格式一般以.qcow2为后缀的,QEMU镜像需要上传至pnet的/opt/unetlab/addons/q......
  • 华为eNSP中防火墙web登录方法附带USG6000V镜像安装包(超级详细附步骤图)
    华为eNSP中防火墙web登录方法(超级详细附步骤图)在ensp中使用防火墙,我们选择USG6000V在启动防火墙时,会提示导入镜像文件,选中镜像文件打开即可(镜像安装包链接:https://pan.baidu.com/s/15Szr2za9apdQfQ7Tremzeg?pwd=dmfv提取码:dmfv)搭建环境:在cloud中选择网卡,可以选择虚拟......