1. 背景

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

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


2. 私有仓库有优势:

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

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


3. 环境:

[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相关包

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


 * 切换工作路径至CA目录

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

 

 * 生成根密钥

   [ genrsa ] 为算法

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

   [ 2048 ] 为密钥长度

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


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

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


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

 * 创建ssl目录

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


 * 切换工作路径至SSL目录

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


 * 创建nginx密钥

  [ genrsa ] 为算法

    [ -out ] 指定输出文件名

    [ 2048 ] 为密钥长度

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


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

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


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

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

[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 

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


 * 修改nginx.conf配置

    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

[root@docker nginx]# systemctl restart nginx


8. 安装并配置docker

 * 安装docker

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


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

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


 * 配置hosts

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


 * 启动docker

[root@docker ~]# systemctl start docker


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

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


 * 创建本地镜像存储目录

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


 * 运行容器

     设置容器名称为local_docker_registry

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

     端口映射出5000端口

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

[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 测试

[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证书并重命名

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


 * 创建仓库证书目录

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


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

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

 

 * 配置hosts文件

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


 * curl 测试

[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


 * 注册账户

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

 

* 登陆账户

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


11. 总结



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