Docker Private Registry的搭建
通常开发者在Docker Hub上管理和维护镜像,而我们的Docker项目需要在华为内网Hub来做。因此,本文介绍了在本地物理机上部署一个private registry(简称私服),用Nginx反向代理控制,管理和维护镜像。
Git Hub上的docker/docker-registry,是一个Registryserver的源代码。这里用它编译生成需要的私服。不愿意本地编译的,可以上DockerHub,下载官方的服务镜像做私服使用。图一说明了服务的作用,简单说应该是安全,节省带宽和提高利用效率。
图 1
Nginx是反向代理;提供https的ssl的认证和basic authentication。这里我们通过Nginx的登录认证机制向私服推送镜像。
GitHub
我们从Github上找来一套参考代码larrycai/nginx-auth-proxy,重新做一些配置,用来Demo。
在Dockerfile里,把代理改成公司内部的代理。
另外nginx/stable的镜像这里应该不需要安装了。
其余的代码暂时不需要修改。执行编译$ docker build -t"nginx:xky" .,编译完成后我们可以看到生成新的nginx镜像。
例子里面自带了证书,自签名的。为了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;
把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
dokk.co是私服的域名,自己定义。定义好名字之后,就要把它写到/etc/hosts里面:127.0.0.1 localhost dokk.co。还需要通过命令或者配置文件用它做本地代理 export no_proxy=”dokk.co”;
registry是私服,nginx是反向代理,这个都介绍过了;
registry的5000端口配置出来为了调试方便,因为用了反向代理,也可以不配置(试过,不配置也行);
nginx上的443:443 就是对外服务的https端口;
用htpasswd命令生成用户名密码文件docker-registry.htpasswd,把它加到nginx.default里面:
auth_basic_user_file docker-registry.htpasswd; # larrycai:passwd
运行私服:
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查询,可以看到这两个运行状态的服务:
通过命令访问反向代理,观察返回信息:
$ 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]
还可以通过浏览器访问https://10.110.48.43:443 :
停止nginx进程后,访问失败。
$sudo docker stop nginx
默认情况下,我们是从Docker Hub上pull镜像下来,经过修改push到上面(自己用户的REPO)。
$ sudo docker tag be625f2393e4xiekeyang/test:test
$sudo docker push xiekeyang/test
通过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
我们正在针对这个问题追踪。
以上运行和调试了反向代理控制的私服主要功能。之后正式部署公司的私服中,前期应该会遵循上述的调试过程。
目前在GitHub上的docker-registry主干代码(124 open issues),还有安全,存储,并发等功能需要进一步设计和优化。我们将在熟悉代码的同时,多做些测试,并关注主干上的活动。