docker private registry的搭建

Docker Private Registry的搭建


1      前言

通常开发者在Docker Hub上管理和维护镜像,而我们的Docker项目需要在华为内网Hub来做。因此,本文介绍了在本地物理机上部署一个private registry(简称私服),用Nginx反向代理控制,管理和维护镜像。

Git Hub上的docker/docker-registry,是一个Registryserver的源代码。这里用它编译生成需要的私服。不愿意本地编译的,可以上DockerHub,下载官方的服务镜像做私服使用。图一说明了服务的作用,简单说应该是安全,节省带宽和提高利用效率。

docker private registry的搭建_第1张图片

图 1

Nginx是反向代理;提供https的ssl的认证和basic authentication。这里我们通过Nginx的登录认证机制向私服推送镜像。

GitHub

2      验证Nginx和私有服务的使用

2.1      编译

我们从Github上找来一套参考代码larrycai/nginx-auth-proxy,重新做一些配置,用来Demo。

在Dockerfile里,把代理改成公司内部的代理。

另外nginx/stable的镜像这里应该不需要安装了。

其余的代码暂时不需要修改。执行编译$ docker build -t"nginx:xky" .,编译完成后我们可以看到生成新的nginx镜像。

2.2      生成和导入证书

2.2.1     自签名证书

例子里面自带了证书,自签名的。为了demo我们直接拿过来用了。以后我们还要拿自己公司的签名证书来用的。

它是在Dockerfile里面加到私服的(更多的创建规则留待以后研究):

ADD server.crt/etc/ssl/certs/docker-registry

ADD server.key/etc/ssl/private/docker-registry

第二步,代码作者在nginx.default做了一次配置,意思应该是在私服里面开启证书功能,和导入证书吧。

ssl on;

ssl_certificate/etc/ssl/certs/docker-registry;

ssl_certificate_key /etc/ssl/private/docker-registry;

2.2.2     根证书

把dokk.co的根证书ca.pem下载下来,再加入到docker的证书(/etc/ssl/certs/ca-certificates.crt)中。作者已经把ca.pem放在容器中了,可以直接把它拷贝出来用。以后正式部署私服的时候,应该还需要自己生成正式的CA证书。

$ docker cp nginx:/ca.pem $PWD

$ cat ca.pem | sudo tee -a/etc/ssl/certs/ca-certificates.crt

2.3      运行服务

这一节介绍运行调试私服和代理的过程。

2.3.1     私服的组成

docker private registry的搭建_第2张图片

图 2

dokk.co是私服的域名,自己定义。定义好名字之后,就要把它写到/etc/hosts里面:127.0.0.1      localhost dokk.co。还需要通过命令或者配置文件用它做本地代理 export no_proxy=”dokk.co”;

registry是私服,nginx是反向代理,这个都介绍过了;

registry的5000端口配置出来为了调试方便,因为用了反向代理,也可以不配置(试过,不配置也行);

nginx上的443:443 就是对外服务的https端口;

2.3.2     在代理中添加用户

用htpasswd命令生成用户名密码文件docker-registry.htpasswd,把它加到nginx.default里面:

auth_basic_user_file  docker-registry.htpasswd;  # larrycai:passwd

2.3.3     私服运行

运行私服:

sudo docker run -d --name registry -p5000:5000 registry

再运行Nginx服务:

sudo docker run -d --hostname dokk.co--name nginx --link registry:registry -p 443:443 nginx:xky

用$ docker ps查询,可以看到这两个运行状态的服务:

2.3.4     私服验证

通过命令访问反向代理,观察返回信息:

$ wget https://dokk.co:443--no-check-certificate

用户larrycai登录到dokk.co域上:

$ docker --insecure-registry=dokk.co login-u larrycai dokk.co

再来验证用户访问域的结果:

$ curl -i -khttps://larrycai:[email protected]

docker private registry的搭建_第3张图片

还可以通过浏览器访问https://10.110.48.43:443 :

停止nginx进程后,访问失败。

$sudo docker stop nginx

docker private registry的搭建_第4张图片

2.4      Push images到私服

默认情况下,我们是从Docker Hub上pull镜像下来,经过修改push到上面(自己用户的REPO)。

$ sudo docker tag be625f2393e4xiekeyang/test:test

$sudo docker push xiekeyang/test

docker private registry的搭建_第5张图片

通过nginx,我们就可以push镜像到自己的私服上。

先把image打上TAG,根据私服的域名命名。

$ sudo docker tag be625f2393e4dokk.co/test:test

$sudo docker push dokk.co/test

但是这里有个问题,我们可以在浏览器上查询push进私服的 images。

访问https://10.110.48.43/v1/search,得到返回值

{"num_results": 2, "query": "","results": [{"description": "", "name":"library/test"}, {"description": "", "name":"library/test01"}]}

但是执行命令 $ sudo docker searchdokk.co/test

得到错误信息:

FATA[0000] Error response from daemon:Unexepected status code 401

我们正在针对这个问题追踪。

3      小结

以上运行和调试了反向代理控制的私服主要功能。之后正式部署公司的私服中,前期应该会遵循上述的调试过程。

目前在GitHub上的docker-registry主干代码(124 open issues),还有安全,存储,并发等功能需要进一步设计和优化。我们将在熟悉代码的同时,多做些测试,并关注主干上的活动。

 


你可能感兴趣的:(docker)