【云原生 | 43】快速搭建Docker Registry私有仓库

时间:2022-11-08 10:52:08

????博主简介
        ????云计算领域优质创作者
        ????新星计划第三季python赛道第一名
        ????阿里云ACE认证高级工程师
        ????阿里云开发者社区专家博主

????交流社区CSDN云计算交流社区欢迎您的加入!

目录

1. 安装DockerRegistry 

1.1 基于容器安装运行 

1.2 本地安装运行 

2. 配置TLS证书 

2.1 自行生成证书 

2.2 从代理商申请证书

2.3 启用证书 

 ????????????结束语????????????


在使用Docker一段时间后,往往会发现手头积累了大量的自定义镜像文件,这些文件通过公有仓库进行管理并不方便;另外有时候只是希望在内部用户之间进行分享,不希望暴露出去。这种情况下,就有必要搭建一个本地私有镜像仓库。

1. 安装DockerRegistry 

Docker Registry工具目前最新为2.0系列版本,这一版本与一些类库、工具一起被打包为负责容器内容分发的工具集:Docker Distribution。目前其核心的功能组件仍为负责镜像仓库的管理。
新版本的Registry基于Golang进行了重构,提供更好的性能和扩展性,并且支持Docker 1.6+的API,非常适合用来构建私有的镜像注册服务器。官方仓库中也提供了Registry的镜像,因此用户可以通过容器运行和源码安装两种方式来使用Registry。

1.1 基于容器安装运行 

基于容器的运行方式十分简单,只需要一条命令:

$ docker run -d -p 5000:5000 --restart=always --name registry registry:2.1
启动后比较关键的参数是指定配置文件和仓库存储路径。 Registry默认的配置文件为/etc/docker/registry/config.yml,因此,通过如下命令,可以指定使用本地主机上的配置文件(如/home/user/registry-conf)。
$ docker run -d -p 5000:5000 \
--restart=always \
--name registry \
-v /home/user/registry-conf/config.yml:/etc/docker/registry/config.yml \
registry:2
此外,Registry默认的存储位置为/var/lib/registry,可以通过-v参数来映射本地的路径到容器内。

例如下面的例子将镜像存储到本地/opt/data/registry目录。

$ docker run -d -p 5000:5000 --restart=always --name registry \
-v /opt/data/registry:/var/lib/registry \
registry:2

1.2 本地安装运行 

有时候需要本地运行仓库服务,可以通过源码方式进行安装。首先安装Golang环境支持,以Ubuntu为例,可以执行如下命令:
$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable
$ sudo apt-get update
$ sudo apt-get install golang
确认Golang环境安装成功,并配置$GOPATH环境变量,例如/go。创建$GOPATH/src/github.com/docker/目录,并获取源码,如下所示
$ mkdir -p $GOPATH/src/github.com/docker/
$ cd $GOPATH/src/github.com/docker/
$ git clone https://github.com/docker/distribution.git
$ cd distribution
将自带的模板配置文件复制到/etc/docker/registry/路径下,创建存储目录/var/lib/registry:
$ cp cmd/registry/config-dev.yml /etc/docker/registry/config.yml
$ mkdir -p /var/lib/registry

然后执行安装操作:

$ make PREFIX=/go clean binaries

编译成功后,可以通过下面的命令来启动:

$ registry serve /etc/docker/registry/config.yml
此时使用访问本地的5000端口,看到返回成功(200 OK),则说明运行成功:
$ curl -i 127.0.0.1:5000/v2/
HTTP/1.1 200 OK
Content-Length: 2
Content-Type: application/json; charset=utf-8
Docker-Distribution-Api-Version: registry/2.0
X-Content-Type-Options: nosniff
Date: Wed, 31 Sep 2016 06:36:10 GMT
{}

2. 配置TLS证书 

当本地主机运行Registry服务后,所有能访问到该主机的Docker Host都可以把它作为私有仓库使用。只需要在镜像名称前面添加上具体的服务器地址。

例如将本地的ubuntu:latest镜像上传到私有仓库myrepo.com:

$ docker tag ubuntu myrepo.com:5000/ubuntu
$ docker push myrepo.com:5000/ubuntu

或者从私有仓库myrepo.com下载镜像到本地:

$ docker pull myrepo.com:5000/ubuntu
$ docker tag myrepo.com:5000/ubuntu ubuntu
私有仓库需要启用TLS认证,否则会报错。在第一部分中,我们介绍了通过添加DOCKER_OPTS="--insecure-registry myrepo.com:5000来避免这个问题。在这里将介绍如何获取和生成TLS证书。

2.1 自行生成证书 

使用openssl工具可以很容易地生成私人证书文件:

$ mkdir -p certs
$ openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/myrepo.key -x509 -days 365 -out certs/myrepo.crt
生成过程中会提示填入各种信息,注意CN一栏的信息要填入跟访问的地址相同的域名,例如这里应该为myrepo.com。
生成结果为秘钥文件myrepo.key,以及证书文件myrepo.crt。 其中证书文件需要发送给用户,并且配置到用户Docker Host上,注意路径需要跟域名一致,例如:
/etc/docker/certs.d/myrepo.com:5000/ca.crt

2.2 从代理商申请证书

如果Registry服务需要对外公开,需要申请大家都认可的证书。 知名的代理商包括SSLs.com、GoDaddy.com、LetsEncrypt.org、GlobalSign.com等,用户可以自行选择权威的证书提供商。

2.3 启用证书 

当拥有秘钥文件和证书文件后,可以配置Registry启用证书支持,主要通过REGISTRY_HTTP_TLS_CERTIFICATE和REGISTRY_HTTP_TLS_KEY参数来设置:
docker run -d -p 5000:5000 --restart=always --name registry \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/myrepo.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/myrepo.key \
registry:2

 ????????????结束语????????????

【云原生 | 43】快速搭建Docker Registry私有仓库