使用官方 docker registry 搭建私有镜像仓库及部署 web ui

本文介绍本人在 Centos 7.1 上的搭建过程 private docker registry 的全过程,参考自这篇 官网文档,英语好的可以直接看官网文档,里面的内容更详细,涉及更多原理性的东西,而本文侧重于动手实践。
本文不介绍 docker 的基础概念,也不介绍为什么要搭建 private docker registry(这方面的内容网上有太多文档)。并且,虽然可以在好几种不同的环境中搭建,但本文只介绍在 Centos 7.1 上的搭建过程,其它版本的系统搭建过程,也请查阅上面给出过的 官网文档。

先安装 docker 1.6 或更高版本

0. 前提条件

需要 centos 7 64位系统,且内核版本最少为 3.10。可通过下面指令检查你的内核版本:
$ uname -r
3.10.0-229.14.1.el7.x86_64

1.安装

安装 docker 有三种方式:
  • 通过源码安装。又可分为两种方式,完全通过源码安装和通过 docker 自身完成安装。前一种方式不仅非常复杂,而且网上介绍的文章很少,这里不介绍。后一种需要你的主机已经安装了 docker,这个要求有点先有鸡还是先有蛋的意味,这里也不介绍。
  • 通过 yum 安装。这种方式最简单,正是本文要介绍的,它会自动帮你下载安装各种依赖文件。
  • 通过 curl 来安装。这种方式其实是运行一个安装脚本,在这个脚本里面也是通过 yum 来安装的。

通过 yum 安装的步骤如下:
1.1,使用 root 或其它有 sudo 权限的账号登录进系统。以下过程假设你使用 root 登录,如果是其它账号,请在命令最前面加上 sudo。

1.2,确保你的 yum 包是最新的
$ yum update

1.3,添加 yum 仓库源
tee /etc/yum.repos.d/docker.repo <<-'EOF'
> [dockerrepo]
> name=Docker Repository
> baseurl=https://yum.dockerproject.org/repo/main/centos/7/
> enabled=1
> gpgcheck=1
> gpgkey=https://yum.dockerproject.org/gpg
> EOF

1.4,安装 docker 包
$ yum install docker-engine

1.5,启动 docker 守护进程
$ service docker start

1.6,到这一步安装 docker 就算完成了,我们可以运行一个 hello-world 容器来验证一下安装是否正确
$ sudo docker run hello-world 
 Unable to find image 'hello-world:latest' locally 
        latest: Pulling from hello-world 
        a8219747be10: Pull complete 
        91c95931e552: Already exists 
        hello-world:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security. 
        Digest: sha256:aa03e5d0d5553b4c3473e89c8619cf79df368babd1.7.1cf5daeb82aab55838d 
        Status: Downloaded newer image for hello-world:latest 
        Hello from Docker. 
        This message shows that your installation appears to be working correctly. 

        To generate this message, Docker took the following steps: 
         1. The Docker client contacted the Docker daemon.
         2. The Docker daemon pulled the "hello-world" image from the Docker Hub. (Assuming it was not already locally available.)
         3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.
         4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal.

         To try something more ambitious, you can run an Ubuntu container with: 
          $ docker run -it ubuntu bash 

         For more examples and ideas, visit: 
          http://docs.docker.com/userguide/


出现上述这样的输出,就说明安装正确了。
    

2.创建一个 docker 用户组

docker 守护进程绑定到一个 unix socket 而不是 tcp 端口。默认情况下,这个 unix socket 的所有者是 root,其他用户需要通过 sudo 的方式访问。因为 docker 守护进程总是以 root 用户运行。
为避免使用 docker 命令的时候必须使用 sudo,我们可以创建一个 docker 用户组,然后将你的用户添加到这个组里面。当 docker 守护进程启动时,它会让 docker 用户组对该 unix socket 有可读可写的权限。
当然如果你只会使用 root 账号登录使用 docker 命令,也可略过这个步骤,对后续进程不会有影响。

创建用户组并添加用户的步骤如下:
2.1,使用 sudo 权限登录进系统

2.2,创建 docker 用户组
$ sudo groupadd docker

2.3,将你的用户添加到 docker 组
$ sudo usermod -aG docker your_username

2.4,退出登录然后再登录进来
这确保你的账号有正确的权限

2.5,不使用 sudo 来执行 docker 命令,验证是否正确
$ docker run hello-world

3. 让 docker 守护进程开机自启动
为了确保当你重启系统的时候,docker 可以自动启动,执行如下指令:
$ sudo chkconfig docker on

关于 docker 守护进程的更多定制化配置,可以参阅: https://docs.docker.com/engine/admin/systemd/

搭建 Docker Registry

以 localhost 运行

要安装并启动一个 docker registry 非常简单,只需要执行下面这条指令:
$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
现在就能够使用这个 registry 了,下面测试一下。

