前言
为了配合 k8s,需要搭建一个私有仓库,防止镜像泄漏出去。
机器准备
最小化分布式集群安装,一台master,一台node。后续可以调整为多master,解决单点问题,node的话也可以增加以加入集群。
hostname | IP | 配置 | 操作系统 |
---|---|---|---|
matser | 192.168.8.171 | 4核8G | CentOS Linux release 7.2.1511 (Core),Linux version 3.10.0-327.el7.x86_64,gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) |
node1 | 192.168.8.174 | 4核8G | CentOS Linux release 7.2.1511 (Core) ,Linux version 3.10.0-327.el7.x86_64,gcc version 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC) |
## 安装
registry
这个是 docker 官方提供的仓库镜像,现在已经进入了2.x
的时代,对应的仓库在 github 上并不是docker-registry
,docker-registry
已经归档了,并且不进行维护了,所以目前hub.docker
上的 registry
对应在 github 上的仓库名字叫做 docker/distribution
安装 registry
1 | docker run -d -p 5000:5000 -v `pwd`/data:/tmp/registry-dev --restart=always --name registry registry:2 |
1 | CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES |
这个时候私有仓库镜像成功建立了,我们测试一下。
拉取镜像
1 | docker pull busybox:latest |
重新打tag
1 | docker tag busybox:latest 192.168.8.171:5000/tonybai/busybox:latest |
推送到指定仓库 , 结果发现推送 失败
1 | [root@master registry]# docker push 192.168.8.171:5000/tonybai/busybox |
那是因为我们的docker,并没有设置不安全私有仓库白名单
所以这个时候我们需要修改/etc/docker/daemon.json
1 | { |
然后我们重启docker即可,容器会随之启动
1 | systemctl restart docker |
启动成功后,然后再推送一次.
1 | [root@master registry]# docker rmi 10.10.105.71:5000/tonybai/busybox |
成功了,不过他告诉我我没有指定tags所以默认的他加上了latest
标签。
secure registry
- 自签名证书
- 证书服务提供商
这里,我们主要是用自签名证书,所以需要在每个拉取我们私有仓库的镜像的时候,都需要拥有我们证书才可以拉取
1 | [root@master ~]# mkdir ~/openssl/certs/ && cd ~/openssl/certs/ && openssl req -newkey rsa:2048 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt |
由于我们的 Common Name
设置了 mcdockerhub.com
,所以我们需要修改一下hosts(除非你有公网解析到这个IP)
1 | vim /etc/hosts/ |
移除之前我们创建的 registy
,然后我们重新创建一个
1 | docker stop registy && docker rm registy |
1 | docker run -d -p 5000:5000 --restart=always --name registry -v /root/openssl/data:/tmp/registry-dev -v /root/openssl/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key docker.io/registry:2 |
接着我们重新打一个对应registy的tag
1 | docker tag docker.io/busybox mcdockerhub.com:5000/tonybai/busybox |
推送镜像到域名仓库
1 | [root@master ~]# docker push mcdockerhub.com:5000/tonybai/busybox |
我们发现报错
了。这是因为 没有把证书
对应起来。
把证书放在docker请求的证书目录
1 | mkdir -p /etc/docker/certs.d/mcdockerhub.com:5000 && cp ~/openssl/certs/domain.crt /etc/docker/certs.d/mcdockerhub.com:5000/ca.crt |
再推送一次
1 | [root@master ~]# docker push mcdockerhub.com:5000/tonybai/busybox |
接着就是成功了。如果其他机器需要推送或者拉取的话,记得要把证书放在对应的机器的对应目录下,否则被视为没有被授权。