registry版本为1.0,目前官方默认的latest版本就是v1.0,前端采用nginx做https反向代理。
1、从官方获取registry镜像;
1 | docker pull registry |
2、启动registry镜像,并且手动分配IP地址;
1 | docker run -d --net=none -v /docker/data/registry:/tmp/registry --name=registry registry |
这样的registry服务监听在10.8.8.179的5000端口。
3、安装nginx,注意nginx的版本如果低于1.3.9,可能需要安装chunkin模块(1.3.9以后内置该模块),不然push镜像会失败,nginx返回411错误。目前版本较低,直接安装新的nginx1.8.0(最好将nginx运行在容器中,这里是直接运行在物理机的);
1 | wget http://nginx.org/download/nginx-1.8.0.tar.gz |
4、为nginx生成自签名的ssl证书(公钥、私钥);
1 | openssl genrsa -out regCA.key 2048 |
5、配置nginx文件;
1 | server { |
其中文件/usr/local/nginx/conf/proxy_params内容如下:
1 | proxy_set_header Host $host; |
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 | 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. |
这个错误提示私有仓库支持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 | The push refers to a repository [reg.domain.com/registry] (len: 1) |
这时如果查看nginx的日志发现有411错误,基本上是nginx版本太低造成的,升级nginx的相应模块或版本即可解决问题。