一、Skopeo介绍

Skopeo是一款用来操作、检查、签署和传输容器镜像及镜像存储库的工具, 支持Linux系统、Windows 和 Macos。 与Podman和Buildah一样,

Skopeo也是一个由开源社区推动的项目,也不需要运行容器守护进程。


Skopeo是一个能操作不同格式(包括开放容器计划(OCI)和Docker镜像)容器镜像的轻量级模块化解决方案, 您无需下载包含所有层的完整镜像,就可检查远程镜像仓库中的镜像。


Skopeo(希腊语"远程查看"的意思)是红帽工程师与开源社区携手开发的第一款容器工具。 Skopeo可与Podman和Buildah搭配来管理OCI容器。简而言之,Podman负责运行容器,Buildah负责构建容器, 而Skopeo则负责传输容器,同时也提供其他功能。


我们可以把这些工具看成是用于容器环境的一把瑞士军刀。Skopeo是其中最万能的那把刀,任由您支配。

github:
https://github.com/containers/skopeo/blob/main/install.md

下载:
https://github.com/lework/skopeo-binary/releases

二、Skopeo使用

本次测试使用3台虚拟机

192.168.80.28  lyc-80-28---主harbor

192.168.80.28  lyc-80-29---备harbor

192.168.80.28  lyc-80-30----模拟镜像提交

1、安装compose

下载离线包
https://github.com/docker/compose/releases/tag/v2.25.0/docker-compose-linux-x86_64
上传虚拟机/root目录
mv  docker-compose-linux-x86_64  docker-compose
mv docker-compose   /usr/local/bin/
cd  /usr/local/bin/
sudo chmod 777  /usr/local/bin/docker-compose
echo "export PATH=$PATH:/usr/local/bin/docker-compose" >> ~/.bashrc 
source ~/.bashrc
测试
docker compose  -v
docker-compose  -v
[root@lyc-80-28 ~]# docker-compose  -v
Docker Compose version v2.24.5
-------192.168.80.28、192.168.80.29安装

2、安装harbor

下载
https://github.com/goharbor/harbor/releases/tag/v2.10.3/harbor-offline-installer-v2.10.3.tgz
安装包上传虚拟机
tar -zxvf harbor-offline-installer-v2.10.3.tgz   -C /usr/local/
进harbor文件夹
cd  /usr/local/harbor
cp  harbor.yml.tmpl   harbor.yml
修改配置文件
vim harbor.yml
-----------------------
hostname: 192.168.80.28
【注销】
#https:
  # https port for harbor, default is 443
#  port: 443
  # The path of cert and key files for nginx
#  certificate: /your/certificate/path
#  private_key: /your/private/key/path
  # enable strong ssl ciphers (default: false)
  # strong_ssl_ciphers: false
harbor_admin_password: 123456  【登录harbor密码】
data_volume: /data 【数据存放位置】
-------------------192.168.80.28[主]、192.168.80.29安装[备]

执行安装脚本

cd  /usr/local/harbor在该目录下执行脚本
./prepare

第十八节   镜像搬迁之Skopeo_docker

看到以上内容,说明harbor安装成功

执行docker-compose  -vDocker Compose version v2.24.5

可以看到有命令信息输出,说明安装正常

重启docker-compose

docker-compose restart

重启docker

systemctl daemon-reload

systemctl restart docker.service

28、29登录harbor

http://192.168.80.28/  账号admin   密码123456  ----主harbor
新建仓库lyc-images-project

http://192.168.80.29/  账号admin   密码123456  ----备harbor
新建仓库lyc-images-bak

第十八节   镜像搬迁之Skopeo_mysql_02

第十八节   镜像搬迁之Skopeo_mysql_03

3、安装Podman

yum install podman
-----3台虚拟机都安装

4、安装Skopeo

下载
https://github.com/lework/skopeo-binary/releases

上传文件到虚拟机,改名后安装
mv  skopeo-linux-amd64  skopeo
mv  skopeo  /usr/bin/
chmod +x  /usr/bin/skopeo
测试是否安装
skopeo --version
skopeo version 1.15.2
----------28、29、30都安装

5、实验测试

直接拉镜像到28机器harbor

--192.168.80.30机器
修改绑定镜像仓库IP
vim /etc/docker/daemon.json
---------------------------------
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io",
    "https://huecker.io"
  ],
  "insecure-registries":["http://192.168.80.28"],   //修改IP
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
---------------------------------
重启docker
systemctl daemon-reload
systemctl restart docker.service


登录harbor
docker login http://192.168.80.28
Username: admin
Password: 123456
拉取镜像
docker pull docker.io/library/elasticsearch:7.17.0
打tag标签
docker tag docker.io/library/elasticsearch:7.17.0   192.168.80.28/lyc-images-project/elasticsearch:7.17.0
push推送
docker push 192.168.80.28/lyc-images-project/elasticsearch:7.17.0

拉取镜像
docker pull mysql:5.7
打tag标签
docker tag mysql:5.7   192.168.80.28/lyc-images-project/mysql:5.7
push推送
docker push 192.168.80.28/lyc-images-project/mysql:5.7

