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

目录

  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 发出响应,返回三个相关部分信息:
    • 该镜像所处的registry
    • 该镜像包括所有层的校验
    • 以授权为目的的Token

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

  3. 用户通过响应后返回的Token和registry沟通,registry全权负责镜像,它用来存储基本的镜像和继承的层。
  4. registry现在要与index证实该token是被授权的。
  5. index会发送“true”或者“false”给registry,由此判定是否允许用户下载所需要的镜像。
情景A流程图

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

  1. 用户发送附带证书的请求到index要求分配库名。
  2. 在认证成功,命名空间可用之后,库名也被分配。index发出响应返回临时的token。
  3. 镜像连带token,一起被推送到registry中。
  4. registry与index证实token被授权,然后在index验证之后开始读取推送流。
  5. 该index由Docker校验的镜像更新。
情景B

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

  1. index接收来自Docker一个删除库的信号。
  2. 如果index对库验证成功,它将删除该库,并返回一个临时的token。
  3. registry现在接收到带有该token的删除信号。
  4. registry与index核实该token,然后删除库以及所有与其相关的信息。
  5. Docker现在通知有关删除的index,然后index移除库的所有记录。
情景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                    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签名证书

  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   = 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"
  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: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认证

  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命令就可以成功执行了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容