0x01 前言

近期在学习docker,在安装k8s的时候因为众所周知的原因卡在kubeadm初始化的一步。在深入了解相关的知识后,我决定在本地配置一个私有仓库。

因为k8s的镜像存放在Google的服务器中,所以这篇文章需要用到代理,这部分请自行解决。

0x02 准备

首先需要准备一个docker环境,在启动docker服务之前需要做一些修改,以便让docker拉取镜像的时候可以通过代理进行网络通讯:

  • HTTP_PROXY:配置http代理的服务器地址与端口
  • NO_PROXY:配置那些IP地址和域名的流量不走代理

然后需要重新载入daemon:

在启动前先检查配置是否生效:

即可启动docker:

0x03 启动本地仓库

在启动仓库之前需要确认磁盘空间是否充足,然后建立一个文件夹,用于存放docker镜像:

然后搜索名为registry的镜像,看看哪些是可用的:

在拉取镜像的时候建议选择带有OFFICIAL标签的镜像。确认镜像后,通过以下命令搭建一个仓库:

当使用docker run运行一个容器时,如果本地没有指定的镜像,则会从远端进行拉取,以上命令的最后指定了需要用到的镜像与仓库:docker.io/registry

  • -d:使容器在后台运行;
  • -p:将端口暴露在本地;
  • –name:给这个容器命名;
  • –privileged:赋予该容器拓展的权限;
  • –restart:当容器退出时,将自动重启该容器;
  • -v:映射volume用于数据存储。

如果一切正常,通过以下命令即可查看相关容器的运行情况:

最后通过curl检查该仓库运行是否正常:

因为还没有在该仓库里注册镜像,所以repositories的列表为空,但如果出现以上内容,则为正常。

0x04 客户端

在继续之前需要为docker指定仓库地址:

在新版的docker,要求仓库使用https,如果想使用http,则需要添加–insecure-registry这个选项,然后还需要将仓库在docker里注册,这需要用到–add-registry。

修改完成后重启docker即可:

0x05 拉取与注册

为了安装k8s,需要预先将相关镜像拉取到本地,然后重新打标签,最后push到刚才建好的仓库中。

为了减少重复性工作,我选择通过shell实现上述功能:

将以上代码复制到一个文本文件中:

然后运行命令,视乎代理服务器的速度,需要的时间会有所不同:

因为这是通过本地docker push到本地仓库的,所以在本地的docker也存有相关镜像:

0x06 测试

在测试之前先把本地docker的镜像删除,比如以下镜像:

确认ID后,通过以下命令进行删除:

然后尝试通本地仓库中拉取:

如果一切正常, 那么会成功从本地仓库中拉取镜像。

如果需要查看仓库中的镜像,可以通过浏览器或者curl访问以下地址:

0x07 结语

其实这一系列的配置都不繁琐,但是代理这个要求却难倒很多人。

如果需要删除仓库中的镜像,则需要手动在数据存储的目录中删除文件,例如我需要删除etcd-amd64这个镜像,则删除以下目录即可:

然后再检查仓库中是否还存在该镜像:

可以看到,已经没有gcr.io/google_containers/etcd-amd64这个镜像了。