nginx+registry搭建docker仓库

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

1
docker pull registry

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

1
2
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运行在容器中,这里是直接运行在物理机的);

1
2
3
4
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证书(公钥、私钥);

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

5、配置nginx文件;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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内容如下:

1
2
3
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服务推送镜像,会报如下类似的错误:

1
2
3
4
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报错:

1
2
3
4
5
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的相应模块或版本即可解决问题。

----------------本文结束 感谢阅读----------------