第十八节   镜像搬迁之Skopeo_github_04

第十八节   镜像搬迁之Skopeo_docker_05

刷新28机器harbor镜像仓库,已成功push

第十八节   镜像搬迁之Skopeo_github_06

退出28机器登录

docker logout http://192.168.80.28

直接拉镜像到29机器harbor

--192.168.80.30机器
修改绑定镜像仓库IP
vim /etc/docker/daemon.json
---------------------------------
{
  "exec-opts": ["native.cgroupdriver=systemd"],
  "registry-mirrors": [
    "https://docker.1panel.live",
    "https://docker.m.daocloud.io",
    "https://huecker.io"
  ],
  "insecure-registries":["http://192.168.80.29"],   //修改IP
  "max-concurrent-downloads": 10,
  "log-driver": "json-file",
  "log-level": "warn",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
    },
  "data-root": "/var/lib/docker"
}
---------------------------------
重启docker
systemctl daemon-reload
systemctl restart docker.service


登录harbor
docker login http://192.168.80.29
Username: admin
Password: 123456
拉取镜像
docker pull busybox
打tag标签
docker tag busybox:latest   192.168.80.29/lyc-images-bak/busybox:test
push推送
docker push  192.168.80.29/lyc-images-bak/busybox:test

拉取镜像
docker pull httpd
打tag标签
docker tag httpd:latest   192.168.80.29/lyc-images-bak/httpd:test
push推送
docker push  192.168.80.29/lyc-images-bak/httpd:test

第十八节   镜像搬迁之Skopeo_github_07

Skopeo拉镜像到28机器harbor

登录
skopeo login --tls-verify=false http://192.168.80.28

从30机器拉取镜像到28机器harbor
skopeo copy   --insecure-policy   \
--src-tls-verify=false   \
--dest-tls-verify=false   \
docker://quay.io/skopeo/stable:latest  \
docker://192.168.80.28/lyc-images-project/skopeo:latest

第十八节   镜像搬迁之Skopeo_docker_08

Skopeo拉镜像到29机器harbor

从docker.io拉取镜像到28机器harbor仓库
skopeo copy   --insecure-policy   --src-tls-verify=false   \
--dest-tls-verify=false   \
docker://docker.io/nginx:latest   \
docker://192.168.80.29/lyc-images-/nginx:latest

第十八节   镜像搬迁之Skopeo_mysql_09

仓库之间拉取镜像

在30机器上登录29机器的harbor仓库
拉取28机器的harbor镜像,实现镜像仓库之间同步
skopeo copy   --insecure-policy   \
--src-tls-verify=false   --dest-tls-verify=false   \
docker://192.168.80.28/lyc-images-project/mysql:5.7  \
docker://192.168.80.29/lyc-images-bak/mysql:test01
测试发现是可行的

第十八节   镜像搬迁之Skopeo_mysql_10

第十八节   镜像搬迁之Skopeo_mysql_11

仓库镜像拷贝到本地目录

mkdir skopeo-test01

skopeo copy docker://docker.io/library/nginx:latest   \
dir:skopeo-test
------------------
查看目录tree
tree skopeo-test01

第十八节   镜像搬迁之Skopeo_github_12

第十八节   镜像搬迁之Skopeo_github_13

将镜像保存OCI格式

install  -d   images_OCI

skopeo copy docker://docker.io/library/nginx:latest oci:images_OCI
tree   images_OCI

第十八节   镜像搬迁之Skopeo_mysql_14

将本地镜像存储到harbor

替代docker push功能,将镜像从Docker本地存储push到harbor中

skopeo copy --insecure-policy --dest-tls-verify=false \
docker-daemon:rcoelhorj/go-helloworld:latest \
docker://192.168.80.28/lyc-images-project/go-helloworld:latest

skopeo copy --insecure-policy --dest-tls-verify=false \
docker-daemon:gcr.io/kubebuilder/kube-rbac-proxy:v0.13.0 \
docker://192.168.80.28/lyc-images-project/kube-rbac-proxy:v0.13.0

本地没有这2个镜像,不做测试了

Skopeo镜像同步

远程镜像同步到本地
Skopeo sync可以在容器仓库和本地目录之间同步镜像,
其功能类似于阿里云的image-syncer工具,实际上其比
image-syncer更强大灵活性更强一些。

skopeo sync --src docker --dest dir docker.io/library/httpd:latest  /root/skopeo-sync/httpd:latest

第十八节   镜像搬迁之Skopeo_mysql_15


查看公有仓库中busybox的所有版本

skopeo list-tags docker://docker.io/library/busybox

第十八节   镜像搬迁之Skopeo_github_16

将同一类镜像拉到本地

skopeo sync --src docker --dest dir docker.io/library/httpd /root/skopeo-sync/httpd

第十八节   镜像搬迁之Skopeo_github_17

太多了,不再演示啦


将本地镜像同步到仓库中去

skopeo sync --insecure-policy --dest-tls-verify=false --src dir --dest docker /root/skopeo-sync/httpd:latest  192.168.80.29/lyc-images-project/

