Hazx小屋 Hazx小屋

搭建Nexus作为Docker的代理缓存

in 服务器相关 阅读: 543 文章转载请注明来源!


  干开发运维这行会经常需要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 proxyHTTPS proxyHosts 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
WeChat Pay

微信打赏

Alipay

支付宝打赏

文章二维码

扫描二维码,在手机上阅读!

linuxdockercentos7nexus
最后由Hazx修改于2020-02-20 02:27
发表新评论
博客系统已萌萌哒运行了
© 2020 Hazx. Theme by Jrotty.
前篇 后篇
雷姆
拉姆