一、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
看到以上内容,说明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
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
刷新28机器harbor镜像仓库,已成功push
退出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拉镜像到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拉镜像到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
仓库之间拉取镜像
在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
测试发现是可行的
仓库镜像拷贝到本地目录
mkdir skopeo-test01
skopeo copy docker://docker.io/library/nginx:latest \
dir:skopeo-test
------------------
查看目录tree
tree skopeo-test01
将镜像保存OCI格式
install -d images_OCI
skopeo copy docker://docker.io/library/nginx:latest oci:images_OCI
tree images_OCI
将本地镜像存储到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
查看公有仓库中busybox的所有版本
skopeo list-tags docker://docker.io/library/busybox
将同一类镜像拉到本地
skopeo sync --src docker --dest dir docker.io/library/httpd /root/skopeo-sync/httpd
太多了,不再演示啦
将本地镜像同步到仓库中去
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 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/
太多了,不再演示啦
以配置文件的形式同步
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/
刷新29的harbor仓库镜像,已实现同步
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工具的最佳实践:假如给你一个镜像列表,如
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
太多了,直接停止吧!
我们可以查看下29的harbor仓库中同步过来的镜像
四、总结
由于本次测试只有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