nginx+registry搭建docker仓库

registry版本为1.0,目前官方默认的latest版本就是v1.0,前端采用nginx做https反向代理。
1、从官方获取registry镜像;

docker pull registry

2、启动registry镜像,并且手动分配IP地址;

docker run -d --net=none -v /docker/data/registry:/tmp/registry --name=registry registry
sh manual_con_static_ip.sh feb704c3582e 10.8.8.179 24 10.8.8.211 deth0

这样的registry服务监听在10.8.8.179的5000端口。
3、安装nginx,注意nginx的版本如果低于1.3.9,可能需要安装chunkin模块(1.3.9以后内置该模块),不然push镜像会失败,nginx返回411错误。目前版本较低,直接安装新的nginx1.8.0(最好将nginx运行在容器中,这里是直接运行在物理机的);

wget http://nginx.org/download/nginx-1.8.0.tar.gz
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
make -j16
make install

4、为nginx生成自签名的ssl证书(公钥、私钥);

openssl genrsa -out regCA.key 2048
openssl req -x509 -new -nodes -key regCA.key -days 36500 -out regCA.crt

5、配置nginx文件;

server {
listen 10.8.8.211:443;
server_name reg.domain.com;

    ssl on;
    ssl_certificate  /root/nginx/conf/regCA.crt;
    ssl_certificate_key  /root/nginx/conf/regCA.key;

    location / {
        proxy_pass http://10.8.8.179:5000;
        include /usr/local/nginx/conf/proxy_params;
    }
    access_log  /opt/log/nginx/reg.domain.com.log;
}

其中文件/usr/local/nginx/conf/proxy_params内容如下:

proxy_set_header  Host $host;
proxy_set_header  X-Real-IP $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

6、因为registry域名是reg.domain.com,docker在push镜像的时候会在/etc/docker/certs.d寻找对应域名的私钥文件。创建文件夹 /etc/docker/certs.d/reg.domain.com,将之前生成的私钥文件regCA.crt 复制一份到该目录下。
7、如果某台docker服务器需要该仓库reg.domain.com,只要在/etc/docker/certs.d中放入相应的私钥文件即可,不用重启docker服务(如果docker服务上有多个容器的话,无疑是捅了马蜂窝)。
题外话:
如果不用nginx前端代理的话,直接向registry服务推送镜像,会报如下类似的错误:

2015/07/04 16:02:13 Error: Invalid registry endpoint https://10.8.8.179:5000/v1/: Get https://10.8.8.179:5000/v1/_ping: dial tcp 10.0.0.179:5000: connection refused.
If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 10.8.8.179:5000` to the daemon's arguments.
In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag;
simply place the CA certificate at /etc/docker/certs.d/10.8.8.179:5000/ca.crt

这个错误提示私有仓库支持http和https方式。
1、选择http方式需要在docker的启动参数加上–insecure-registry参数。
2、选择https方式,需要将仓库的私钥放到对应仓库地址的目录下如/etc/docker/certs.d/10.0.0.179:5000/。使用https前端代理通常用nginx。
两种方式都可以,第一种方式不灵活,如果需要换一个私有仓库的则需要修改docker的配置文件并重启docker服务,代价太高不合算。第二种方式灵活方便,生成环境常常采用该方法。
使用了nginx代理,一切配置正确。然而在推送镜像的时候,docker报错:

The push refers to a repository [reg.domain.com/registry] (len: 1)
Sending image list
Pushing repository reg.domain.com/registry (1 tags)
e9e06b06e14c: Pushing [==================================================>] 197.2 MB/197.2 MB
FATA[0002]

这时如果查看nginx的日志发现有411错误,基本上是nginx版本太低造成的,升级nginx的相应模块或版本即可解决问题。
文章出处:http://www.xiaomastack.com/2015/07/04/docker-registry/

1 Comment

 Add your comment
  1. 现在Docker官方是registry v2版本,可以直接跑在容器里面。

发表评论:

你的电子邮件地址将不会被公开.

+ 36 = 45