docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)

######1.registry工作原理###### docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

一次docker pull 背后的发生的事情:
下载一个镜像----->在index服务上做认证,查找镜像所在的registry的地址----->
放回docker客户端----->从registry下载镜像----->去index校验客户端token的合法性
----->返回registry仓库拉取镜像----->镜像存储在docker客户端
【备注】:不同的镜像可以保存在不同的registry服务上,其索引信息都放在index服务上。
  • docker registry有三个角色,分别是index、registry、registry client。
  • index:负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。 Web UI ,元数据存储, 认证服务 ,符号化
  • registry: 是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。
  • Registry Client Docker:充当registry客户端来维护推送和拉取,以及客户端的授权
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片


docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片


######2.搭建私有仓库#########
docker hub虽然方便,但是还是有限制需要internet连接,速度慢 ,所有人都可以访问,不安全。
好消息是docker公司已经将registry开源,我们可以快速构建私有仓库。
###1.下载并导入registry2镜像###
###1.下载镜像文件###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(自己下载的镜像文件,需要在向docker中导一次,registry2是新版本)
###2.从仓库拉取镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(直接从远端docker仓库拉取的镜像,直接导入docker服务中)
###2.查看registry2镜像的构建历史###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(看到端口是5000,数据卷是/var/lib/registry)
###3.创建运行容器###
[root@server1 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

######3.上传镜像到私有仓库###### 本地镜像在命名时,需要加上仓库的ip和端口
###1.修改镜像的格式###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.上传镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(使用镜像加速器后,上传速度非常快)
###3.查看本地私有仓库###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

或者 [root@server1 ~]# yum install -y tree##安装树结构

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(分层存储)
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片


######4.删除数据###### ###1.删除容器###
[root@server1 ~]# docker container prune##取出所有停止的容器

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.删除数据卷###
[root@server1 ~]# docker volume prune##删除所有数据卷

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片


######5.docker仓库加密###### docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

因为私有docker仓库任何人都能访问,不安全,所以要加密认证
###1.生成证书###
###1.创建证书存放目录###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.创建证书###
[root@server1 ~]#openssl req-newkey rsa:4096 -nodes -sha256 -keyout certs/redhat.org.key-x509 -days 365 -out certs/redhat.org.crt Generating a 4096 bit RSA private key ...............................................................++ ................................................................................++ writing new private key to 'certs/redhat.org.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:cn##国家名称 State or Province Name (full name) []:shaanxi##省/市/自治区名称 Locality Name (eg, city) [Default City]:xi'an##城市 Organization Name (eg, company) [Default Company Ltd]:redhat##公司名称 Organizational Unit Name (eg, section) []:Linux##组织单位部分 Common Name (eg, your name or your server's hostname) []:redhat.org##服务器的主机名 Email Address []:root@redhat.org##邮件地址

###3.修改本地解析###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(将证书里填写的服务器主机名添加到本地解析)
###4.查看生成的key和证书###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.重建registry容器###
[root@server1 certs]# cd [root@server1 ~]# docker run -d \##后台运行容器 > --restart=always \##设置容器重启策略 > --name registry \##命名容器 > -v "$(pwd)"/certs:/certs \##手动指定数据卷的挂载 > -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \##编辑registry的参数,监听443端口 > -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/redhat.org.crt \##使用证书为生成的证书 > -e REGISTRY_HTTP_TLS_KEY=/certs/redhat.org.key \##使用私钥为生成的私钥 > -p 443:443 \##端口映射 > registry:2##使用镜像【注意】:因为这里使用了环境变量"$(pwd)",所以必须要切换到创建的certs目录的上一层目录环境

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(因为创建运行容器时没有给容器命名,系统自动生成容器名为“eager_ride”)
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(其他主机访问,被加密)
###3.拷贝证书到docker主机###
1.创建目录 [root@server1 ~]# mkdir -p /etc/docker/certs.d/redhat.org 2.拷贝证书 [root@server1 ~]# cp certs/redhat.org.crt /etc/docker/certs.d/redhat.org/ca.crt

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(如果不拷贝证书,那么在上传镜像时会报错)
###4.上传镜像###
本地镜像在命名时,需要加上服务器主机名。
###1.修改标签###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.上传镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###5.其他主机从私有仓库拉取镜像###
###1.安装docker-ce###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

[root@server2 ~]# yum install -y docker-ce [root@server2 ~]# systemctl start docker

###2.传递证书###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###3.修改本地解析###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###4.拉取镜像###docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片


######6.Docker仓库添加用户认证功能###### ###1.生成用户密码文件###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.运行容器导入用户密码文件###
[root@server1 ~]# docker run --rm --entrypoint htpasswd registry:2 -Bbn admin redhat > auth/htpasswd ##–entrypoint:覆盖镜像默认的ENTRYPOINT,ENTRYPOINT是不可以被覆盖的,如果实在要覆盖需要使用此参数 ##-B:强制密码加密 ##-b:使用命令行中的密码而不是提示输入密码 ##-n:不更新加密文件,只将加密后的用户名密码显示在屏幕上

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

【注意】:在导入多个用户密码时,除了第一个用户用“>”,之后添加的用户都用“>>”导入文件,
否则就会覆盖原来文件内容。
在实际生产环境中,admin和普通用户的权限是不一样的,还要做权限设定。
###3.删除之前创建的仓库###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(防止冲突)
###4.重建registry容器仓库###
[root@server1 ~]# docker run -d \ > --restart=always \ > --name registry \ > -v /root/certs:/certs \ > -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ > -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/redhat.org.crt \ > -e REGISTRY_HTTP_TLS_KEY=/certs/redhat.org.key \ > -p 443:443 \ > -v /opt/registry/:/var/lib/registry \ > -v /root/auth:/auth \####挂载认证目录 > -e "REGISTRY_AUTH=htpasswd" \##认证方式 > -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \##验证域名 > -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \##容器中验证文件的路径 > registry:2##这次使用都是绝对路径

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###5.上传镜像###
【docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)】###1.修改镜像标签###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.上传镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(上传失败:没有基本身份验证凭据)
###3.查看用户登陆认证文件###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###6.docker主机认证###
###1.用户登陆###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(认证登陆成功)
###2.查看用户登陆认证文件###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###3.上传镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(上传成功)
###4.登出仓库###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###7.其他主机拉取镜像###
###1.直接拉取###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(拉取失败:没有基本身份验证凭据)
###2.认证登陆仓库###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###3.查看用户登陆认证文件###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###4.重新拉取###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###5.退出登陆###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片


