######1.registry工作原理######
文章图片
一次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客户端来维护推送和拉取,以及客户端的授权
文章图片
文章图片
文章图片
######2.搭建私有仓库#########
docker hub虽然方便,但是还是有限制需要internet连接,速度慢 ,所有人都可以访问,不安全。###1.下载并导入registry2镜像###
好消息是docker公司已经将registry开源,我们可以快速构建私有仓库。
###1.下载镜像文件###
文章图片
(自己下载的镜像文件,需要在向docker中导一次,registry2是新版本)
###2.从仓库拉取镜像###
文章图片
(直接从远端docker仓库拉取的镜像,直接导入docker服务中)
###2.查看registry2镜像的构建历史###
文章图片
(看到端口是5000,数据卷是/var/lib/registry)
###3.创建运行容器###
[root@server1 ~]# docker run -d --name registry -p 5000:5000 -v /opt/registry:/var/lib/registry registry:2
文章图片
######3.上传镜像到私有仓库###### 本地镜像在命名时,需要加上仓库的ip和端口
###1.修改镜像的格式###
文章图片
###2.上传镜像###
文章图片
(使用镜像加速器后,上传速度非常快)
###3.查看本地私有仓库###
文章图片
或者
[root@server1 ~]# yum install -y tree##安装树结构
文章图片
(分层存储)
文章图片
######4.删除数据###### ###1.删除容器###
[root@server1 ~]# docker container prune##取出所有停止的容器
文章图片
###2.删除数据卷###
[root@server1 ~]# docker volume prune##删除所有数据卷
文章图片
######5.docker仓库加密######
文章图片
因为私有docker仓库任何人都能访问,不安全,所以要加密认证
###1.生成证书###
###1.创建证书存放目录###
文章图片
###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.修改本地解析###
文章图片
(将证书里填写的服务器主机名添加到本地解析)
###4.查看生成的key和证书###
文章图片
###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目录的上一层目录环境
文章图片
(因为创建运行容器时没有给容器命名,系统自动生成容器名为“eager_ride”)
文章图片
(其他主机访问,被加密)
###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
文章图片
(如果不拷贝证书,那么在上传镜像时会报错)
###4.上传镜像###
本地镜像在命名时,需要加上服务器主机名。
###1.修改标签###
文章图片
###2.上传镜像###
文章图片
###5.其他主机从私有仓库拉取镜像###
###1.安装docker-ce###
文章图片
[root@server2 ~]# yum install -y docker-ce
[root@server2 ~]# systemctl start docker
###2.传递证书###
文章图片
文章图片
###3.修改本地解析###
文章图片
###4.拉取镜像###
文章图片
######6.Docker仓库添加用户认证功能###### ###1.生成用户密码文件###
文章图片
###2.运行容器导入用户密码文件###
[root@server1 ~]# docker run --rm --entrypoint htpasswd registry:2 -Bbn admin redhat > auth/htpasswd
##–entrypoint:覆盖镜像默认的ENTRYPOINT,ENTRYPOINT是不可以被覆盖的,如果实在要覆盖需要使用此参数
##-B:强制密码加密
##-b:使用命令行中的密码而不是提示输入密码
##-n:不更新加密文件,只将加密后的用户名密码显示在屏幕上
文章图片
【注意】:在导入多个用户密码时,除了第一个用户用“>”,之后添加的用户都用“>>”导入文件,
否则就会覆盖原来文件内容。
在实际生产环境中,admin和普通用户的权限是不一样的,还要做权限设定。
###3.删除之前创建的仓库###
文章图片
(防止冲突)
###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##这次使用都是绝对路径
文章图片
###5.上传镜像###
【docker私有仓库( registry工作原理 / 搭建私有仓库/ docker仓库加密 / docker仓库用户认证功能 / 搭建docker-registry-web端)】###1.修改镜像标签###
文章图片
###2.上传镜像###
文章图片
(上传失败:没有基本身份验证凭据)
###3.查看用户登陆认证文件###
文章图片
###6.docker主机认证###
###1.用户登陆###
文章图片
(认证登陆成功)
###2.查看用户登陆认证文件###
文章图片
###3.上传镜像###
文章图片
(上传成功)
###4.登出仓库###
文章图片
###7.其他主机拉取镜像###
###1.直接拉取###
文章图片
(拉取失败:没有基本身份验证凭据)
###2.认证登陆仓库###
文章图片
###3.查看用户登陆认证文件###
文章图片
###4.重新拉取###
文章图片
文章图片
###5.退出登陆###
文章图片
######7.搭建docker-registry-web端####### ###1.在github中查找项目###
文章图片
(搜索registry-web,点击“mkuchin/docker-registry-web”)
文章图片
(下拉查看文档)
###2.下载并导入docker-registry-web镜像###
文章图片
文章图片
###3.连接私有仓库###
文章图片
(查看认证密码auth=,之后运行web端时要用到)
###4.重新创建仓库###
###1.删除正在运行的容器###
文章图片
###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
(添加删除功能)
文章图片
###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##镜像
文章图片
文章图片
(到这个位置就停止了,不是错误,直接访问web端就行,如果ctrl+c,那么就停止运行了,web端也无法访问了)
###6.web端管理###
###1.访问web端###
文章图片
文章图片
(重新开一个窗口)
###2.修改镜像标签###
文章图片
###3.上传镜像###
文章图片
文章图片
###4.查看web端###
文章图片
(game2048已经可以在仓库里看到)
###5.删除镜像###
文章图片
(点击game2048----->Delete)
文章图片
(点击Delete)
文章图片
(game2048已经没有了)
这些操作都会在另一个窗口体现
文章图片
###7.删除数据###
###1.删除正在运行的容器###
文章图片
###2.删除数据卷###
文章图片
【总结】: docker 仓库子命令:
docker search镜像##从Docker Hub查找镜像
docker login##登录仓库
docker logout##登出仓库
docker tag本地镜像标记名称##标记本地镜像,将其归入某一仓库
docker pull镜像##从镜像仓库中拉取或者更新指定镜像(-a :拉取所有 tagged 镜像)
docker push镜像##将本地的镜像上传到镜像仓库,要先登陆到镜像仓库
更多学习内容请看官方文档:https://docs.docker.com/registry/