从 docker 官方镜像仓库获取一个镜像,并使用 tag 指令让它指向到你的仓库(这里我们就以上面下载的 hello-world 镜像为例):
$ docker tag hello-world localhost:5000/hello-world:latest

然后将它推送到你的仓库:
$ docker push localhost:5000/hello-world

然后从本地删除这个 hello-world 镜像:
$ docker rmi  hello-world localhost:5000/hello-world
可以通过命令 docker images 看到 hello-world 镜像已经不存在了     

然后再从仓库中把它拉取出来:
$ docker pull localhost:5000/hello-world
可以通过命令 docker images 看到 hello-world 镜像又出现了。

可以通过下面的指令停止你的 registry:
$ docker stop registry && docker rm -v registry

存储

默认情况下,你的 registry 中的数据是存储在你的主机文件系统中的一个 docker volume 中的。    
如果你想指定这个 docker volume  的存储位置,以便更容易地访问 registry 中的数据,可以通过如下指令来完成:
$ docker run -d -p 5000:5000 --restart=always --name registry -v your-path:/var/lib/registry registry:2
当然,也可以将数据存储在某个远程文件系统上,而不是存在本机上,这里就不介绍了。

远程访问

到目前为止,docker registry 已经可以正常使用,且可以指定数据存储位置。但也只能在本地使用,要想在远程使用该 registry,就必须使用 TLS 来确保通信安全,就像使用 SSL 来配置 web 服务器。也可以强制 docker registry 运行在 insecure 模式,这种模式虽然配置起来要简单一些,但很不安全,一般不建议使用。
这里偷懒使用这个简单的 insecure 模式,假设你在一个域名为  test.docker.midea.registry.hub 的主机上运行 docker registry, 步骤如下:
1,在你要远程访问 docker registry 的机器上,修改文件  /etc/default/docker 或  /etc/sysconfig/docker,具体是哪个取决于你的系统。

2,编辑里面的  DOCKER_OPTS 选项,如果没有这个选项字段,就添加一个。改成下面这样的:
ADD_REGISTRY='--add-registry test.docker.midea.registry.hub:5000'
DOCKER_OPTS="--insecure-registry test.docker.midea.registry.hub:5000"
INSECURE_REGISTRY='--insecure-registry test.docker.midea.registry.hub:5000'
close 配置文件并保存修改

3、重启你的 docker 守护进程,可以使用如下指令来完成:
$ service docker restart
ps: 如果你的系统支持 systemd,也可以使用 systemctl 指令。

通过以上3步,你的这个机器就能远程从 test.docker.midea.registry.hub 上运行的 docker registry 拉取镜像了:
$ docker pull test.docker.midea.registry.hub:5000/hello-world
也可以省略 registry 的域名和端口(会先尝试从 test.docker.midea.registry.hub 中拉取,失败后再尝试从  docker.io 拉取 ):
$ docker pull hello-world
前提是你的机器要能访问主机 test.docker.midea.registry.hub,可以修改 /etc/hosts。

部署WebUI

完成了上面的步骤,就可以使用 docker 命令行工具对我们搭建的 registry 做各种操作了,如 push / pull。然而还是不够方便,比如不能直观的查看 registry 中的资源情况,如果有一个 ui 工具,能够看到仓库中有哪些镜像、每个镜像的版本是多少,就好了,下面就介绍 ui 的搭建过程。
目前找到了两个 web ui,一个是  docker-registry-frontend,另一个是  hyper/docker-registry-web。
这两个 ui 功能差不多,只需任选其一就可以了。截止到我安装的时候, docker-registry-frontend 的功能还不完善,没有删除镜像的功能,只能浏览。后一个同时具备 删除和浏览 的功能。这两个 ui 的搭建过程下面都会讲。

先讲下 docker-registry-frontend 的安装过程

参考 这里
1、先安装 docker-compose
这是一个脚本,直接从  https://github.com/docker/compose/releases 下载一个合适的版本,然后拷贝到 /usr/local/bin 目录中,再改下执行权限就可以了。

2、从 github 中下载  docker-registry-frontend 源码
$ git clone https://github.com/kwk/docker-registry-frontend.git

3、修改配置,默认情况下 docker registry 监听你主机的 5000 端口,ui 监听你主机的 8443 端口。而我的主机这两个端口从外部都不能访问,所以要分别修改这两个端口到 10050 和 10080。除了端口,还需要根据你的需要修改仓库中的镜像文件保存的位置,我的镜像要保存到 /var/lib/registry。
$ vim docker-compose.yml
# Setup front-end
frontend:
  image: konradkleine/docker-registry-frontend:v2
  #build: ../
  links:
    - registry:registry
  ports:
    # Publish the frontend's port 443 on the IP 0.0.0.0 on port 8443
   *** - "0.0.0.0:10080:443"***
  volumes:
    - ./frontend/certs/frontend.crt:/etc/apache2/server.crt:ro
    - ./frontend/certs/frontend.key:/etc/apache2/server.key:ro
  environment:
    # The front-end is SSL protected
    - ENV_USE_SSL=yes
    - ENV_DOCKER_REGISTRY_HOST=registry
    - ENV_DOCKER_REGISTRY_PORT=5000
    # The registry is SSL protected as well
    - ENV_DOCKER_REGISTRY_USE_SSL=1

