由于国内功夫网的网络限制,直接从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应用进行测试。