一、仓库简介
容器镜像仓库是一种存储库(或存储库集合),用于存储 Kubernetes、DevOps 和基于容器的应用开发的容器镜像。 仓库分为两种类型:公共和私有。在Docker运行过程中默认使用的就是Docker官方的公共仓库Docker Hub,上传时需要登陆。私有仓库分为官方私有仓库(需要付费)和自己搭建的私人仓库。
二、向Docker Hub中push镜像
1、登陆自己在Docker Hub上注册的账号。
docker login
2、Docker Hub 为了区分不同用户的镜像,要求镜像的命名格式为[username]/xxx:‘tag’。所以需要将想要上传的镜像名字更改为符合要求的形式。
docker tag busybox:latest yangchenqi/busybox:latest
3、将镜像上传到我的官方公共仓库中
docker push yangchenqi/busybox:latest
4、从Docker Hub上拉取自己上传的镜像
docker pull yangchenqi/busybox:latest
5、需要删除仓库中的镜像时,可以登陆Docker Hub官方网站,在Web界面上操作。
三、Registry工作原理(Docker官方已开源)
Registry由index、registry、registry client三部分组成。
- index:负责并维护有关用户账户、镜像的校验以及公共命名空间的信息。
- registry:是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
- registry client:Docker 充当registry客户端来维护推送和拉取,以及客户端的授权。

Push Image的流程和Pull Image的流程相似。

四、搭建最基础的私有仓库(无Web界面)
官方参考文档
1、下载registry镜像,运行registry容器
docker pull registry
docker history registry:latest #查看端口、卷等信息
docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry
-p 指定端口映射,-v指定挂载卷(不存在会自动创建)
2、上传镜像并查看信息(push时系统并不知道默认仓库在哪,所以需要在修改名字的时候直接将该信息告诉镜像系统)
docker tag webserver:latest localhost:5000/webserver:latest #改名
docker push localhost:5000/webserver #上传
curl localhost:5000/v2/_catalog #查看仓库中有多少镜像

用tree命令可以看到挂载的文件中镜像如何分类的详细信息
3、其他在内网中的虚拟机是无法pull我们上传到本地的镜像的。如果我们在内网中对于安全没有很高的要求,我们可以在其他虚拟机上配置.json文件就可以在其他内网中的虚拟机上pull我们上传到本地的镜像了。
#在一台新虚拟机上安装docker
cd /etc/docker/
vim daemon.json
{
"insecure-registries" : ["172.25.14.10:5000"]
}
#地址指向我们上传镜像的那台虚拟机地址
systemctl reload docker.service
docker pull 172.25.14.10:5000/webserver:latest

4、仓库加密认证
- 创建自签名证书
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/westos.org.key -x509 -days 365 -out certs/westos.org.crt


将名字改称 reg.westos.org,并做好解析(统一方便之后步骤使用)。
- 匹配证书
mkdir /etc/docker/certs.d/reg.westos.org/ -p
cp certs/westos.org.crt /etc/docker/certs.d/reg.westos.org/ca.crt
- 启用自签名证书的仓库
docker run -d --name registry \
-p 443:443 \
-v /opt/registry:/var/lib/registry \
-v "$(pwd)"/certs:/certs \ #绝对路径,将本地的certs挂载到容器中的certs
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt \ #加载证书
-e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key \ #加载密钥
registry
- 上传镜像
docker tag game2048:latest reg.westos.org/game2048:latest #改名
docker push reg.westos.org/game2048:latest #上传
- 远程下载
[root@server6 ~]# mkdir /etc/docker/certs.d/reg.westos.org/ -p
[root@m0 reg.westos.org]# scp ca.crt server6:/etc/docker/certs.d/reg.westos.org/
- 远程上传
和上面方法一样,下载配置好之后直接上传就可以

- 最基本的认证加密功能
- 设置加密及下上传
mkdir auth
htpasswd -B -c auth/htpasswd ycq
docker rm -f registry
docker run -d --name registry -p 443:443 -v /opt/registry:/var/lib/registry -v "$(pwd)"/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/westos.org.crt -e REGISTRY_HTTP_TLS_KEY=/certs/westos.org.key -v "$(pwd)"/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd registry
docker login reg.westos.org
docker tag rhel7:latest reg.westos.org/rhel7
docker push reg.westos.org/rhel7
- 下载
docker login reg.westos.org
docker pull reg.westos.org/rhel7
在生产环境中无法达到使用要求,内容功能不够丰富,也缺少图形化界面,需要继续完善。