目录

Docker Registry
  • 官方文档:https://docs.docker.com/registry/

Docker Registry 是一个存储 Images 的仓库。在 Docker 的运行过程中,Daemon 会与 Registry 通信,并实现了搜索镜像、下载镜像、上传镜像三个功能,这三个功能对应的 Job 分别为 search、pul 与 push。

Docker Registry 分为两大类型:

  • Pubilc Registry:如 Docker Hub,可以从中找到来自开源项目、软件供应商、乃至个人账户的 Docker Image。
  • Private Registry:这样可以保证容器镜像的获取在内网完成。

NOTE:Registry(注册表)和 Repository(仓库)是有区别的,Daemon 可以 Push/Pull Repository,也可以 Push/Pull Image。

  • 每个 Registry 上可以存放多个 Repository。
  • 每个 Repository 中又包含了多个 Images。
  • 每个 Image 有着不同的 Tag(标签)。

当 Docker Server 的 Local Images 不存在时,才会到 Remote Registry/Repository 下载 Images。

Docker 容器技术 — Private Registry_原力计划

Private Registry

Pubilc Registry 有着明显的缺陷:

  1. Push 和 Pull 的速度慢,带宽大。
  2. 隐私安全性差。

所以,在生产环节中的多数时候还是需要创建自己的 Private Registry。

搭建 Private Registry 有两种方式:

  1. 使用 Docker 提供的 docker-distribution:可以通过 Docker Container 或者 YUM 的方式安装。采用 Docker Container 安装的话,需要把 Image Storage Directory(镜像存储目录)挂载到宿主机的某目录下持久化数据,防止容器意外中止或者删除导致 Repository(仓库)不可用。此种 Registry 功能比较单一。
  2. 使用 Harbor:这是 VMware 基于 docker-distribution 二次开发的软件,功能强大,现已加入了 CNCF。
使用 docker-distribution 搭建 Private Registry

软件包安装

  1. 安装 docker-distribution,在 Host 192.168.1.226 上搭建 Private Registry。
$ yum -y install docker-distribution

# 镜像会储存在 /var/lib/registry 下,默认监听在 HTTP 5000 端口。
$ cat /etc/docker-distribution/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
    cache:
        layerinfo: inmemory
    filesystem:
        rootdirectory: /var/lib/registry
http:
    addr: :5000

$ systemctl start docker-distribution && systemctl enable docker-distribution && systemctl status docker-distribution

$ netstat -lpntu | grep 500
tcp6       0      0 :::5000                 :::*                    LISTEN      8512/registry
  1. 从 Docker1 上传 Image 到 Private Registry。
# 配置 Private Registry 地址,并配置支持 HTTP insecure 方式推送镜像。
$ vi /etc/docker/daemon.json
{
  "registry-mirrors": [
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com"
  ],
  "insecure-registries": ["192.168.1.226:5000"]
}

$ systemctl restart docker.service

$ docker pull docker.io/busybox

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/busybox   latest              69593048aa3a        7 days ago          1.24 MB

# Image repo name 的格式为 <private_registry_ip:port>/name 才可以与配置中的 insecure-registries 匹配上。
$ docker tag docker.io/busybox:latest 192.168.1.226:5000/busybox:latest

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
192.168.1.226:5000/busybox   latest              69593048aa3a        7 days ago          1.24 MB
docker.io/busybox            latest              69593048aa3a        7 days ago          1.24 MB

$ docker push 192.168.1.226:5000/busybox:latest
The push refers to a repository [192.168.1.226:5000/busybox]
5b8c72934dfc: Pushed
latest: digest: sha256:dca71257cd2e72840a21f0323234bb2e33fea6d949fa0f21c5102146f583486b size: 527
  1. 在 Private Registry 查看 Images 文件。
$ ll /var/lib/registry/docker/registry/v2/repositories/
drwxr-xr-x 5 root root 55 615 23:08 busybox
  1. Docker2 从 Private Registry 拉取 Docker1 上传的 Images
$ vim /etc/docker/daemon.json 
{
  "insecure-registries": ["192.168.1.226:5000"]
}

$ systemctl restart docker.service

$ docker pull 192.168.1.226:5000/busybox
Using default tag: latest
Trying to pull repository 192.168.1.226:5000/busybox ...
latest: Pulling from 192.168.1.226:5000/busybox
b71f96345d44: Pull complete
Digest: sha256:dca71257cd2e72840a21f0323234bb2e33fea6d949fa0f21c5102146f583486b
Status: Downloaded newer image for 192.168.1.226:5000/busybox:latest

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
192.168.1.226:5000/busybox   latest              69593048aa3a        7 days ago          1.24 MB

Docker Container 安装(推荐)

使用 Docker Container 来安装 docker-distribution 并搭建成为 Private Registry 是一种简易的手段。

# 将宿主机的 /opt/registry 挂载到容器的 /var/lib/registry。
$ docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:2

$ docker images
REPOSITORY                   TAG                 IMAGE ID            CREATED             SIZE
docker.io/registry           2                   1fd8e1b0bb7e        2 months ago        26.2 MB

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
59f0159a62c4        registry:2          "/entrypoint.sh /e..."   26 seconds ago      Up 25 seconds       0.0.0.0:5000->5000/tcp   registry

$ netstat -lpntu | grep 5000
tcp6       0      0 :::5000                 :::*                    LISTEN      21070/docker-proxy-
  • 查看 Docker Container 的进程:
$ docker exec -it -u root 59f0159a62c4 ps -ef
PID   USER     TIME  COMMAND
    1 root      0:00 registry serve /etc/docker/registry/config.yml
   16 root      0:00 ps -ef

$ docker exec -it -u root 59f0159a62c4 cat /etc/docker/registry/config.yml
version: 0.1
log:
  fields:
    service: registry
storage:
  cache:
    blobdescriptor: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
http:
  addr: :5000
  headers:
    X-Content-Type-Options: [nosniff]
health:
  storagedriver:
    enabled: true
    interval: 10s
    threshold: 3

可见,跟我们手动安装的方式没有本质的区别。