利用Katacoda免费同步Docker镜像到Docker Hub

为什么要同步

安装kubernetes的时候,我们需要用到 gcr.io/google_containers 下面的一些镜像,在国内是不能直接下载的。如果用 Self Host 方式安装,master 上的组件除开kubelet之外都用容器运行,甚至 CNI 插件也是容器运行,比如 flannel,在 quay.io/coreos 下面,在国内下载非常慢。但是我们可以把这些镜像同步到我们的docker hub仓库里,再配个docker hub加速器,这样下载镜像就很快了。

原理

Katacoda 是一个在线学习平台,在web上提供学习需要的服务器终端,里面包含学习所需的环境,我们可以利用docker的课程的终端来同步,因为里面有docker环境,可以执行 docker logindocker pulldocker tagdocker push 等命令来实现同步镜像。

但是手工去执行命令很麻烦,如果要同步的镜像和tag比较多,手工操作那就是浪费生命,我们可以利用程序代替手工操作,不过 Katacoda 为了安全起见,不允许执行外来的二进制程序,但是可以shell脚本,我写好了脚本,大家只需要粘贴进去根据自己需要稍稍修改下,然后运行就可以了。

Let’s Do It

点击 这里 进入docker课程

点击 START SCENARIO 或 终端右上角全屏按钮将终端放大

安装脚本依赖的 jq 命令

apt install jq

登录docker hub

docker login

创建脚本并赋予执行权限

touch sync
chmod +x sync

编辑脚本,可以使用自带的vim编辑器

vim sync

将脚本粘贴进去

#! /bin/bash

docker_repo="k8smirror" # your docker hub username or organization name
registry="gcr.io" # the registry of original image, e.g. gcr.io, quay.io
repo="google_containers" # the repository name of original image


sync_one(){
  docker pull ${registry}/${repo}/${1}:${2}
  docker tag ${registry}/${repo}/${1}:${2} docker.io/${docker_repo}/${1}:${2}
  docker push docker.io/${docker_repo}/${1}:${2}
  docker rmi -f ${registry}/${repo}/${1}:${2} docker.io/${docker_repo}/${1}:${2}
}

sync_all_tags() {
  for image in $*; do
    tags_str=`curl https://${registry}/v2/${repo}/$image/tags/list | jq '.tags' -c | sed 's/\[/\(/g' | sed 's/\]/\)/g' | sed 's/,/ /g'`
    echo "$image $tags_str"
    src="
sync_one(){
  docker pull ${registry}/${repo}/\${1}:\${2}
  docker tag ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2}
  docker push docker.io/${docker_repo}/\${1}:\${2}
  docker rmi -f ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2}
}
tags=${tags_str}
echo \"$image ${tags_str}\"
for tag in \${tags[@]}
do
  sync_one $image \${tag}
done;"
    bash -c "$src"
  done 
}

sync_with_tags(){
  image=$1
  skip=1
  for tag in $*; do
    if [ $skip -eq 1 ]; then
	  skip=0
    else
      sync_one $image $tag
	fi
  done 
}

sync_after_tag(){
  image=$1
  start_tag=$2
  tags_str=`curl https://${registry}/v2/${repo}/$image/tags/list | jq '.tags' -c | sed 's/\[/\(/g' | sed 's/\]/\)/g' | sed 's/,/ /g'`
  echo "$image $tags_str"
  src="
sync_one(){
  docker pull ${registry}/${repo}/\${1}:\${2}
  docker tag ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2}
  docker push docker.io/${docker_repo}/\${1}:\${2}
  docker rmi -f ${registry}/${repo}/\${1}:\${2} docker.io/${docker_repo}/\${1}:\${2}
}
tags=${tags_str}
start=0
for tag in \${tags[@]}; do
  if [ \$start -eq 1 ]; then
    sync_one $image \$tag
  elif [ \$tag == '$start_tag' ]; then
    start=1
  fi
