系统环境准备
centos7
[root@docker-130 etc]# docker -v
Docker version 1.9.1, build a34a1d5
nginx 版本需要1.7.5以后的,因为需要一个add_header功能,我这里用的1.9
registry 2.1.1
安装部署
192.168.10.130
192.168.10.128
nginx 和 registry都是跑在容器里面 宿主机为 192.168.10.130
首先启动一个registry容器,保证registry功能正常,
docker run -d --restart=always --name registry -p 5000:5000 -v /data/registry/data:/var/lib/registry registry:2.1.1
修改docker配置文件 /etc/sysconfig/docker 在需要从registry服务器下载image的客户端
添加参数
OPTIONS= '--insecure-registry 192.168.10.130:5000',这个参数后面的client试验中可加可不加,服务器需要加
docker pull 和push没有问题,在看后面的
然后启动一个nginx容器,
docker run -d --name nginx --link registry:registry -p 443:443 -v /data/etc:/tmp nginx:1.9
这里使用-v的原因是从官网下载的镜像所起的容器是不让修改内容的,所以可以把需要修改的文件移动到/tmp中,修改好后再cp回去,这里也可以使用docker cp命令
如果不准备为此花钱去购买一个SSL密钥,可以使用自己授权的 SSL key让registry支持HTTPS加密访问。
生成SSL证书只要两行命令,将signdomain的值换成实际域名即可
在nginx容器中执行
signdomain=registry.example.com
openssl req -nodes \
-subj "/C=CN/ST=BeiJing/L=Dongcheng/CN=$signdomain" \
-newkey rsa:4096 -keyout $signdomain.key -out $signdomain.csr
然后再执行
openssl x509 -req -days 3650 -in $signdomain.csr -signkey $signdomain.key -out $signdomain.crt
把生成的key和crt文件配给nginx就可以提供https访问了,只是因为是没有权威认证的自签名证书
创建授权用户,第一次需要加-c参数
#htpasswd -c /etc/nginx/docker-registry.htpasswd sun
New password: Re-type new password: Adding password for user sun
修改nginx.conf
添加
upstream docker-registry {
server 192.168.10.130:5000;
}
修改vhost里的default.conf
server { listen 443; server_name registry.example.com; ##这里如果要用域名,就得在/etc/hosts中添加相应的解析 ssl on; ssl_certificate /etc/ssl/certs/registry.example.com.crt; ssl_certificate_key /etc/ssl/private/registry.example.com.key; proxy_set_header Host $http_host; # required for Docker client sake proxy_set_header X-Real-IP $remote_addr; # pass on real client IP client_max_body_size 0; # disable any limits to avoid HTTP 413 for large image uploads # required to avoid HTTP 411: see Issue #1486 (https://github.com/dotcloud/docker/issues/1486) chunked_transfer_encoding on; add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always; location / { # let Nginx know about our auth file auth_basic "Restricted"; auth_basic_user_file docker-registry.htpasswd; proxy_pass http://docker-registry; proxy_set_header Host $http_host; # required for docker client's sake proxy_set_header X-Real-IP $remote_addr; # pass on real client's IP proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_read_timeout 900; } location /_ping { auth_basic off; proxy_pass http://docker-registry; } location /v2/_ping { auth_basic off; proxy_pass http://docker-registry; } }
修改好后记得重启nginx服务
此时我们在192.168.10.128去访问
curl -i -k https://sun:[email protected]:443/v2/_catalog
HTTP/1.1 200 OK
Server: nginx/1.9.4
Date: Wed, 02 Dec 2015 09:18:36 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 46
Connection: keep-alive
Docker-Distribution-Api-Version: registry/2.0
Docker-Distribution-Api-Version: registry/2.0
{"repositories":["lashou/centos","v2/swarm"]}
然后我们去登录
因为没有权威认证的自签名证书,使用docker longin 访问时会提示下面的错误:
docker pull docker.webmaster.me/centos:centos6
Error: Invalid registry endpoint https://docker.webmaster.me/v1/: Get https://docker.webmaster.me/v1/_ping: x509: certificate signed by unknown authority. If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry docker.webmaster.me` 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/docker.webmaster.me/ca.crt
根据提示把我们之前生的.crt 文件放在/etc/docker/certs.d/docker.webmaster.me/ 下,这里的路径要根据提示写
如果还没有解决这个问题
那我们就需要执行 cat $signdomain.crt >> /etc/pki/tls/certs/ca-bundle.crt
这是正确登录后的返回信息 [root@docker-128 ~]# docker login registry.example.com:443 Username (sun): sun WARNING: login credentials saved in /root/.docker/config.json Login Succeeded
在config.json文件中记载了登录用户的信息
到这里我们做的加密认证功能已经实现了,可是有一个问题,那就是我们还可以通过原来的方式访问registry仓库
这里需要做iptables设置,但是后来我咨询别人,说不需要这样,所以我也没有加。目前先这样