目录
1、搭建私有 registry
服务端创建镜像仓库
客户端推送镜像
镜像导入导出
2、Nginx 代理 registry 仓库
SSL 证书 & https 协议
SSL证书
https协议
SSL 的验证流程
客户端安装 Nginx
使用 openssl 生成CA根证书和根证书key
创建 Nginx 服务证书
配置启动 Nginx
服务端配置 docker
上传镜像
registry 仓库镜像删除
3、Harbor 仓库搭建
Docker-compose
创建 Harbor 服务证书
部署 Harbor
配置 Nginx 代理 Harbor
上传镜像
1、搭建私有 registry
主机名 | ip | 安装服务 | 角色 |
node-10 | 192.168.137.110 | docker | Registry客户端 |
node-11 | 192.168.137.111 | docker,Registry | Registry服务器 |
服务端创建镜像仓库
# 服务端拉取Registry镜像
[root@node-11 ~] docker pull registry
mkdir -p /data/docker/registry
# 启动Registry仓库
docker run -d --name registry1 --restart=always -p 5000:5000 \
-v /data/docker/registry:/var/lib/registry registry
# 查看仓库中的镜像
curl -X GET http://192.168.137.111:5000/v2/_catalog
客户端推送镜像
① 修改images仓库中镜像的名字
在镜像名字前加registry仓库地址和端口, 使之和registry仓库地址匹配, 只有Docker Hub 上的官方镜像可以省略仓库地址和项目名字,因为默认镜像下载地址就是docker hub
# 修改images仓库中镜像的名字
docker tag centos:7 192.168.137.111:5000/centos7:v1
② 客户端添加私有仓库地址:vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.137.111:5000"],
"registry-mirrors": ["https://w0ckwo1v.mirror.aliyuncs.com"]
}
----------------------------------------------------------------
# 重启docker
systemctl restart docker
③ 推送镜像到镜像仓库
docker push 192.168.137.111:5000/centos7:v1
# 查看仓库中的镜像
curl -X GET http://192.168.137.111:5000/v2/_catalog
④ 测试拉取私有仓库镜像
# 删除有原有镜像
docker rmi 192.168.137.111:5000/centos7:v1
# 拉取私有仓库镜像
Docker pull 192.168.137.111:5000/centos7:v1
镜像导入导出
# 导出镜像
docker save -o centos7.tar centos:7
# 删除原有镜像
docker rmi centos:7
# 导入镜像
docker load < centos-7.tar | docker load -i centos-7.tar
2、Nginx 代理 registry 仓库
SSL 证书 & https 协议
SSL证书 | https协议 |
SSL 证书,也称为 SSL 服务器证书,是遵守 SSL 协议的一种数字证书,由全球信任的证书颁发机构 (CA) 验证服务器身份后颁发,将 SSL 证书安装在网站服务器上,可以使用https加密协议访问网站。 ssl证书用来认证服务器真实身份,钓鱼欺诈网站泛滥,用户如何识别网站是钓鱼网站还是安全网站?网站部署全球信任的SSL证书后,浏览器内置安全机制,实时查验证书状态,通过浏览器向用户展示网站认证信息,让用户轻松识别网站真实身份,防止钓鱼网站仿冒。 | https协议可以看成是HTTP+SSL的结合体,https实现网站加密传输,用户通过http协议访问网站时,浏览器和服务器之间是明文传输,这就意味着用户填写的密码、帐号、交易记录等机密信息都是明文,随时可能被泄露、窃取、篡改,被黑客加以利用。网站安装SSL证书后,使用https加密协议访问网站,可激活客户端浏览器到网站服务器之间的"SSL加密通道"(SSL协议),实现高强度双向加密传输,防止传输数据被泄露或篡改。 |
SSL 的验证流程
使用证书认证比我们之前秘钥认证多了一个用户浏览器访问证书颁发机构验证服务器颁发公钥的合法性。浏览器默认集成了证书颁发机构。
证书认证采用非对称加密,公钥和私钥都可以用来加密数据,用另一个解开,公钥加密数据,然后私钥解密的情况被称为加密解密,私钥加密数据,公钥解密一般被称为签名和验证签名
客户端安装 Nginx
主机名 | ip | 安装服务 | 角色 |
node-10 | 192.168.137.110 | docker、Nginx | Registry客户端 |
node-11 | 192.168.137.111 | docker,Registry | Registry服务器 |
# 安装nginx依赖包
yum -y install pcre-devel zlib-devel openssl openssl-devel epel-release
# 安装nginx
yum install -y nginx
使用 openssl 生成CA根证书和根证书key
如果你有经过认证机构认证的证书,则直接使用将证书放入nginx目录下即可。如果没有,则使用openssl创建自签名证书
① 查看ca证书默认配置:cat /etc/pki/tls/openssl.cnf
vim /etc/pki/tls/openssl.cnf
-----------------openssl.cnf---------------------------
req_extensions = v3_req
-----------------openssl.cnf---------------------------
② 创建根证书key
cd /etc/pki/CA/
openssl genrsa -out private/cakey.pem 2048
# 生成根证书
openssl req -new -x509 -key private/cakey.pem -days 3650 -out cacert.pem
req | 证书请求的子命令,请求生成证书 |
x509 | 表示输出证书,X509是通用的证书文件格式 |
days | 证书有效期 |
OpenSSL生成密钥文件的格式就只有PEM和DER两种格式,PEM的是将密钥用base64编码(base64就是一种基于64个可打印字符来表示二进制数据的方法)表示出来的,直接打开你能看到一串的英文字母,DER格式是二进制的密钥文件 |
创建 Nginx 服务证书
[root@node-10 CA] mkdir /etc/pki/CA/ssl
cd /etc/pki/CA/ssl/
openssl genrsa -out nginx.key 2048
① 为nginx web服务器生成证书签署请求
# 为nginx web服务器生成证书签署请求
[root@cong10 ssl] openssl req -new -key nginx.key -out nginx.csr
Common Name一定要是访问nginx的web服务器的域名。这里使用registry.test.com域名访问后端镜像仓库。
② 创建证书序列号文件、证书索引文件:第一次创建的时候需要给予证书序列号
[root@node-10 ssl] touch /etc/pki/CA/{serial,index.txt}
echo 00 > /etc/pki/CA/serial
# 使用私有CA根据请求签发服务端证书
openssl ca -in nginx.csr -keyfile /etc/pki/CA/private/cakey.pem -cert \
/etc/pki/CA/cacert.pem -days 3650 -out nginx.crt
配置启动 Nginx
① 编写nginx配置文件:vim /etc/nginx/nginx.conf
upstream docker-registry {
ip_hash;
server 192.168.137.111:5000;
server 192.168.137.111:5001;
}
server {
listen 80;
listen [::]:80;
server_name registry.test.com;
location / {
return 301 https://$host$request_uri;
}
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /404.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name registry.test.com;
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 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
auth_basic "Registry realm";
auth_basic_user_file /etc/nginx/nginx.htpasswd;
proxy_pass http://docker-registry;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forward-Proto $scheme;
proxy_connect_timeout 900;
proxy_read_timeout 900;
proxy_send_timeout 900;
}
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
② 配置nginx认证
yum -y install httpd-tools
htpasswd -bc /etc/nginx/nginx.htpasswd admin 123456
③ 启动 Nginx
# 启动nginx
systemctl enable nginx
systemctl start nginx
# 查看nginx端口
netstat -antup | grep nginx
④ 配置hosts解析
vim /etc/hosts
192.168.137.110 registry.test.com
⑤ 访问测试
# curl命令访问
curl -k -u admin:123456 https://registry.test.com/v2/_catalog
服务端配置 docker
① 添加hosts解析
[root@node-11 ~] vim /etc/hosts
192.168.137.110 registry.test.com
② 添加registry仓库
[root@node-11 ~] vim /etc/docker/daemon.json
{
"insecure-registries": ["https://registry.test.com"],
"registry-mirrors": ["https://0u0do0ns.mirror.aliyuncs.com"]
}
注意:如果有多个私有仓库,请在insecure-registries列表里使用逗号分隔
③ 重启docker
systemctl restart docker
# 登陆registry仓库
docker login https://registry.test.com
上传镜像
# 给busybox镜像打标签
docker tag busybox registry.test.com/busybox
# 推送镜像
docker push registry.test.com/busybox
# 查看仓库镜像
curl -k -u admin:123456 https://registry.test.com/v2/_catalog
curl -k -u admin:123456 'https://registry.test.com/v2/busybox/tags/list'
registry 仓库镜像删除
# 删除repo
docker exec registry1 rm -rf /var/lib/registry/docker/registry/v2/repositories/centos7
# 清除blob
docker exec registry1 registry garbage-collect /etc/docker/registry/config.yml
# 查看registry仓库镜像
curl -k -u admin:123456 https://registry.test.com/v2/_catalog
3、Harbor 仓库搭建
项目地址:GitHub - goharbor/harbor: An open source trusted cloud native registry project that stores, signs, and scans content.
Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能,具有web管理功能,操作其实是非常简单易行的。
Harbor是一个基于Apache协议的开源软件,主要开发语言为go,harbor本身也是基于docker镜像,使用docker-compose来进行编排部署。
https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-online-installer-v2.6.0.tgz
Docker-compose
项目地址: https://github.com/docker/compose
Compose 是用于定义和运行多容器 Docker 应用程序的工具。通过 Compose,你可以使用 YML 文件来配置应用程序需要的所有服务。然后,使用docker-compose up,就可以从YML 文件配置中创建并启动所有服务。
# Docker-compose下载(新版本docker集成compose,无需安装)
curl -L https://github.com/docker/compose/releases/download/1.29.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 查看docker-compose版本
docker-compose -v
#新版本docker compose使用方法
[root@node-11 ~] docker compose version
创建 Harbor 服务证书
[root@node-10 ssl] mkdir /etc/pki/CA/harbor && cd /etc/pki/CA/harbor
openssl genrsa -out harbor.key 2048
# 为harbor服务器生成证书签署请求
openssl req -new -key harbor.key -out harbor.csr
# 使用私有CA根据请求签发服务端证书
openssl ca -in harbor.csr -keyfile /etc/pki/CA/private/cakey.pem -cert \
/etc/pki/CA/cacert.pem -days 3650 -out harbor.crt
# 拷贝证书到cong12
scp -r /etc/pki/CA/harbor/ 192.168.137.111:/etc/pki/CA
部署 Harbor
① 解压软件包
tar -zxvf harbor-online-installer-v2.6.0.tgz -C /usr/local/
ls /usr/local/harbor/
② 配置文件harbor.yml
cd /usr/local/harbor/
mv harbor.yml.tmpl harbor.yml
vim harbor.yml
--------------------- harbor.yml -----------------------
hostname: 192.168.137.111
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /etc/pki/CA/harbor/harbor.crt
private_key: /etc/pki/CA/harbor/harbor.key
--------------------- harbor.yml -----------------------
③ 安装Harbor仓库
./install.sh
# 查看Harbor依赖的镜像及其健康状况
docker-compose -f docker-compose.yml ps
④ 登录Harbor并创建羡慕:账户为admin ,密码为 Harbor12345,该密码的初始配置在harbor.yml文件中
点击镜像仓库可以看到推送命令,这里包含有docker以及k8s的Helm
配置 Nginx 代理 Harbor
① 添加harbor.conf:[root@node-10 ~] vim /etc/nginx/conf.d/harbor.conf
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name harbor.test.com;
ssl_certificate /etc/pki/CA/harbor/harbor.crt;
ssl_certificate_key /etc/pki/CA/harbor/harbor.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
proxy_pass https://192.168.137.111;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forward-Proto $scheme;
proxy_connect_timeout 900;
proxy_read_timeout 900;
proxy_send_timeout 900;
}
# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
---------------------------------------------
# 重载 nginx
nginx -s reload
② 修改hosts:vim /etc/hosts
192.168.137.110 harbor.test.com
③ 添加harbor仓库:vim /etc/docker/daemon.json
{
"insecure-registries": ["192.168.137.111:5000","https://harbor.test.com"],
"registry-mirrors": ["https://0u0do0ns.mirror.aliyuncs.com"]
}
-----------------------------------------------
# 重启docker
[root@node-10 ~] systemctl restart docker
上传镜像
① 推送镜像
# 登陆harbor
[root@node-10 ~] docker login https://harbor.test.com
# 推送镜像
[root@node-10 ~] docker tag busybox:latest harbor.test.com/docker/busybox:v2
[root@node-10 ~] docker push harbor.test.com/docker/busybox:v2
② 拉取镜像
docker pull harbor.test.com/docker/busybox:v1