能够非常方便的管理仓库中的镜像,在生产环境中做镜像转移
也可以挂了代理之后,拿来去搬运国外的镜像到本地,搭建自己的镜像源
也可以用来做主备的harbor,可以说相当有用
下载 1 2 3 4 5 6 7 wget https://github.com/lework/skopeo-binary/releases/download/v1.17.0/skopeo-linux-amd64 sudo mv skopeo-linux-amd64 /usr/bin/skopeo sudo chmod +x /usr/bin/skopeo skopeo --version
用法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 skopeo copy docker://xxx docker://xxx 从docker仓库复制到docker仓库 如果需要使用仓库之间拷贝,则需要两个仓库都进行登录 并且在复制时,指定--tls-verify=false skopeo copy docker://xxx dir :/xxx 从docker仓库复制到本地目录 skopeo copy dir :/xxx docker://xxx 从本地复制到docker仓库中 skopeo list-tags docker://xxx skopeo delete docker://xxx:tag skopeo inspect docker://xxx skopeo login skopeo logout
其余选项
1 2 3 4 5 6 7 8 --insecure-policy 不进行策略检查 --debug 调试,输出更详细信息 --tls-verify=false 不使用tls证书进行验证,如果使用账号密码进行登录的docker仓库,需要使用 --authfile 指定认证文件 --src-tls-verify --dest-tls-verify 用来接替--tls-verify的参数
搭建两台harbor进行测试 一般适用于两台不同环境中的harbor进行镜像同步,如果是同网段的harbor,可以直接做主从复制
为了部署方便我给他放同网段了
环境
1 2 3 4 5 6 7 8 9 VMware WorkStation 17 Pro CentOS 7.9.2009 4G4C 20G 192.168.8.130 harbor1 192.168.8.131 harbor2 192.168.8.132 test (中间测试主机) harbor使用离线安装,版本v2.10
快速部署harbor 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 mkdir /sslcd /sslopenssl genrsa -out ca.key 2048 openssl req -new -x509 -days 365 -key ca.key -out ca.pem openssl genrsa -out harbor.key 2048 openssl req -new -key harbor.key -out harbor.csr openssl x509 -req -in harbor.csr -CA ca.pem -CAkey ca.key -CAcreateserial -out harbor.pem -days 365 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backupwget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo yum -y install wget net-tools yum-utils nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf automake zlib-devel python-devel epel-release openssh-server socat ipvsadm conntrack yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo yum clean all && yum makecache yum -y install iptables-services systemctl disable firewalld --now systemctl disable iptables --now iptables -F sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config setenforce 0 sed -i 's/^server/#server/g' /etc/chrony.conf sed -i '1s/^/server cn.pool.ntp.org iburst\n/' /etc/chrony.conf systemctl restart chronyd.service cat > /etc/hosts <<EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.8.130 harbor1 192.168.8.131 harbor2 192.168.8.132 test EOF yum -y install docker-ce yum -y update cat >/etc/docker/daemon.json << 'EOF' { "registry-mirrors" : [ "https://hub-mirror.c.163.com" , "https://docker.m.daocloud.io" , "https://ghcr.io" , "https://mirror.baidubce.com" , "https://docker.nju.edu.cn" ], "insecure-registries" : ["192.168.8.130" ,"192.168.8.131" ] } EOF systemctl daemon-reload systemctl restart docker.service systemctl enable docker.service --now modprobe br_netfilter echo " net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1" > /etc/sysctl.d/docker.confsysctl -p /etc/sysctl.d/docker.conf cd ~wget https://github.com/docker/compose/releases/download/v2.23.3/docker-compose-linux-x86_64 mkdir -p /usr/bin/docker-composemv docker-compose-linux-x86_64 /usr/bin/docker-compose/chmod +x /usr/bin/docker-composecd ~tar zxvf harbor-offline-installer-v2.10.0.tgz cd harborcp harbor.yml.tmpl harbor.ymlsed -i 's/^hostname.*/hostname: harbor1/' harbor.yml sed -i 's#/your/certificate/path#/ssl/harbor.pem#' harbor.yml sed -i 's#/your/private/key/path#/ssl/harbor.key#g' harbor.yml ./install.sh
使用skopeo查看与搬运镜像 分别登录docker与habor
建议使用ip,因为如果使用域名,push的时候不一定能解析出来
1 2 3 4 5 6 7 8 9 docker login -u admin -p Harbor12345 192.168.8.130 Login Succeeded docker login -u admin -p Harbor12345 192.168.8.131 Login Succeeded skopeo login --tls-verify=false -u admin -p Harbor12345 192.168.8.130 Login Succeeded! skopeo login --tls-verify=false -u admin -p Harbor12345 192.168.8.131 Login Succeeded!
我先上传一个镜像到harbor1,搞个大点的镜像,不然一秒传完了多没意思
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 docker push 192.168.8.130/wangsheng/jenkins-jnlp:v1 docker push 192.168.8.130/wangsheng/jenkins-jnlp:v2 docker push 192.168.8.130/wangsheng/jenkins-jnlp:v3 skopeo list-tags --tls-verify=false docker://192.168.8.130/wangsheng/jenkins-jnlp { "Repository" : "192.168.8.130/wangsheng/jenkins-jnlp" , "Tags" : [ "v1" , "v2" , "v3" ] } skopeo inspect --tls-verify=false docker://192.168.8.130/wangsheng/jenkins-jnlp:v1
配置skopeo信任所有镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 mkdir /etc/containerscat > /etc/containers/policy.json<<EOF { "default": [ { "type": "insecureAcceptAnything" } ], "transports": { "docker-daemon": { "": [{"type":"insecureAcceptAnything"}] } } } EOF
复制镜像——到本地
要复制到本地,需要一个空目录
1 2 3 4 5 6 7 8 9 mkdir /root/imageskopeo copy --src-tls-verify=false --dest-tls-verify=false \ docker://192.168.8.130/wangsheng/jenkins-jnlp:v1 \ dir ://root/image会出来一个显示镜像分层结构的目录 这样就完成了,现在把它从本地复制到harbor2里 skopeo copy --src-tls-verify=false --dest-tls-verify=false \ dir ://root/image docker://192.168.8.131/library/jenkins-jnlp:v1
复制镜像——到远程仓库
1 2 3 skopeo copy --src-tls-verify=false --dest-tls-verify=false \ docker://192.168.8.130/wangsheng/jenkins-jnlp:v2 \ docker://192.168.8.131/library/jenkins-jnlp:v2
查看harbor2的镜像情况
1 2 3 4 5 6 7 8 9 skopeo inspect --tls-verify=false \ docker://192.168.8.131/library/jenkins-jnlp:v1 \ | grep -i -A 5 tag 可以看到刚刚两个版本都传送过来了