共计 6766 个字符,预计需要花费 17 分钟才能阅读完成。
目录
- Docker Registry 介绍
- 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 :用户要获取并下载镜像。所涉及的步骤如下:
- 用户发送请求到 index 来下载镜像。
- index 发出响应,返回三个相关部分信息:
- 该镜像所处的 registry
- 该镜像包括所有层的校验
- 以授权为目的的 Token
注意:当请求 header 里有 X -Docker-Token 时才会返回 Token。而私人仓库需要基本的身份验证,对于公有仓库这一点不是强制性的。
- 用户通过响应后返回的 Token 和 registry 沟通,registry 全权负责镜像,它用来存储基本的镜像和继承的层。
- registry 现在要与 index 证实该 token 是被授权的。
- index 会发送“true”或者“false”给 registry,由此判定是否允许用户下载所需要的镜像。
情景 B :用户想要将镜像推送到 registry 中。其中涉及的步骤如下:
- 用户发送附带证书的请求到 index 要求分配库名。
- 在认证成功,命名空间可用之后,库名也被分配。index 发出响应返回临时的 token。
- 镜像连带 token,一起被推送到 registry 中。
- registry 与 index 证实 token 被授权,然后在 index 验证之后开始读取推送流。
- 该 index 由 Docker 校验的镜像更新。
情景 C:用户想要从 index 或 registry 中删除镜像:
- index 接收来自 Docker 一个删除库的信号。
- 如果 index 对库验证成功,它将删除该库,并返回一个临时的 token。
- registry 现在接收到带有该 token 的删除信号。
- registry 与 index 核实该 token,然后删除库以及所有与其相关的信息。
- Docker 现在通知有关删除的 index,然后 index 移除库的所有记录。
情景 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 NAMES
7ac6961a915b 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/centos
Error 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/centos
The push refers to a repository [192.168.202.14:5000/centos] (len: 1)
65e4158d9625: Pushed
5506dda26018: Pushed
latest: 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 签名证书
- 在 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 = hash
authorityKeyIdentifier = keyid,issuer
basicConstraints = CA:true
subjectAltName = @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"
- 生成 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
-
证书生成好了,客户端现在就不需要 –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:5000
sudo 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 认证
- 首先在 registry 生成用户名
zhangjiayang
和密码sczq123456
:
sudo mkdir /auth
sudo sh -c "docker run --entrypoint htpasswd registry:2.3.0 -Bbn zhangjiayang sczq123456 > /auth/htpasswd"
- 重新启动 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
- 这回客户端用
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
命令就可以成功执行了。
更多 Docker 相关教程见以下内容:
Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm
Ubuntu 16.04 服务器上配置使用 Docker http://www.linuxidc.com/Linux/2017-06/145176.htm
Ubuntu 15.04 下安装 Docker http://www.linuxidc.com/Linux/2015-07/120444.htm
Docker 安装实例 http://www.linuxidc.com/Linux/2017-04/142666.htm
Docker 创建基础镜像 http://www.linuxidc.com/Linux/2017-05/144112.htm
在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm
Ubuntu 16.04 上 Docker 使用手记 http://www.linuxidc.com/Linux/2016-12/138490.htm
使用 Docker 分分钟启动常用应用 http://www.linuxidc.com/Linux/2017-04/142649.htm
Ubuntu 16.04 下 Docker 修改配置文件不生效解决办法 http://www.linuxidc.com/Linux/2017-05/143862.htm
Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里
本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-11/148367.htm