搭建Nexus作为Docker的代理缓存
干开发运维这行会经常需要pull很多镜像,pull镜像的速度也不理想,并且由于部署应用可能需要同时pull很多相同的镜像,浪费了大量的时间。另一方面,服务器上设置了Docker代理以后如果想改变配置就要重启Docker,从而会影响到业务。所以一个稳定的“代理+缓存”平台就非常必要了。Nexus就可以非常方便的解决这些问题,可以作为代理跳板,同时也可以缓存住已经pull下来的镜像,所有镜像只需要pull一次(latest除外),节省了大量时间。
在开始介绍之前,需要注意以下几点:
- 本篇笔记基于CentOS7系统,并需要Docker,若您还没有安装Docker可以参考:《CentOS7 安装 Docker-CE》
- Nexus除了支持缓存镜像站的镜像,还支持存储自己push的镜像,但本篇笔记不介绍存储自己的镜像(即host类型),您若需要可以自行开启,配置方法大同小异。
- 本篇笔记涉及代理的仓库有Docker Hub、k8s.gcr.io、quay.io三个仓库,并且将Docker Hub和quay.io整合代理成docker.hazx一个域名访问,将k8s.gcr.io代理成k8s.docker.hazx一个域名访问。
- 由于Nexus中配置证书颇为麻烦,本笔记中实例为Nexus全部采用http协议,由Nginx配置SSL证书。证书与私钥请自行准备。
- 所使用的Nexus、Nginx镜像版本可自行改变,但配置可能与本篇笔记内容存在差异。
- 别忘了配置防火墙策略。
准备镜像
docker pull sonatype/nexus3:3.19.1
docker pull nginx:1.16.1
创建Nexus数据目录
mkdir /home/nexus-data
chown -R 200 /home/nexus-data
启动Nexus
在启动前需要明确需求,例如本笔记中我需要2个访问方式(使用2个域名访问,对内部而言就需要2个端口),加上管理面板端口,本次我们需要一共3个端口。除了面板端口8081外,其他端口可以自己随意定,这里我们使用2000和2001。
docker run -d -p 8081:8081 -p 2000:2000 -p 2001:2001 -v /home/nexus-data:/nexus-data --name nexus --restart unless-stopped sonatype/nexus3:3.19.1
查看初始密码
cat /home/nexus-data/admin.password
配置Nexus
在浏览器中访问:IP:8081打开管理面板,用户名admin,初始密码是上一步查到的,登录后修改管理员密码。
配置HTTP和HTTPS代理
请自备梯子。
在 [System] - [HTTP] 选项下,配置 HTTP proxy
、HTTPS proxy
和 Hosts to exclude from HTTP/HTTPS proxy
。
创建存储(Blob)
为了防止缓存数据混杂在一起,建议为缓存代理的所有仓库都单独配置一个存储(Blob)。
在 [Repository] - [Blob Stores] 中为每一种代理仓库创建一个独立存储。输入独立的Name,Path会自动生成。重复操作,分别创建存储:proxy-dockerhub、proxy-k8sgcr、proxy-quayio。由于本篇实例用到了一个整合仓库(Gourp),也需要给它创建一个独立的存储:proxy-group
创建仓库(Repositories)
创建代理仓库(proxy)
在 [Repository] - [Repositories] 中,删除自带的全部仓库。然后创建新仓库,类型为docker (proxy)
。
在 Name
这里填入当前仓库的命名,例如docker-proxy-dockerhub
在 Proxy
- Remote storage
这里,配置DockerHub代理时填入 https://registry-1.docker.io
,配置K8s仓库时填入https://k8s.gcr.io
,配置quay.io仓库时填入https://quay.io
。
在 Proxy
- Docker Index
这里,配置DockerHub代理时选择 Use Docker Hub
,配置其他仓库代理时选择 Use proxy registry(specified above)
。
去掉 Proxy
- Auto blocking enabled
这里的对勾。
在 Storage
- Blob store
这里,为当前配置的代理仓库选择前面创建的存储。
去掉 Negative Cache
- Not found cache enabled
这里的对勾。
重复操作,创建完成3个仓库:docker-proxy-dockerhub、docker-proxy-k8sgcr、docker-proxy-quayio。
创建整合仓库(group)
整合仓库实际上是一个虚拟库,它的作用是整合已存在库,用一个入口对接多个库。例如本实例中,我将要把代理的Docker Hub和quay.io两个仓库整合成一个入口 docker.hazx
。
在 [Repository] - [Repositories] 中创建新仓库,类型为 docker (group)
。
在 Name
这里填入当前仓库的命名,例如docker-proxy-group
在 Repository Connectors
这里,勾选 HTTP
并填入一个未被占用的端口,必须与创建容器时映射的端口号一致。这里我使用2000。
在 Storage
- Blob store
这里选择前面给它创建的存储。
在 Group
- Member repositorles
这里,将需要整合的仓库添加到右边,并按先后顺序排好。这里我需要整合DockerHub和quay.io两个仓库的代理,即docker-proxy-dockerhub和docker-proxy-quayio。
配置独立代理
上面的整合仓库(Group)是将多个仓库整合成一个入口使用,但如果存在仓库中镜像的地址很容易跟其他仓库冲突的情况时,我们就得分多个Group或者将代理仓库(proxy)单独开一个入口出来。本笔记实例中需要将k8s仓库的代理(也就是先前创建的docker-proxy-k8sgcr仓库)单独开一个入口出来使用,这个操作步骤实际上在创建时就可以做。为了方便理解,我单独拿出来说下。
在 [Repository] - [Repositories] 中找到前面创建的docker-proxy-k8sgcr并点进去。在 Repository Connectors
这里,勾选 HTTP
并填入一个未被占用的端口,必须与创建容器时映射的端口号一致。这里我使用2001。保存即可。
配置Docker认证
在 Security
- Realms
选项中,将Docker Bearer Token Realm
添加到右边,保存即可。
至此,我们为Nexus配置了3个仓库的代理缓存,并开了2个入口。但目前这2个入口由于是http的协议,所以还不能直接使用。还需要配置Nginx给入口“套上”证书,转成https协议,并为了便捷使用而绑定上我们指定的域名。
配置Nginx
创建Nginx数据目录
mkdir /home/nexus-nginx-conf
将准备好的SSL证书和私钥拷贝至此目录下。例如本笔记实例中,我准备了自签的ssl.crt和ssl.key,内含域名docker.hazx与k8s.docker.hazx
创建Nginx配置文件
vim /home/nexus-nginx-conf/nexus.conf
填入以下内容:
server {
listen 80;
server_name docker.hazx; # 将域名改成你自己的
client_max_body_size 1024M;
location / {
proxy_pass http://192.168.66.77:2000; # 改成Nexus所在服务器的IP与代理的端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 443 ssl http2;
server_name docker.hazx; # 将域名改成你自己的
client_max_body_size 1024M;
# 将证书和私钥的文件名改成你自己的,目录不要改
ssl_certificate /etc/nginx/conf.d/ssl.crt;
ssl_certificate_key /etc/nginx/conf.d/ssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
location / {
proxy_pass http://192.168.66.77:2000; # 改成Nexus所在服务器的IP与代理的端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 80;
server_name k8s.docker.hazx; # 将域名改成你自己的
client_max_body_size 1024M;
location / {
proxy_pass http://192.168.66.77:2001; # 改成Nexus所在服务器的IP与代理的端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server {
listen 443 ssl http2;
server_name k8s.docker.hazx; # 将域名改成你自己的
client_max_body_size 1024M;
# 将证书和私钥的文件名改成你自己的,目录不要改
ssl_certificate /etc/nginx/conf.d/ssl.crt;
ssl_certificate_key /etc/nginx/conf.d/ssl.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_timeout 10m;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_buffer_size 1400;
location / {
proxy_pass http://192.168.66.77:2001; # 改成Nexus所在服务器的IP与代理的端口
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
注意注释部分的内容区别。前两段配置是对应Nexus 2000端口这个入口的,后两段配置是对应2001端口这个入口的。proxy_pass
这里的IP地址必须是Nexus所在主机的IP,即使俩容器在同一个主机下也不能填localhost和127.0.0.1。
启动Nginx
docker run -d -p 80:80 -p 443:443 -v /home/nexus-nginx-conf:/etc/nginx/conf.d --name nginx --restart unless-stopped nginx:1.16.1
测试一下
curl -k https://docker.hazx
curl -k https://k8s.docker.hazx
如果输出结果中有一句Error 400 Not a Docker request
则说明成功了
至此,Nexus和Nginx的配置部分完毕。Docker镜像代理缓存仓库搭建完毕~ 接下来,怎么使用呢?
Docker添加私有仓库
这里开始介绍的是使用的部分。
在要使用我们自己的镜像代理缓存的服务器上进行如下操作:
添加信任
如果你使用的证书是从正规机构那里买的可信证书,可以跳过这一步。如果是自签的非可信证书则必须要先添加信任。
以域名为文件夹名称创建文件夹
mkdir -p /etc/docker/certs.d/docker.hazx
mkdir -p /etc/docker/certs.d/hazx.docker.hazx
将签发域名的CA证书分别拷贝至这些目录中,并更名为ca.crt。
登录私有仓库
docker login docker.hazx
根据提示输入Nexus的用户名和密码,提示Success即登录成功。接着同样的操作登录k8s.docker.hazx,Nexus开了几个入口(有几个域名)就要登录几次。
下载镜像
在本笔记实例中,我们配置了docker.hazx代理缓存了DockerHub的镜像。如果我们想要pull一个Nginx镜像,原本应该是:
docker pull nginx:1.16.1
要想使用我们自己的Docker代理缓存仓库,在开头加个域名即可:
docker pull docker.hazx/hazx:1.16.1
扫描二维码,在手机上阅读!