什么是仓库
- Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
- Docker运行中使用的默认仓库是 Docker Hub 公共仓库。
Docker Hub
docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。
- 首先在https://cloud.docker.com/网站注册一个账号
在docker主机上登录
- docker hub为了区分不同用户的同名镜像,要求镜像的格式是[username]/xxx.tag
- 上传镜像到docker hub
在docker hub上新建一个公共仓库
创建之后可以看到如下公共仓库
上传镜像到docker hub
从docker hub拉取镜像
删除镜像
搭建私有仓库
docker hub虽然方便,但是还是有限制
需要internet连接,速度慢
所有人都可以访问
由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库
- 下载registry镜像
可用docker pull registry:2直接下载,但是比较慢,这里我已经先下载了registry2.tar。
现在将其添加。
[root@hadoop1 ~]# docker load -i registry2.tar
d9ff549177a9: Loading layer 4.671MB/4.671MB
f641ef7a37ad: Loading layer 1.587MB/1.587MB
d5974ddb5a45: Loading layer 20.08MB/20.08MB
5bbc5831d696: Loading layer 3.584kB/3.584kB
73d61bf022fd: Loading layer 2.048kB/2.048kB
Loaded image: registry:2
- 运行registry容器
[root@hadoop1 ~]# docker run -d -p 5000:5000 registry:2
25561537ca3d19bc2b577a3ddf8a4ecb06676038d6f03eb90f9f58451eb08c8f
[root@hadoop1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
25561537ca3d registry:2 "/entrypoint.sh /etc…" 7 seconds ago Up 6 seconds 0.0.0.0:5000->5000/tcp youthful_rosalind
- 上传镜像到本地仓库
本地镜像在命名时需要加上仓库的ip和端口
[root@hadoop1 ~]# docker tag busybox:latest localhost:5000/busybox:v1
[root@hadoop1 ~]# docker push localhost:5000/busybox:v1
The push refers to repository [localhost:5000/busybox]
8a788232037e: Pushed
v1: digest: sha256:915f390a8912e16d4beb8689720a17348f3f6d1a7b659697df850ab625ea29d5 size: 527
一次docker pull 或 push背后发生的事情
index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同像可以保存在不同的registry服务上,其索引信息都放在index服务上。
Docker Registry有三个角色,分别是index、registry和registry
client。
index
负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
Web UI
元数据存储
认证服务
符号化registry
是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。Registry Client
Docker充当registry客户端来维护推送和拉取,以及客户端的授权。- 情景A:用户要获取并下载镜像。
具体工作流程如下
用户发送请求到index来下载镜像。
index 响应返回三个相关部分信息:该镜像包括所有层的校验
以授权目的Token
用户通过响应中返回的Token和registry沟通,registry全权负责镜像,它存储基本的镜像和继承的层。
registry现在要与index证实该token是被授权的。index会发送“true” 或者 “false”给registry,由此允许用户下载所需要的镜像。- 情景B:用户要推送镜像到registry中
- 情景B:具体工作流程如下:
用户发送带证书请求到index要求分配库名。
在成功认证,命名空间可用以及库名被分配之后。index响应返回临时的token。
镜像连带token,一起被推送到registry中。
registry与index证实token,然后在index验证之后开始读取推送流。
该index然后更新由Docker生成的镜像校验。 - 情景C:用户要从index或registry中删除镜像。
- 情景C:具体工作流程如下:
index接收来自Docker一个删除库的信号。
如果index验证库成功,它将删除该库,并返回一个临时token。
registry现在接收到带有该token的删除信号。
registry与index核实该token,然后删除库以及所有相关信息。
Docker现在通知有关删除的index,然后index移除库的所有记录。