安装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 login --tls-verify=false http://192.168.100.128
拉取镜像到128机器harbor
skopeo copy --insecure-policy \
--src-tls-verify=false \
--dest-tls-verify=false \
docker://quay.io/skopeo/stable:latest \
docker://192.168.100.128/images-project/skopeo:latest
从docker.io拉取镜像到128机器harbor仓库
skopeo copy --insecure-policy --src-tls-verify=false \
--dest-tls-verify=false \
docker://docker.io/nginx:latest \
docker://192.168.100.128/images-project/nginx:latest
# 私有仓库之间同步
拉取128机器的harbor镜像,实现镜像仓库之间同步
skopeo copy --insecure-policy \
--src-tls-verify=false --dest-tls-verify=false \
docker://192.168.100.128/images-project/mysql:5.7 \
docker://192.168.100.129/images-bak/mysql:test01
# 仓库镜像拷贝到本地目录
mkdir skopeo-test01
skopeo copy docker://docker.io/library/nginx:latest \
dir:skopeo-test01
------------------
查看目录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
镜像同步
Skopeo sync可以在容器仓库和本地目录之间同步镜像
# 远程镜像同步到本地
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.10.152/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.100.129/images-bak/
删除镜像
使用skopeo delete命令我们可以删除镜像Tag,注意此处仅仅只是通过registry AP1来删除镜像的tag(即删除了tag 对 manifests文件的引用)并非真正将镜像删除掉,如果想要删除镜像的 layer 还是需要通过 registry Gc 的方式。
# 删除镜像
skopeo delete --tls-verify=false \
docker://192.168.100.129/images-bak/mysql:test01
实践案例
给你一个镜像列表,如https://github.com/kubesphere/ks-installer/releases/download/v3.4.1/images-list.txt,如何将它快速地从一个 Registry同步到另一个Registry 中呢?
cat > images-sync.sh << 'EOF'
#!/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
EOF
---------------------------------------------------------------
# 转换文件格式
yum install dos2unix
dos2unix images-sync.sh
chmod +x images-sync.sh
# 运行脚本示例
bash images-sync.sh docker.io 192.168.100.129/images-bak