第十八节   镜像搬迁之Skopeo_docker_18

第十八节   镜像搬迁之Skopeo_mysql_19

两个仓库同步

skopeo sync --insecure-policy  --src-tls-verify=false \
--dest-tls-verify=false --src docker --dest \
docker docker.io/library/busybox \
192.168.0.52/lyc-images-bak/

第十八节   镜像搬迁之Skopeo_docker_20

太多了,不再演示啦


以配置文件的形式同步

vim skopeo-sync.yml
------------------------
docker.io:
   tls-verify: false
   images:
      httpd:
         - "latest"

quay.io:
   tls-verify: false
   images:
      coreos/etcd:
         - latest
------------------------
执行sync同步
skopeo sync --insecure-policy \
--src-tls-verify=false --dest-tls-verify=false \
--src yaml --dest docker skopeo-sync.yml 192.168.80.29/lyc-images-bak/

第十八节   镜像搬迁之Skopeo_github_21

刷新29的harbor仓库镜像,已实现同步

第十八节   镜像搬迁之Skopeo_docker_22


Skopeo删除镜像

使用skopeo delete命令我们可以删除镜像Tag,注意此处仅仅只是通过registry AP1来删除镜像的tag
(即删除了tag 对 manifests文件的引用)并非真正将镜像删除掉,如果想要删除镜像的 layer 还是需要通过 registry Gc 的方式。

# 删除镜像
skopeo  delete  --tls-verify=false \
docker://192.168.80.29/lyc-images-bak/mysql:test01

第十八节   镜像搬迁之Skopeo_docker_23

第十八节   镜像搬迁之Skopeo_github_24

三、最佳实践

一下给出几个Skopeo工具的最佳实践:假如给你一个镜像列表,如

https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/images-list.txt

如何将它快速地从一个 Registry同步到另一个Registry 中呢?

可以使用脚本执行

vim sync.sh
----------------------
#!/bin/bash
GREEN_COL="\\033[32;1m"
RED_COL="\\033[1;31m"
NORMAL_COL="\\033[0;39m"
 
SOURCE_REGISTRY=$1
TARGET_REGISTRY=$2
 
: ${IMAGES_LIST_FILE:="images-list.txt"}
: ${TARGET_REGISTRY:="hub.k8s.li"}
: ${SOURCE_REGISTRY:="docker.io"}
 
BLOBS_PATH="docker/registry/v2/blobs/sha256"
REPO_PATH="docker/registry/v2/repositories"
 
set -eo pipefail
 
CURRENT_NUM=0
ALL_IMAGES="$(sed -n '/#/d;s/:/:/p' ${IMAGES_LIST_FILE} | sort -u)"
TOTAL_NUMS=$(echo "${ALL_IMAGES}" | wc -l)
 
skopeo_copy() {
 if skopeo copy --insecure-policy --src-tls-verify=false --dest-tls-verify=false \
 --override-arch amd64 --override-os linux -q docker://$1 docker://$2; then
 echo -e "$GREEN_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 successful $NORMAL_COL"
 else
 echo -e "$RED_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 failed $NORMAL_COL"
 exit 2
 fi
}
 
for image in ${ALL_IMAGES}; do
 let CURRENT_NUM=${CURRENT_NUM}+1
 skopeo_copy ${SOURCE_REGISTRY}/${image} ${TARGET_REGISTRY}/${image}
done

---------------------------------------------------------------
----------转换-------
yum install dos2unix
dos2unix  sync.sh

chmod +x  sync.sh
运行脚本
bash sync.sh docker.io  192.168.80.29/lyc-images-bak

第十八节   镜像搬迁之Skopeo_github_25

太多了,直接停止吧!

我们可以查看下29的harbor仓库中同步过来的镜像

第十八节   镜像搬迁之Skopeo_mysql_26

四、总结

由于本次测试只有3台虚拟机,操作机器每次测试只能有一种登入方式,操作完毕后需要登出后,修改daemon.json文件夹下绑定的镜像仓库IP地址,程序比较繁琐。工作中如果机器资源充足,建议弄5台机器进行使用,2台harbor仓库服务器,1台docker登录操作、1台skopeo登录操作,另外1台可以随意调配。

修改绑定镜像仓库IP
vim /etc/docker/daemon.json
---------------------------------
 "insecure-registries":["http://192.168.80.29"],
---------------------------------
重启docker
systemctl daemon-reload
systemctl restart docker.service


登录harbor
docker login http://192.168.80.29
Username: admin
Password: 123456

--------------------------------------

harbor登入登出
docker login http://192.168.80.28
docker logout http://192.168.80.28
--------------------------------------
docker login http://192.168.80.29
docker logout http://192.168.80.29

////////////////////////////////////////////////////
skopeo登入登出
skopeo login   --tls-verify=false   http://192.168.80.28
skopeo logout http://192.168.80.28
--------------------------------------
skopeo login    --tls-verify=false   http://192.168.80.29
skopeo logout http://192.168.80.29