Docker--------registry安全认证搭建 [ Https ]

1. 背景

    docker中要使用镜像,一般会从本地、docker Hup公共仓库和其它第三方公共仓库中下载镜像,一般出于安全和外网(墙)资源下载速率的原因考虑企业级上不会轻易使用。那么有没有一种办法可以存储自己的镜像又有安全认证的仓库呢? ----> 企业级环境中搭建自己的安全认证私有仓库。

    由于Docker1.3.X版本之后docker registry所采用https,前章节docker http部属最后docker push/pull会报错提示,需要做特殊处理。


2. 私有仓库有优势:

    一、节省网络带宽,针对于每个镜像不用每个人都去中央仓库上面去下载,只需要从私有仓库中下载即可;

    二、提供镜像资源利用,针对于公司内部使用的镜像,推送到本地的私有仓库中,以供公司内部相关人员使用。


3. 环境:

1
2
3
4
5
6
[root@docker ~] # cat /etc/redhat-release 
CentOS Linux release 7.2.1511 (Core) 
[root@docker ~] # uname -r
3.10.0-327.36.3.el7.x86_64
[root@docker ~] # hostname
docker.lisea.cn


4. 服务器Ip地址

    192.168.60.150


5. 搭建CA,实现加密传输

 * 安装openssl相关包

1
[root@docker ~] # yum install pcre pcre-devel zlib-devel openssl openssl-devel -y


 * 切换工作路径至CA目录

1
[root@docker ~] # cd /etc/pki/CA

 

 * 生成根密钥

   [ genrsa ] 为算法

   [ private/cakey.pem ] 为密钥的生成的位置

   [ 2048 ] 为密钥长度

1
[root@docker CA] # openssl genrsa -out private/cakey.pem 2048


 * 生成根证书,执行命令后依次要输入:国家代码(两个英文字母)、省份、城市、组织、单位、邮箱。

1
[root@docker CA] # openssl req -new -x509 -key private/cakey.pem -out cacert.pem


6. 为nginx生成密钥(在nginx服务器)

 * 创建ssl目录

1
[root@docker CA] # mkdir /etc/pki/CA/ssl


 * 切换工作路径至SSL目录

1
[root@docker CA] # cd /etc/pki/CA/ssl/


 * 创建nginx密钥

  [ genrsa ] 为算法

    [ -out ] 指定输出文件名

    [ 2048 ] 为密钥长度

1
[root@docker ssl] # openssl genrsa -out nginx.key 2048


 * 为nginx生成证书签署请求[A challenge password与An optional company name 直接回车处理]

1
[root@docker ssl] # openssl req -new -key nginx.key -out nginx.csr


 * 私有CA根据请求来签发证书(在CA服务器即docker仓库服务器,需要将请求发送给CA)

   [ 出现提示时,输入两次]

1
2
3
4
[root@docker ssl] # touch /etc/pki/CA/index.txt
[root@docker ssl] # touch /etc/pki/CA/serial
[root@docker ssl] # echo "00" > /etc/pki/CA/serial
[root@docker ssl] # openssl ca -in nginx.csr -out nginx.crt


7. 安装并配置nginx

 * 安装 nginx 

1
[root@docker ssl] # yum install nginx -y


 * 修改nginx.conf配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
     upstream registry {
         server 192.168.60.150:5000;
     }
 
     server {
         listen       443 ssl;
         server_name  docker.lisea.cn
 
         #ssl conf
         ssl on;
         ssl_certificate  /etc/pki/CA/ssl/nginx .crt;
         ssl_certificate_key  /etc/pki/CA/ssl/nginx .key;
         ssl_session_cache shared:SSL:1m;
         ssl_session_timeout 5m;
         ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
         ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
         ssl_prefer_server_ciphers on;
 
         location / {
             proxy_pass http: //registry ;
             proxy_set_header Host $host;
             proxy_set_header X-Forward-FOr $remote_addr;
         }
 
     }


 * 启动或重启nginx

1
[root@docker nginx] # systemctl restart nginx


8. 安装并配置docker

 * 安装docker

1
[root@docker ~] # yum install docker -y


 * 配置docker [ /etc/sysconfig/docker ] 添加内容至 DOCKER_OPTS

1
DOCKER_OPTS= " --insecure-registry docker.lisea.cn --tlsverify --tlscacert /etc/pki/CA/cacert.pem"


 * 配置hosts

1
2
[root@docker ~] # tail -1 /etc/hosts
192.168.60.150 docker.lisea.cn


 * 启动docker

1
[root@docker ~] # systemctl start docker


 * 拉取 registry镜像,例如在daocloud.io/registry这个私有镜像仓库

1
[root@docker ~] # docker pull daocloud.io/registry


 * 创建本地镜像存储目录

1
[root@docker ~] # mkdir /data/local_docker_registry -p


 * 运行容器

     设置容器名称为local_docker_registry

     挂在镜像内docker镜像仓库/var/lib/registry 至本地/data/local_docker_registry目录

     端口映射出5000端口

 --restart=always让其跟随docker启动时启动

1
2
3
4
5
[root@docker ~] # docker run --name local_docker_registry \
--restart=always -d \
- v  /data/local_docker_registry : /var/lib/registry  \
-p 5000:5000 \
daocloud.io /registry


9. 测试仓库是否可用

 * curl 测试

1
2
3
4
5
6
7
8
[root@docker ~] # curl -i -k https://docker.lisea.cn
HTTP /1 .1 200 OK
Server: nginx /1 .10.2
Date: Mon, 12 Jun 2017 21:58:57 GMT
Content-Type: text /plain ; charset=utf-8
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache


10. 客户机操作[ docker机 ]

 * 拷贝ca证书并重命名

1
[root@client~] # scp [email protected]:/etc/kpi/CA/cacert.pem /etc/pki/tls/certs/ca-certificates.crt


 * 创建仓库证书目录

1
[root@docker ~] # mkdir /etc/docker/certs.d/docker.lisea.cn


 * 复制证书并重命名至此仓库证书目录

1
[root@docker ~] # cp /etc/pki/tls/certs/ca-certificates.crt /etc/docker/certs.d/docker.lisea.cn/ca.crt

 

 * 配置hosts文件

1
2
[root@client~] # tail -1 /etc/hosts
192.168.60.150 docker.lisea.cn


 * curl 测试

1
2
3
4
5
6
7
8
[root@client ~] # curl -i -k https://docker.lisea.cn
HTTP /1 .1 200 OK
Server: nginx /1 .10.2
Date: Mon, 12 Jun 2017 22:06:17 GMT
Content-Type: text /plain ; charset=utf-8
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache


 * 注册账户

1
2
[root@docker ~] # docker login -u lisea -p 123456 -e '[email protected]' \
https: //docker .lisea.cn

 

* 登陆账户

1
2
3
4
[root@docker ~] # docker login https://docker.lisea.cn
Username (lisea): lisea
Password: 
Login Succeeded


11. 总结



以需求驱动技术,技术本身没有优略之分,只有业务之分。






      本文转自asd1123509133 51CTO博客,原文链接:http://blog.51cto.com/lisea/1934731,如需转载请自行联系原作者


你可能感兴趣的:(Docker--------registry安全认证搭建 [ Https ])