done"
  bash -c "$src"
}

get_tags(){
  image=$1
  curl https://${registry}/v2/${repo}/$image/tags/list | jq '.tags' -c
}

#sync_with_tags etcd 2.0.12 2.0.13 # sync etcd:2.0.12 and etcd:2.0.13
#sync_after_tag etcd 2.0.8 # sync tag after etcd:2.0.8
#sync_all_tags etcd hyperkube # sync all tags of etcd and hyperkube

脚本中有一些参数需要根据你自己情况修改,可以使用它自带的vim在线修改,也可以在你本地改好在粘贴上去

  • docker_repo 改为你的Docker Hub账号组织名
  • registry 改为被同步镜像所在仓库的域名
  • repo 改为被同步镜像所在仓库的账号或组织名

在脚本最后,可以调用写好的函数来实现镜像同步,举例:

  • 同步一个镜像中指定的一个或多个tag
  sync_with_tags etcd 2.0.12 2.0.13 
  • 从某个tag后面的tag开始一直同步到最后(tag顺序按照字母数字来的,不是上传日期;Katacoda 终端用久了会断连,可能处于安全原因考虑,断开之后可以看tag同步到哪一个了,然后执行类似下面的命令从断连的tag开始同步)
  sync_after_tag etcd 2.0.8
  • 同步一个或多个镜像的所有tag
  sync_all_tags etcd hyperkube

最后执行脚本

./sync

这就开始同步了,Katacoda 服务器在国外,下载 gcr.io 或 quay.io 上那些镜像都很快,上传 Docker Hub 也很快,如果断连了,可以在 Docker Hub 上查最新上传的 tag 是哪个(如:https://hub.docker.com/r/k8smirror/hyperkube/tags/k8smirror改为你的docker用户名或组织名,hyperkube改为镜像名),然后改脚本,用 sync_after_tag 这个函数继续上传。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏企鹅号快讯

十分钟带你理解Kubernetes核心概念

本文将会简单介绍Kubernetes的核心概念。因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍。相反,我们会使用一些...

3555
来自专栏企鹅号快讯

十分钟带你理解Kubernetes核心概念

本文将会简单介绍Kubernetes的核心概念。因为这些定义可以在Kubernetes的文档中找到,所以文章也会避免用大段的枯燥的文字介绍。相反,我们会使用一些...

2757
来自专栏CRPER折腾记

Docker折腾记: (1)构建yapi容器,从构建发布到可用

Docker/Linux/Node基础, 比如Linux和docker的常用命令,shell的编写等等

3282
来自专栏大魏分享(微信公众号:david-share)

同时面向运维和开发的企业级PaaS平台--OpenShift

大卫说:笔者在年初分享过一篇文章《大卫看Docker-第一篇》。文中介绍了Docker一些基本概念。本文同时作为《大卫看Docker-第二篇》而存在。 ...

48712
来自专栏编程坑太多

『中级篇』如何在mac上安装docker(五)

1552
来自专栏编程坑太多

『高级篇』docker之微服务服务docker化(18)

1052
来自专栏编程坑太多

『中级篇』Docker 水平扩展和负载均衡(40)

PS:Docker的scale 可以扩展,也可以所有,他们自动来控制的。web=10 可以改成5 其中的6,7,8,9,10就被删除了。

1083

使用Helm将应用程序部署到IBM Cloud上的Kubernetes

Helm是Kubernetes的包管理器。借助Helm,您可以非常方便地将应用程序,工具和数据库(如MongoDB,PostgreSQL,WordPress和A...

2989
来自专栏云原生架构实践

Docker Data Center系列(一)- 快速搭建云原生架构的实践环境

DDC是Docker Data Center的简称,是Docker公司推出的容器化数据中心管理平台。它的编排核心是swarm,包含2个主要组件UCP和DTR。

1776
来自专栏编码前线

docker底层原理介绍

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源。

2643

扫码关注云+社区

领取腾讯云代金券