# Setup registry
registry:
  image: registry:2
  volumes:
    # Mount the config directory
    - ./registry/config:/etc/docker/registry:ro
    # Make the registry storage persistent (see ./config/config.yml for the path)
    ***- ./registry/storage:/var/lib/registry:rw***
    # Mount our own certificate and key
    - ./registry/certs:/certs:ro
  ports:
    # Publish registry's port 5000 on the IP 0.0.0.0 on port 5000
    ***- "0.0.0.0:10050:5000"***

启动
$ docker-compose up -d

ps:上面这个指令其实是根据 docker-compose.yml 中的配置启动两个容器(fronted 和 registry,这两个容器是独立的,通过 REST API 交互信息),如果在安装 web ui 前,你的 private docker registry 已经在运行了,也可以去掉上面文件中的 registry 字段,但注意要指定对应的ip和端口信息。
然后就能够访问  https://localhost:10080 

再讲讲怎么安装 hyper/docker-registry-web 

目标是: registry 监听主机的 10050 端口,ui 监听主机的 10080 端口。
1、创建工作目录
$ mkdir -p hyper-docker-registry-web-config/frontend hyper-docker-registry-web-config/registry
$ cd hyper-docker-registry-web-config

2、建一个用于 registry 的配置文件
$ vim registry/config.yml
version: 0.1
log:
  level: info
  formatter: text
  fields:
    service: registry-srv
    environment: production
storage:
  cache:
    layerinfo: inmemory
  filesystem:
    rootdirectory: /var/lib/registry
  delete:
    # 要在 ui 上能够删除镜像,enable 的值必须是 true
    enabled: true
http:
  addr: :5000
  debug:
    addr: :5001

3、新建一个用于 ui 的配置文件
$ vim frontend/config.yml
registry:
  # Docker registry url
  url: http://registry-srv:5000/v2
  # Docker registry fqdn
  name: localhost:10050
  # To allow image delete, should be false
  readonly: false
  auth:
    # Disable authentication
    enabled: false

4、新建一个启动脚本
$ vim startup.sh
#! /bin/bash

# registry 监听主机的 10050 端口,并将镜像文件存储在主机的 /var/lib/registry/storage 中。
docker run -d -p 10050:5000 --restart=always --name registry-srv -v $(pwd)/registry/:/etc/docker/registry:ro -v /var/lib/registry/storage:/var/lib/registry registry:2

# ui 监听主机的 10080 端口
docker run -d -p 10080:8080  --name registry-web --link registry-srv -v $(pwd)/frontend/:/conf/:ro hyper/docker-registry-web

5、启动
$ chmod +x startup.sh
$ ./startup.sh
除了使用 shell 脚本启动,这里其实也可以写一个 docker-compose.yml 配置文件,然后使用  docker-compose 工具启动这两个容器。
等启动完成,就 可以通过  http://localhost:10080  访问 ui,且可以在 ui 上浏览/删除镜像了。

OK,到这里,仓库和 ui 

使用方法:

假设上述的部署在 172.20.30.35 这台机器上进行的。
需要修改【 你的机器】上的2个文件:
1、在 /etc/hosts 中加入:172.20.30.35 docker.midea.registry.hub

2、修改 /etc/sysconfig/docker,添加或修改下面3个字段的值:
ADD_REGISTRY='--add-registry docker.midea.registry.hub:10050'
DOCKER_OPTS="--insecure-registry docker.midea.registry.hub:10050"
INSECURE_REGISTRY='--insecure-registry docker.midea.registry.hub:10050'

3、然后重启你的 docker daemon:
$ service docker restart 或 $ systemctl restart docker.service

4、push 镜像
$ docker tag your-image docker.midea.registry.hub:10050/your-image
$ docker push docker.midea.registry.hub:10050/your-image

5、pull 镜像
$ docker pull docker.midea.registry.hub:10050/your-image

然后就可以使用这个私有registry了。
OVER~~

参考文章:
https://hub.docker.com/r/atcol/docker-registry-ui/
https://github.com/atc-/docker-registry-ui/issues/65#issuecomment-68060219
https://docs.docker.com/registry/configuration/
https://docs.docker.com/compose/overview/
http://www.informit.com/articles/article.aspx?p=2464012





























    

你可能感兴趣的:(docker)