什么是仓库

  • Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Register)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。
  • Docker运行中使用的默认仓库是 Docker Hub 公共仓库。

Docker Hub

docker hub是docker公司维护的公共仓库,用户可以免费使用,也可以购买私有仓库。

docker 搭建bitwarden dockerhub搭建_Docker

  1. 首先在https://cloud.docker.com/网站注册一个账号
    在docker主机上登录

docker 搭建bitwarden dockerhub搭建_Docker_02

  1. docker hub为了区分不同用户的同名镜像,要求镜像的格式是[username]/xxx.tag

docker 搭建bitwarden dockerhub搭建_docker 搭建bitwarden_03



  1. 上传镜像到docker hub
    在docker hub上新建一个公共仓库

docker 搭建bitwarden dockerhub搭建_Docker_04



创建之后可以看到如下公共仓库


docker 搭建bitwarden dockerhub搭建_docker_05


上传镜像到docker hub


docker 搭建bitwarden dockerhub搭建_Docker_06


从docker hub拉取镜像

docker 搭建bitwarden dockerhub搭建_Docker_07


删除镜像


docker 搭建bitwarden dockerhub搭建_hadoop_08


搭建私有仓库

docker hub虽然方便,但是还是有限制
需要internet连接,速度慢
所有人都可以访问
由于安全原因企业不允许将镜像放到外网
好消息是docker公司已经将registry开源,我们可以快速构建企业私有仓库

  1. 下载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
  1. 运行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
  1. 上传镜像到本地仓库
    本地镜像在命名时需要加上仓库的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
Registry 工作原理

一次docker pull 或 push背后发生的事情

index服务主要提供镜像索引以及用户认证的功能。当下载一个镜像的时候,首先会index服务上做认证,然后查找镜像所在的registry的地址并放回给docker客户端,docker客户端再从registry下载镜像,在下载过程中 registry会去index校验客户端token的合法性,不同像可以保存在不同的registry服务上,其索引信息都放在index服务上。

docker 搭建bitwarden dockerhub搭建_docker 搭建bitwarden_09


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

client。

  • index
    负责并维护有关用户帐户、镜像的校验以及公共命名空间的信息。
    Web UI
    元数据存储
    认证服务
    符号化

  • registry
    是镜像和图表的仓库,它不具有本地数据库以及不提供用户认证,通过Index Auth service的Token的方式进行认证。

  • Registry Client
    Docker充当registry客户端来维护推送和拉取,以及客户端的授权。

  • 情景A:用户要获取并下载镜像。
  • docker 搭建bitwarden dockerhub搭建_docker_10

  • 具体工作流程如下
    用户发送请求到index来下载镜像。
    index 响应返回三个相关部分信息:

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

  • 以授权目的Token
    用户通过响应中返回的Token和registry沟通,registry全权负责镜像,它存储基本的镜像和继承的层。
    registry现在要与index证实该token是被授权的。index会发送“true” 或者 “false”给registry,由此允许用户下载所需要的镜像。

  • 情景B:用户要推送镜像到registry中
  • docker 搭建bitwarden dockerhub搭建_docker 搭建bitwarden_11

  • 情景B:具体工作流程如下:
    用户发送带证书请求到index要求分配库名。
    在成功认证,命名空间可用以及库名被分配之后。index响应返回临时的token。
    镜像连带token,一起被推送到registry中。
    registry与index证实token,然后在index验证之后开始读取推送流。
    该index然后更新由Docker生成的镜像校验。
  • 情景C:用户要从index或registry中删除镜像。
  • docker 搭建bitwarden dockerhub搭建_docker_12

  • 情景C:具体工作流程如下:
    index接收来自Docker一个删除库的信号。
    如果index验证库成功,它将删除该库,并返回一个临时token。
    registry现在接收到带有该token的删除信号。
    registry与index核实该token,然后删除库以及所有相关信息。
    Docker现在通知有关删除的index,然后index移除库的所有记录。