Docker安装私有仓库,用户认证(Registry)
一、关于Registry
官方的Docker hub是一个用于管理公共镜像的好地方,我们可以在上面找到我们想要的镜像,也可以把我们自己的镜像推送上去。但是,有时 候,我们的使用场景需要我们拥有一个私有的镜像仓库用于管理我们自己的镜像。这个可以通过开源软件Registry来达成目的。
Registry在github上有两份代码:老代码库和新代码库。老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发。从2.0版本开始就到在新代码库进行开发,新代码库是采用go语言编写,修改了镜像id的生成算法、registry上镜像的保存结构,大大优化了pull和push镜像的效率。
官方在Docker hub上提供了registry的镜像(详情),我们可以直接使用该registry镜像来构建一个容器,搭建我们自己的私有仓库服务。
二、安装Docker私有仓库
1、下载Docker Registry镜像
# docker pull registry //下载到的版本默认为 docker.io/registry latest
2、将registry镜像运行并生成一个容器
说明:Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,将主机的/opt/application/registry/images目录挂载到该目录,即可实现将镜像保存到主机的/opt/application/registry/images目录了。
# docker run -d --name registry01 -v /opt/application/registry/images:/var/lib/registry -p 5000:5000 --restart=always registry:latest
3、测试上传镜像到Registry
1)首先将主机的registry镜像命名为符合仓库要求registry_url:port/ImageName:tag的格式,可以使用docker tag来标记:
# docker tag xoa_all_production:v1 192.168.0.8:5000/xoa_all_production:v1
2)开始上传
# docker push 192.168.0.8:5000/xoa_all_production:v1
上面的报错是因为registry未采用https服务,而客户端docker使用https请求push所致。
解决方法:docker客户端将https请求更改为http请求, 将以下配置添加到 /etc/docker/daemon.json 中:
{
"registry-mirrors": ["https://k728i8z5.mirror.aliyuncs.com"],
"insecure-registries":["192.168.0.8:5000"]
}
注意: 该配置是配置在docker客户端,让docker客户端以不安全的http请求访问docker registry,ip以及端口填写的是提供服务容器的ip以及端口。
修改配置需要重启Docker服务才能生效,执行命令:systemctl restart docker ,再push即可。
push成功之后,查看本地/opt/application/registry/images目录下已经有了刚推送上来的registry镜像,也可以在浏览器中输入http://ip_add:5000/v2/_catalog
至此,我们的Registry私有仓库搭建完成,如果在今后中要使用,可以使用命令:docker pull 拉取镜像
三、设置私有仓库的用户认证(可选)
私有仓库搭建以后其他所有客户端均可以push、pull, docker官方提供认证方法对docker仓库进行权限保护
1、删除原启动的docker registry容器
# docker stop registry01
# docker rm registry01
2、创建存储用户密码的文件
# mkdir /opt/application/registry/auth //可自定义
# docker run --entrypoint htpasswd registry:2.6 -Bbn lisi 123456 > /opt/application/registry/auth/htpasswd
注意:发现使用registry最新的(2.7)的镜像此条命令会存在问题,可能最新的镜像有问题,此处使用的是2.6版本的
3、使用原来的镜像数据运行Registry:
docker run -d -p 5000:5000 --restart=always --name registry01 \
-v /opt/application/registry/images:/var/lib/registry \
-v /opt/application/registry/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry
登录:docker login -u lisi -p 123456 192.168.0.8:5000
退出:docker logout 192.168.0.8:5000
四、查看Registry中的镜像及版本