######7.搭建docker-registry-web端####### ###1.在github中查找项目###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(搜索registry-web,点击“mkuchin/docker-registry-web”)
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(下拉查看文档)
###2.下载并导入docker-registry-web镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###3.连接私有仓库###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(查看认证密码auth=,之后运行web端时要用到)
###4.重新创建仓库###
###1.删除正在运行的容器###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.重新运行仓库###
[root@server1 ~]# docker run -d \ > --restart=always \ > --name registry \ > -v /root/certs:/certs \ > -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \ > -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/redhat.org.crt \ > -e REGISTRY_HTTP_TLS_KEY=/certs/redhat.org.key \ > -p 443:443 \ > -v /opt/registry/:/var/lib/registry \ > -v /root/auth:/auth \ > -e "REGISTRY_AUTH=htpasswd" \ > -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \ > -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \ > -e REGISTRY_STORAGE_DELETE_ENABLED=true \##删除功能打开 > registry:2

(添加删除功能)
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###5.运行web容器###
[root@server1 ~]# docker run -it -p 8080:8080 --name registry-web --link registry:redhat.org \ ##设置端口,容器名字,连接仓库 > -e REGISTRY_URL=https://redhat.org/v2 \##仓库资源地址 > -e REGISTRY_TRUST_ANY_SSL=true \##允许ssl加密认证 > -e REGISTRY_BASIC_AUTH="YWRtaW46cmVkaGF0" \##认证密码(查看/root/.docker/config.json文件) > -e REGISTRY_NAME=redhat.org \##仓库名字,镜像 > -e REGISTRY_READONLY=false \##只读属性关闭 > docker-registry-web##镜像

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(到这个位置就停止了,不是错误,直接访问web端就行,如果ctrl+c,那么就停止运行了,web端也无法访问了)
###6.web端管理###
###1.访问web端###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(重新开一个窗口)
###2.修改镜像标签###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###3.上传镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###4.查看web端###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(game2048已经可以在仓库里看到)
###5.删除镜像###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(点击game2048----->Delete)
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

(点击Delete)
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片
(game2048已经没有了)
这些操作都会在另一个窗口体现
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###7.删除数据###
###1.删除正在运行的容器###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片

###2.删除数据卷###
docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)
文章图片




【总结】: docker 仓库子命令:
docker search镜像##从Docker Hub查找镜像
docker login##登录仓库
docker logout##登出仓库
docker tag本地镜像标记名称##标记本地镜像,将其归入某一仓库
docker pull镜像##从镜像仓库中拉取或者更新指定镜像(-a :拉取所有 tagged 镜像)
docker push镜像##将本地的镜像上传到镜像仓库,要先登陆到镜像仓库

更多学习内容请看官方文档:https://docs.docker.com/registry/

    推荐阅读