由于国内功夫网的网络限制,直接从docker的原生仓库拉取镜像,需要非常长的时间,甚至还会timeout超时。

因此,往往配置docker的镜像源的时候,需要改为国内的加速源(例如阿里云的源),但是这样的操作方式,需要每台docker服务器单独进行配置,非常不方便管理,非常费时费力。

而且在内网环境,出于安全考虑,不会所有服务器都放通访问外网/外网访问它的权限,因此根本无法访问外网镜像仓库。

因此,一般采用找一台机器搭建私有仓库,这台机器从外网的加速源拉取docker镜像,然后再把docker服务器配置的源指向私有仓库的服务器,这样就可以直接从内网私有仓库拉取镜像了。

本篇介绍如何搭建私有仓库,与docker服务器如何修改配置指向本地仓库。


实验环境:

操作系统:CentOS7

机器IP:选用kubernetes的Master主机(10.1.30.24)


(第一部分:搭建docker可用的私有镜像仓库)

1、仓库主机先配置镜像加速

访问阿里云的链接,可以创建免费的docker镜像加速器。(需要自行注册账户,然后启用,会有一串token码)



vi /etc/docker/daemon.json



{ "registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"] }



XXXXXXXX填写自己实际的token,然后需要运行如下命令重新加载生效。



systemctl daemon-reload systemctl restart docker



重新拉取,发现速度明显提升很多。

2、修改host表

Master与Node都需要修改(或者直接在DNS服务器增加解析记录)



vi /etc/hosts



10.1.30.34 registry



(以下仅Master操作)

3、仓库主机注册



docker pull registry



#仓库主机注册



docker run -d -v /registry:/var/lib/registry -p 5000:5000 --restart=always --privileged=true --name registry registry:latest



docker pull hello-world



#下载一个轻量镜像测试


4、镜像打标签与上传

镜像仓库的工作原理如下:

仓库服务器从docker官方源/加速源拉取镜像(pull),然后对拉取后存在仓库服务器本地的镜像重新打标签(tag),然后再把打标签后的本地镜像重新上传到仓库(push)



docker tag hello-world registry:5000/hello-world:latest



docker push registry:5000/hello-world:latest



预计会报错如下



Get https:// 10.1.30.34:5000:5000/v1/_ping: http: server gave HTTP response to HTTPS client



因为目前配置仅支持http,不支持https,所以需要修改配置。



vi /etc/docker/daemon.json



{         "registry-mirrors": ["https://njrds9qc.mirror.aliyuncs.com"],         "insecure-registries":["registry:5000"] }



5、镜像打标签与上传



systemctl daemon-reload systemctl restart docker



docker push registry:5000/hello-world:latest



输入如下命令可以查看已经上传的镜像



docker images



或者



curl http://registry:5000/v2/_catalog



(以下仅Node操作)

6、修改Node节点仓库配置



vi /etc/docker/daemon.json






{         "registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com"],         "insecure-registries":["registry:5000"] }



#追加一行执行registry,注意上面一行以逗号结尾,否则会报错。



systemctl daemon-reload systemctl restart docker



#重新加载配置


7、测试拉取镜像

拉取刚才已经上传的镜像测试




docker push registry:5000/hello-world:latest docker images;



发现镜像成功拉取,仓库搭建成功。

(注意:至此,私有镜像仓库只是docker层面可用,即Node节点可以通过docker pull从镜像仓库拉取镜像。但是在kubernetes层面,还是不可用的,Node节点还未指向镜像仓库)



(第二部分:将私有镜像仓库应用到kubernetes)

1、镜像仓库主机(10.1.30.34)下载基础源



yum install *rhsm*



wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm



rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem



拉取红帽基础镜像源



docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest



打标签



docker tag registry.access.redhat.com/rhel7/pod-infrastructure:latest registry:5000/pod-infrastructure:latest



推送到仓库



docker push registry:5000/pod-infrastructure:latest



docker images;



#看看是否已经能看到docker push registry:5000/pod-infrastructure:latest。


2、Node修改镜像仓库指向

每台Node都需要修改



vi /etc/kubernetes/kubelet



KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"



上面一行修改为



KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry:5000/pod-infrastructure:latest"



重启服务



systemctl daemon-reload systemctl restart kubelet kube-proxy



(注意:至此,在kubernetes层面,Master才能向Node发出创建docker实例的指令,并且Node会从私有仓库进行镜像拉出与部署docker实例。)

下一篇,我们尝试使用kubernetes部署一个实际web应用进行测试。