大家好,如果您还对高效镜像同步:skopeo在不同仓库间的同步解决方案不太了解,没有关系,今天就由本站为大家分享高效镜像同步:skopeo在不同仓库间的同步解决方案的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
skopeo 使用 API V2 Registry,例如 Docker Registry、Atomic Registry、私有Registry、本地目录和本地 OCI 镜像目录。skopeo 不需要运行守护进程,它可以执行的操作包括:
- 检测远程镜像并查看其属性
- 从镜像库中删除镜像
- 查看镜像所有tag
项目地址
Github 官方地址: https://github.com/containers/skopeo
解决痛点
假如有如下场景,我们从dockerhub公共仓库中下载一个GB以上的镜像,到本地的私有仓库中,我想通常你会这样做先docker pull 到本地,然后使用docker tag更改为私有仓库地址加上镜像名称版本,最后再使用docker push上传镜像到私有仓库中,以供其它内网机器拉取并使用。虽然该方法是可行,但是如果有多个大于GB以上的镜像需要上传到私有仓库,每次都要先解压layer到本地,然后再压缩layer上传到私有仓库中,这是一个很浪费时间的过程。skope工具刚好用来节省这一操作的时间,可以用来替代 docker-cli 来搬运镜像。
安装
Skopeo 官方安装&编译方式参考文档:
https://github.com/containers/skopeo/blob/main/install.md
- 编译安装
使用nixos/nix镜像进行编译:实测这种方式最靠谱,本地编译可能出现各种依赖问题
$ git clone https://github.com/containers/skopeo.git$ cd skopeo$ sed -i 's#proxy.golang.org#https://goproxy.cn#g' Makefile#使用 nixos/nix:2.3.12 来构建静态链接的 Skopeo 二进制文件需要完整构建 Skopeo 所有的依赖,比如 glibc、systemd、golang 等,所以构建十分耗时。在一台 4c8G 的机器上构建用了将近半个小时$ BUILD_IMAGE=nixos/nix:2.3.12$ docker run --rm -t -v $PWD:/build ${BUILD_IMAGE} \sh -c "cd /build && nix build -f nix && cp ./result/bin/skopeo skopeo"- 在线安装
centos/fedora:
yum install skopeo注意:安装的可能不是最新的版本,有些功能可能不可用,比如list-tags,所以还是建议编译安装
使用
在使用 skopeo 前如果 src 或 dest 镜像是在 registry 仓库中的并且配置了非 public 的镜像需要相应的 auth 认证, 此时我们需要使用 docker login 或者 skopeo login 的方式登录到 registry 仓库,然后默认会在~/.docker目录下生成 registry 登录配置文件 config.json ,该文件里保存了登录需要的验证信息,skopeo 拿到该验证信息才有权限往 registry 拉取或者推送镜像。
# (1) skopeo login 登陆示例skopeo login -u wuqy -p testpassword hub.easyops.local# (2) docker login 登陆示例docker login -u wuqy docker.iodocker login -u wuqy hub.easyops.localdocker login -u anonymous -p anonymous 192.168.1.79:5000# (3) docker login 生成的 registry 登录配置文件cat ~/.docker/config.json{ "auths": { "192.168.1.79:5000": { "auth": "YW5v*******Q==" }, "hub.easyops.local": { "auth": "YWR*******LkA=" }, "https://index.docker.io/v1/": { "auth": "d2Vp**************kyZA==" } }}注销认证:
skopeo logout 192.168.1.79:5000如果企业自建harbor仓库(一般都会设置自签证书)或者其它私有仓库配置证书,为了防止出错建议进行以下操作(正式环境请根据需要进行配置)。
- 方式一
在 /etc/docker/daemon.json 中配置insecure-registries字段,表示允许不安全的仓库。
"insecure-registries": ["hub.easyops.local","192.168.1.79:5000"]- 方式二
从官方文档可知客户端要使用tls与Harbor通信使用的还是`自签证书`,那么必须建立一个目录:
mkdir -vp /etc/docker/certs.d/hub.easyops.localcp -a /deployapp/harbor/harbor.pem /etc/docker/certs.d/hub.easyops.local/harbor.crtsystemctl restart docker为了防止后续执行skopeo命令操作镜像时出错, 建议忽略policy策略和证书校验,参数如下:
--insecure-policy \--src-tls-verify=false \ --dest-tls-verify=false \2. 检查存储库中的镜像
skopeo 能够检查容器Registry上的存储库并获取镜像层。检查命令获取存储库的清单,它能够向您显示有关整个存储库或标签的类似 docker inspect 的 json 输出。与 docker inspect 相比,此工具可帮助您在拉取存储库或标签之前收集有用的信息(使用磁盘空间), 检查命令可以向您显示给定存储库可用的标签、映像具有的标签、映像的创建日期和操作系统等。
支持传输的类型 : containers-storage, dir, docker, docker-archive, docker-daemon, oci, oci-archive, ostree, tarball
显示 busybox:latest 镜像的属性相关信息:
$ skopeo inspect docker://docker.io/busybox:latest{ "Name": "docker.io/library/busybox", "Digest": "sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678", "RepoTags": [ "1", "1-glibc", "1-musl", "1-ubuntu", "1-uclibc", "1.21-ubuntu", "1.21.0-ubuntu", ....... # 镜像历史tags "unstable-uclibc" ], "Created": "2021-12-30T19:19:41.006954958Z", "DockerVersion": "20.10.7", "Labels": null, "Architecture": "amd64", "Os": "linux", "Layers": [ "sha256:5cc84ad355aaa64f46ea9c7bbcc319a9d808ab15088a27209c9e70ef86e5a2aa" ], "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ]}显示 busybox:latest 镜像的容器配置相关信息:
$ skopeo inspect --config docker://docker.io/busybox:latest | jq{ "created": "2021-12-30T19:19:41.006954958Z", "architecture": "amd64", "os": "linux", "config": { "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "sh" ] }, "rootfs": { "type": "layers", "diff_ids": [ "sha256:01fd6df81c8ec7dd24bbbd72342671f41813f992999a3471b9d9cbc44ad88374" ] }, "history": [ { "created": "2021-12-30T19:19:40.833034683Z", "created_by": "/bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4cfde1f280177b458390ed5a6d1b54c6169522bc2c4d838e in / " }, { "created": "2021-12-30T19:19:41.006954958Z", "created_by": "/bin/sh -c #(nop) CMD [\"sh\"]", "empty_layer": true } ]}查询镜像摘要Digest:
$ skopeo inspect --format "Name: {{.Name}} Digest: {{.Digest}}" docker://docker.io/busybox:latest3. 仓库镜像拷贝
利用该命令我们可以列出 registry 上的某个镜像的所有 tag ,这个功能很有用,因为有时我们不知道一个镜像目前有哪些tag,不加tag的话默认就是latest,这个不是一个好的选择。
比如我们要查看busybox这个镜像目前有哪些tag用下面的命令:
$ skopeo list-tags docker://docker.io/busybox{ "Repository": "docker.io/library/busybox", "Tags": [ "1", "1-glibc", "1-musl", "1-ubuntu", "1-uclibc", "1.21-ubuntu", "1.21.0-ubuntu", "1.23", "1.23.2", "1.24", "1.24-glibc", "1.24-musl", "1.24-uclibc", "1.24.0", "1.24.1", "1.24.1-glibc", "1.24.1-musl", "1.24.1-uclibc", "1.24.2", "1.24.2-glibc", "1.24.2-musl", "1.24.2-uclibc", "1.25", "1.25-glibc", "1.25-musl", "1.25-uclibc", "1.25.0", "1.25.0-glibc", "1.25.0-musl", "1.25.0-uclibc", "1.25.1", "1.25.1-glibc", "1.25.1-musl", "1.25.1-uclibc", "1.26", "1.26-glibc", "1.26-musl", "1.26-uclibc", "1.26.0", "1.26.0-glibc", "1.26.0-musl", "1.26.0-uclibc", "1.26.1", "1.26.1-glibc", "1.26.1-musl", "1.26.1-uclibc", "1.26.2", "1.26.2-glibc", "1.26.2-musl", "1.26.2-uclibc", "1.27", "1.27-glibc", "1.27-musl", "1.27-uclibc", "1.27.0", "1.27.0-glibc", "1.27.0-musl", "1.27.0-uclibc", "1.27.1", "1.27.1-glibc", "1.27.1-musl", "1.27.1-uclibc", "1.27.2", "1.27.2-glibc", "1.27.2-musl", "1.27.2-uclibc", "1.28", "1.28-glibc", "1.28-musl", "1.28-uclibc", "1.28.0", "1.28.0-glibc", "1.28.0-musl", "1.28.0-uclibc", "1.28.1", "1.28.1-glibc", "1.28.1-musl", "1.28.1-uclibc", "1.28.2", "1.28.2-glibc", "1.28.2-musl", "1.28.2-uclibc", "1.28.3", "1.28.3-glibc", "1.28.3-musl", "1.28.3-uclibc", "1.28.4", "1.28.4-glibc", "1.28.4-musl", "1.28.4-uclibc", "1.29", "1.29-glibc", "1.29-musl", "1.29-uclibc", "1.29.1", "1.29.1-glibc", "1.29.1-musl", "1.29.1-uclibc", "1.29.2", "1.29.2-glibc", "1.29.2-musl", "1.29.2-uclibc", "1.29.3", "1.29.3-glibc", "1.29.3-musl", "1.29.3-uclibc", "1.30", "1.30-glibc", "1.30-musl", "1.30-uclibc", "1.30.0", "1.30.0-glibc", "1.30.0-musl", "1.30.0-uclibc", "1.30.1", "1.30.1-glibc", "1.30.1-musl", "1.30.1-uclibc", "1.31", "1.31-glibc", "1.31-musl", "1.31-uclibc", "1.31.0", "1.31.0-glibc", "1.31.0-musl", "1.31.0-uclibc", "1.31.1", "1.31.1-glibc", "1.31.1-musl", "1.31.1-uclibc", "1.32", "1.32-glibc", "1.32-musl", "1.32-uclibc", "1.32.0", "1.32.0-glibc", "1.32.0-musl", "1.32.0-uclibc", "1.32.1", "1.32.1-glibc", "1.32.1-musl", "1.32.1-uclibc", "1.33", "1.33-glibc", "1.33-musl", "1.33-uclibc", "1.33.0", "1.33.0-glibc", "1.33.0-musl", "1.33.0-uclibc", "1.33.1", "1.33.1-glibc", "1.33.1-musl", "1.33.1-uclibc", "1.34", "1.34-glibc", "1.34-musl", "1.34-uclibc", "1.34.0", "1.34.0-glibc", "1.34.0-musl", "1.34.0-uclibc", "1.34.1", "1.34.1-glibc", "1.34.1-musl", "1.34.1-uclibc", "1.35", "1.35-glibc", "1.35-musl", "1.35-uclibc", "1.35.0", "1.35.0-glibc", "1.35.0-musl", "1.35.0-uclibc", "1.36", "1.36-glibc", "1.36-musl", "1.36-uclibc", "1.36.0", "1.36.0-glibc", "1.36.0-musl", "1.36.0-uclibc", "1.36.1", "1.36.1-glibc", "1.36.1-musl", "1.36.1-uclibc", "buildroot-2013.08.1", "buildroot-2014.02", "glibc", "latest", "musl", "stable", "stable-glibc", "stable-musl", "stable-uclibc", "ubuntu", "ubuntu-12.04", "ubuntu-14.04", "uclibc", "unstable", "unstable-glibc", "unstable-musl", "unstable-uclibc" ]}5. podman镜像同步示例
从registry.redhat.io同步redhat-operator-index:v4.12镜像到私有仓库hub.easyops.local的ocp-poc项目下面
podman login registry.redhat.iopodman login hub.easyops.localskopeo copy --all --authfile /run/containers/0/auth.json docker://registry.redhat.io/redhat/redhat-operator-index:v4.12 docker://hub.easyops.local/ocp-poc/redhat/redhat-operator-index:v4.12注:--all同步所有架构
6. 批量镜像同步最佳实践
准备一个镜像列表 images-list.txt:
$ images-list.txt$ cat<<'EOF' >images-list.txtprom/pushgateway:v1.6.0prom/blackbox-exporter:v0.24.0prom/prometheus:v2.42.0prom/pushgateway:v1.5.0timonwong/prometheus-webhook-dingtalk:v2.1.0prom/alertmanager:v0.24.0EOF同步脚本:这里以同步到aliyun仓库为例,如需其他根据实际情况修改
#!/bin/bashwhile read linedo echo $line aliline=$(echo $line | awk -F "/" '{print $NF}') echo $aliline echo "skopeo copy --all docker://$line docker://registry.cn-hangzhou.aliyuncs.com/easyopshub/$aliline" skopeo copy docker://$line docker://registry.cn-hangzhou.aliyuncs.com/easyopshub/$alilinedone< images.txt好了skopeo的使用介绍就到这里,还有更多玩法可以自己再探索下。
原文链接:https://mp.weixin.qq.com/s/B9OZfavrmqZQaKCpuOnmsA
用户评论
这篇文章写的挺棒的!我之前一直手动的操作镜像拷贝,非常浪费时间。使用skopeo同步镜像效率高很多啊!
有6位网友表示赞同!
文章讲得清晰易懂,很详细地介绍了如何使用 Skopeo 进行镜像同步。我打算找个空闲时间试一试,看看能不能改善我的镜像管理流程。
有18位网友表示赞同!
Skopeos 这个工具真是太厉害了!我现在在多个仓库间操作镜像变得轻松了不少。之前一直担心数据同步问题, Skopeo 真心解决了我的烦恼!
有16位网友表示赞同!
不同仓库间的镜像同步确实是个大难题,幸好找到了这篇博客介绍 Skopeo 的用法,感觉很不错。试用一下看看效果吧!
有7位网友表示赞同!
这个工具听起来很有用,但我觉得操作步骤还是有点复杂,对于初学者来说,可能需要一些时间来理解和上手。希望以后能有更图文并茂的教程。
有7位网友表示赞同!
这篇文章终于解释了 Skopeo 的具体功能!我一直想了解如何利用它进行镜像同步,而且还提供详细的命令示例,太棒了!
有10位网友表示赞同!
我对不同仓库镜像之间的数据管理很是头疼,突然遇到这篇博客就感觉希望来了!一定要试一试 Skopeo 这个工具,看看能不能帮我解决这些问题。
有8位网友表示赞同!
虽然文章讲得很清楚,但我觉得实际操作的步骤还是比较繁琐,特别是对于大型镜像库来说。可能需要寻找一些更自动化的方法来进行管理.
有11位网友表示赞同!
学习Skopeos 的用法,的确能提高工作效率和降低操作风险!感谢作者分享这个宝贵的经验,我一定会好好学习。
有8位网友表示赞同!
使用 Skopeo 进行镜像同步确实很方便,但要注意安全问题,确保传输过程不被恶意攻击。建议文章可以添加一些关于安全的提示内容。
有5位网友表示赞同!
镜像同步功能一直是 Docker 生态系统中重要的功能点。Skopeos 能提供一个便捷的解决方案,提升了镜像管理的效率和安全性。感谢作者分享!
有9位网友表示赞同!
我非常喜欢使用 Skopeo 进行镜像同步,因为它可以帮助我快速更新不同仓库中的镜像版本。不过希望未来可以支持更多镜像是仓库格式。
有13位网友表示赞同!
感觉这篇博客对 Skopeo 的介绍过于简略,没有深入讲解一些关键概念和功能细节。我希望能看到更详细的分析和实践案例。
有16位网友表示赞同!
我觉得这个工具非常强大,可以帮助我们更好地管理容器镜像仓库。建议进一步探讨如何将 Skopeo 与其他工具集成使用,以构建更完善的运维自动化流程。
有7位网友表示赞同!
我一直在寻找一种高效便捷的方法来进行镜像同步,博客中介绍的 Skopeos 看起来很不错,我会试一试。
有19位网友表示赞同!
虽然 Skopeo 可以实现镜像同步,但它也有一定的局限性,比如不支持跨平台同步。我希望作者可以进一步分享更多关于 Skopeo 的优势和不足之处,以便大家更好地评估它的适用范围。
有15位网友表示赞同!