继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

Docker Registry私有仓库介绍与部署章

三国纷争
关注TA
已关注
手记 471
粉丝 51
获赞 178

目录

  1. Docker Registry 介绍

  2. Docker Registry 部署

1. Docker Registry 介绍

Docker Registry,它是所有仓库(包括共有和私有)以及工作流的中央Registry。在深入Docker Registry之前,让我们先去看看一些常见的术语和与仓库相关的概念。

  • Repositories(仓库)可以被标记为喜欢或者像书签一样标记起来

  • 用户可以在仓库下评论。

  • 私有仓库和共有仓库类似,不同之处在于前者不会在搜索结果中显示,也没有访问它的权限。只有用户设置为合作者才能访问私有仓库。

  • 成功推送之后配置webhooks。

1.1 Docker Registry角色

Docker Registry有三个角色,分别是index、registry和registry client。

  • 角色 1 -- Index

index 负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。它使用以下组件维护这些信息:

  • Web UI

  • 元数据存储

  • 认证服务

  • 符号化

这也分解了较长的URL,以方便使用和验证用户存储库。

  • 角色 2 --Registry

registry是镜像和图表的仓库。然而,它没有一个本地数据库,也不提供用户的身份认证,由S3、云文件和本地文件系统提供数据库支持。此外,通过Index Auth service的Token方式进行身份认证。Registries可以有不同的类型。现在让我们来分析其中的几种类型:

  • Sponsor Registry:第三方的registry,供客户和Docker社区使用。

  • Mirror Registry:第三方的registry,只让客户使用。

  • Vendor Registry:由发布Docker镜像的供应商提供的registry。

  • Private Registry:通过设有防火墙和额外的安全层的私有实体提供的registry。

  • 角色 3 --Registry Client

Docker充当registry客户端来负责维护推送和拉取的任务,以及客户端的授权。

1.2 Docker Registry工作流程详解

现在,让我们讨论五种情景模式,以便更好地理解Docker Registry。

情景A:用户要获取并下载镜像。所涉及的步骤如下:

  1. 用户发送请求到index来下载镜像。

  2. index 发出响应,返回三个相关部分信息:

    注意:当请求header里有X-Docker-Token时才会返回Token。而私人仓库需要基本的身份验证,对于公有仓库这一点不是强制性的。

  • 该镜像所处的registry

  • 该镜像包括所有层的校验

  • 以授权为目的的Token

用户通过响应后返回的Token和registry沟通,registry全权负责镜像,它用来存储基本的镜像和继承的层。

registry现在要与index证实该token是被授权的。

index会发送“true”或者“false”给registry,由此判定是否允许用户下载所需要的镜像。

webp

情景A流程图

情景B:用户想要将镜像推送到registry中。其中涉及的步骤如下:

  1. 用户发送附带证书的请求到index要求分配库名。

  2. 在认证成功,命名空间可用之后,库名也被分配。index发出响应返回临时的token。

  3. 镜像连带token,一起被推送到registry中。

  4. registry与index证实token被授权,然后在index验证之后开始读取推送流。

  5. 该index由Docker校验的镜像更新。

webp

情景B

情景C:用户想要从index或registry中删除镜像:

  1. index接收来自Docker一个删除库的信号。

  2. 如果index对库验证成功,它将删除该库,并返回一个临时的token。

  3. registry现在接收到带有该token的删除信号。

  4. registry与index核实该token,然后删除库以及所有与其相关的信息。

  5. Docker现在通知有关删除的index,然后index移除库的所有记录。

webp

情景C

情景D:用户希望在没有index的独立模式中使用registry。
使用没有index的registry,这完全由Docker控制,它最适合于在私有网络中存储镜像。registry运行在一个特殊的模式里,此模式限制了registry与Docker index的通信。所有有关安全性和身份验证的信息需要用户自己注意。

情景E:用户想要在有index的独立模式中使用registry。
在这种情况下,一个自定义的index会被创建在私有网络里来存储和访问镜像的问题。然而,通知Docker有关定制的index是耗时的。 Docker提供一个有趣的概念chaining registries,从而,实现负载均衡和为具体请求而指定的registry分配。在接下来的Docker教程系列中,我们将讨论如何在上述每个情景中使用Docker Registry API ,以及深入了解Docker Security。

2. Docker Registry搭建与配置

2.1 下载、搭建Docker Registry

# 下载镜像[root@localhost ~]# docker pull registry# 启动Docker Registry容器[root@localhost ~]# docker run -d --name registry -p 5000:5000 -v /storage/registry:/tmp/registry registry # 查看Docker Registry进程[root@localhost ~]# docker ps CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS                    NAMES7ac6961a915b        registry            "/entrypoint.sh /etc   14 hours ago        Up 14 hours         0.0.0.0:5000->5000/tcp   loving_darwin

2.2 将Docker镜像推到Registry中

