????博主简介:
????云计算领域优质创作者
????新星计划第三季python赛道第一名
????阿里云ACE认证高级工程师
????阿里云开发者社区专家博主????交流社区:CSDN云计算交流社区欢迎您的加入!
目录
在使用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