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)
[ 出现提示时,输入两次y ]
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,如需转载请自行联系原作者