# 给本地镜像打Tag[root@localhost ~]# docker tag centos:latest 192.168.202.14:5000/centos:latest# 推到Registry服务器中[root@localhost ~]# docker push 192.168.202.14:5000/centosError response from daemon: invalid registry endpoint https://192.168.202.14:5000/v0/: unable to ping registry endpoint https://192.168.202.14:5000/v0/v2 ping attempt failed with error: Get https://192.168.202.14:5000/v2/: tls: oversized record received with length 20527
 v1 ping attempt failed with error: Get https://192.168.202.14:5000/v1/_ping: tls: oversized record received with length 20527. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 192.168.202.14:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.202.14:5000/ca.crt

在推送镜像中出现错误,因为client与Registry交互默认将采用https访问,但我们在install Registry时并未配置指定任何tls相关的key和crt文件,https将无法访问。因此, 我们需要配置客户端的Insecure Registry选项(另一种解决方案需要配置Registry的证书)。

2.3 配置客户端Insecure Registry

在客户端中的/etc/sysconfig/docker中修改如下选项:

# 配置Docker执行参数other_args="--insecure-registry 192.168.202.14:5000"# 重启Docker服务service docker restart

再次执行PUSH镜像操作:

# 推到Registry服务器中[root@localhost ~]# docker push 192.168.202.14:5000/centosThe push refers to a repository [192.168.202.14:5000/centos] (len: 1)65e4158d9625: Pushed5506dda26018: Pushedlatest: digest: sha256:800f2d4558acd67f52262fbe170c9fc2e67efaa6f230a74b41b555e6fcca2892 size: 2739

这时, 推送镜像成功。

2.4 配置Docker Registry管理界面

Docker官方只提供了REST API,并没有给我们一个界面。 可以使用Portus来管理私有仓库, 同时可以使用简单的UI管理工具, Docker提供私有库“hyper/docker-registry-web”, 下载该镜像就可以使用了。

docker run -d \
       -p 8080:8080 \
       --name registry-web \
       --link registry-srv \
       -e REGISTRY_URL=http://registry-srv:5000/v2 \
       -e REGISTRY_NAME=localhost:5000 \
       hyper/docker-registry-web

详情请参照:Docker hub

2.5 配置Docker Registry签名证书

  1. 在Docker Registry主机中生成OpenSSL的自签名证书:

cat << EOF > ssl.conf
[ req ]
prompt             = no
distinguished_name = req_subj
x509_extensions    = x509_ext

[ req_subj ]
CN = Localhost

[ x509_ext ]
subjectKeyIdentifier   = hashauthorityKeyIdentifier = keyid,issuer
basicConstraints       = CA:truesubjectAltName         = @alternate_names

[ alternate_names ]
DNS.1 = localhost
IP.1  = 192.168.202.14
EOF

sudo mkdir /certs# 生成证书文件sudo sh -c "openssl req -config ssl.conf \
-new -x509 -nodes -sha256 -days 365 -newkey rsa:4096 \
-keyout /certs/server-key.pem -out /certs/server-crt.pem"
  1. 生成cert文件后,用以下命令来启动Docker Registry私有仓库。

docker rm -f registry
docker run -d \
    -p 5000:5000 \
    --name registry \
    --restart=always \
    -v /var/lib/registry:/var/lib/registry \
    -v /certs:/certs \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    registry:2.3.0
  1. 证书生成好了,客户端现在就不需要 --insecure-registry 了,但是由于这是自签名证书,客户端还需要把证书文件复制过去并配置证书文件:

  • Docker Registry所在本机操作

sudo mkdir -p /etc/docker/certs.d/192.168.202.14:5000
sudo cp /certs/server-crt.pem /etc/docker/certs.d/192.168.202.14:5000/ca.crt
sudo service docker restart
  • Docker客户端操作

sudo mkdir -p /etc/docker/certs.d/192.168.202.14:5000sudo scp root@192.168.202.14:/certs/server-crt.pem /etc/docker/certs.d/192.168.202.14:5000/ca.crt
sudo service docker restart

2.6 配置Docker Registry认证

  1. 首先在registry生成用户名zhangjiayang和密码sczq123456

sudo mkdir /auth
sudo sh -c "docker run --entrypoint htpasswd registry:2.3.0 -Bbn zhangjiayang sczq123456 > /auth/htpasswd"
  1. 重新启动registry容器, 指定认证方式和认证文件参数。

docker rm -f registry
docker run -d \
    -p 5000:5000 \
    --name registry \
    --restart=always \
    -v /var/lib/registry:/var/lib/registry \
    -v /auth:/auth \
    -v /certs:/certs \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
    -e REGISTRY_AUTH=htpasswd \
    -e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
    registry:2.3.0
  1. 这回客户端用 docker push 192.168.202.14:5000/busybox:1.24.1 来尝试push就会失败, 这时需要我们用用户名和密码进行登录。

docker login -u zhangjiayang -p sczq123456 -e email_whatever 192.168.202.14:5000

再次通过docker push命令就可以成功执行了。



作者:garyond
链接:https://www.jianshu.com/p/07041223df66


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP