关于docker私有库的搭建已经在上一篇文章中写了,下面我们直接进入主题。
(以下配置均在私有仓库所在的服务器上)
步骤一: 安装nginx
1.安装nginx 源
rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
2.安装nginx
yum install -y nginx
步骤二:nginx配置80端口代理registry
1.创建配置文件
cd /etc/nginx/conf.d/
touch docker-registry.conf
2.编辑配置文件写入以下内容
upstream docker-registry {
server localhost:5000;
}
server {
listen 80;
server_name 192.168.118.207;
location / {
proxy_pass http://docker-registry;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
这里的配置只要是将对80端口的访问转发到仓库,这里需要注意以下几点
(1)server_name 为你私有库所在服务器的IP或者域名
(2)80端口不能被占用。当然,如果80端口被占用了,你也可以修改成别的没被占用的端口号。
(3)如果你listen 的是80端口,那么server_name 就不能填 localhost,会有冲突,反过来如果server_name 填localhost的话,那么listen除了80端口以外的端口号都可以。
(4)可以删掉server_name 这一行配置,但是会对80端口失效,换其他端口可以。
3 重启nginx使配置生效
nginx -s reload
4.测试nginx
curl :<端口号>/v2/_catalog
此处ip和端口为刚刚配置文件配置的server_name和listen
如果能看到仓库里的数据,说明配置成功。
步骤三: 安装、 配置openssl工具
1.openssl、openssl-devel 安装
yum install -y openssl openssl-devel
2.openssl 配置
OpenSSL工具配置文件openssl.cnf,对于Centos,目录在/etc/pki/tls/中
vim /etc/pli/tls/openssl.cnf
编辑 openssl.cnf ,在[v3_ca]下面添加:subjectAltName = IP:域名|IP:地址,
这里为私有库所在服务器IP地址或域名
例:
[ v3_ca ]
subjectAltName = IP:192.168.130.107
否则后面使用的时候会报以下错误:
x509: cannot validate certificate for because it doesn't contain any IP SANs
步骤四:生成证书
1.可以在任意文件夹中生成证书,但是需要记住路径,后面要用到
cd /etc/ssl/certs/
openssl req -newkey rsa:2048 -nodes -keyout registry-docker.key -x509 -days 3650 -out registry-hook.crt -subj /C=CN/ST=GD/L=GZ/O=Acc/OU=NT/CN=172.10.15.110/[email protected]
这里主要是生成RSA私钥和自签名证书
具体的命令解析自行百度,这里只说下 -subj 部分
-subj : 指定证书信息,如果不加的话会有个交互性的输入信息的过程,如下图
所以 -subj 简化了这个过程,这里/CN=最好是填私有库所在服务器的IP或域名
/C=Country Name
/ST=State or Province Name
/L=Locality Name
/O=Organization Name
/OU=Organizational Unit Name
/CN=Common Name (eg, your name or your server’s hostname)
/emailAddress=emailAddress
执行成功后会生成两个文件
2.将生成的自签名证书追加到系统的证书管理文件中
cat ./registry-docker.crt >> /etc/pki/tls/certs/ca-bundle.crt
否则后面push和login和pull时会报如下错误:
Get https:///v2/: x509: certificate signed by unknown authority
步骤五 :nginx 中配置 ssl
1.配置
vim /etc/nginx/conf.d/docker-registry.conf
编辑之前新建的nginx配置文件,将之前的内容修改成以下内容
upstream docker-registry {
server localhost:5000;
}
server {
listen 80;
server_name ;
location / {
return 301 https://$host$request_uri;
}
}
server {
listen 443;
server_name ;
client_max_body_size 3000m;
# SSL
ssl on;
ssl_certificate /etc/ssl/certs/registry-hook.crt;
ssl_certificate_key /etc/ssl/certs/registry-hook.key;
# To add basic authentication to v2 use auth_basic
#auth_basic "Please Auth First";
#auth_basic_user_file /etc/ssl/certs/docker_registry.password;
location / {
proxy_pass http://docker-registry;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
}
}
第一个server是将匹配 server_name 指定的IP/域名的80端口的请求全重定向到第二个server上,即将该IP/域名下所有http协议的请求重定向到https协议上(既是屏蔽了http协议)。
第二个server是监听 server_name 指定的IP/域名的443端口(既是https协议)的请求,重定向到到私有库。
开启ssl验证
ssl on ;
指定私钥和证书 (之前生成的)
ssl_certificate /etc/ssl/certs/registry-hook.crt;
ssl_certificate_key /etc/ssl/certs/registry-hook.key;
开启使用“HTTP基本认证”(HTTP Basic Authentication)协议的用户名密码验证,这一块是下个步骤准备做的事情,先注释了。
#To add basic authentication to v2 use auth_basic
#auth_basic “Please Auth First”;
#auth_basic_user_file /usr/local/nginx/auth/htpasswd.txt;
配置好后重启 nginx ,使配置文件生效
nginx -s reload
重启 docker 和私有库容器 ,不重启可能加载私钥失败
systemctl restart docker
docker start <私有库容器ID或容器名>
2.测试
tag命令时直接指定我们配置好的ip和端口号,push成功则我们配置没问题。
步骤六:使用HTTP协议的用户名密码验证
1.安装htpasswd
yum install -y htpasswd
2.生成密码文件
htpasswd -bcd /etc/ssl/certs/docker_registry.password username passwd
上面这个命令是生成密码文件并添加一个用户和密码
-c 创建文件
-b 直接在命令后输入账号和密码,而不需要交互式的输入
-d 采用CRYPT算法对密码进行加密
路径、文件名 、username 和passwd随你指定,但是要记住,后面用得到。
如果还需要添加用户名密码的话
htpasswd -b /etc/ssl/certs/docker_registry.passord newusername newpasswd
该命令对于已有的用户名会update 密码。
3.nginx配置auth_basic
vim /etc/nginx/conf.d/docker-registry.conf
把之前注释了的auth_basic两行代码释放出来
# To add basic authentication to v2 use auth_basic
auth_basic "Please Auth First";
auth_basic_user_file /etc/ssl/certs/docker_registry.password;
这里auth_basic_user_file 为我们刚创建的密码文件路径
保存后 重启下 nginx 使配置生效
nginx -s reload
4.测试
直接push,失败 ,提示no basic auth credentials
然后我们用我们创建的用户名和密码登录
docker login ip
用 --username 和–password 可以省略交互式的用户名密码输入过程
登录成功后我们再push
push 成功!
至此,nginx 代理,ssl验证,HTTP基本认证协议的用户名密码验证配置结束!!