常用数据仓库简介
目前,市面上支持 Docker 镜像存储的主流数据仓库主要有以下 4 种:
- Docker 官方原生仓库:Docker Registry
- SUSE 团队推出的出的仓库:Portus
- Sonatype 团队推出的老牌仓库 :Nexus3
- VMWare 中国团队推出的企业级仓库:Harbor
这里,我们将选用 Nexus3 作为数据仓库,因为 Nexus3 支持非常多的仓库类型,例如:maven
、docker
、yum
、apt
、npm
、ruby
、gems
、pypi
等
在 Nexus3 支持 3 种 Docker 仓库:
- hosted:本地仓库,同 Docker 官方仓库一样
- proxy:代理仓库,提供代理其他仓库的功能
- group:聚合仓库,将多个仓库组合成一个仓库
安装 Nexus3,配置 Docker 仓库
这里,我们将采用 Docker 的形式安装 Nexu3,这样可以减少很多不必要的麻烦,并且也方便以后的迁移工作
步骤大致如下:
- 创建并赋权相应的数据挂载目录
- 安装 Nexus3,并配置 Docker 仓库
-
创建并赋权相应的数据挂载目录
mkdir -p /opt/nexus/nexus-data && chmod 777 /opt/nexus/nexus-data
注:虽然官方完档中,挂载文件夹赋予的权限是 200,但经过测试,权限只给 200 是会出现问题的,所以,我们直接赋予 777 的权限,从而避免一些不必要的麻烦
-
安装 Nexus3,并配置 Docker 仓库
- 安装 Nexus3
说明:容器的 4 个端口分别对应:docker run -d \ -p 9999:8081 \ -p 10000:10000 \ -p 10010:10010 \ -p 10086:10086 \ -v /opt/nexus/nexus-data:/nexus-data \ --name=nexus \ --restart=always \ --privileged=true \ sonatype/nexus3:3.18.1
9999:8081:Nexus3 UI 界面
10000:10000:Docker 聚合仓库(支持pull
)
10010:10010: Docker 代理仓库 (支持pull
)
10086:10086: Docker 本地仓库(支持pull
、push
) -
配置 Docker 仓库
本地仓库(docker-hosted)
image.png
代理仓库(docker-proxy)
image.png
聚合仓库(docker-group)
image.png
使用 Nginx 反向代理
由于,三种仓库支持的功能都不太完美:
- Docker 本地仓库:支持
pull
和push
,但无法使用代理pull
本地没有的镜像 - Docker 代理仓库:支持
pull
,可以从中央仓库pull
本地没有的镜像,但不能push
- Docker 聚合仓库:支持
pull
,可以从中央仓库pull
本地没有的镜像,虽然是本地仓库和代理仓库的组合,但却不支持push
,因为不知道具体push
到组合中的那个仓库
故使用 Nginx 进行代理:通过请求方式的不同,代理到不同的仓库,从而实现仓库操作上的统一,具体配置如下:
upstream nexus_website {
server 120.79.176.192:9999;
}
upstream nexus_docker_hosted {
server 120.79.176.192:10086;
}
upstream nexus_docker_group {
server 120.79.176.192:10000;
}
server {
listen 80;
server_name registry.cn-shenzhen.idukelu.com;
access_log /var/log/nginx/registry.cn-shenzhen.sekorm.com.log main;
# disable any limits to avoid HTTP 413 for large image uploads
client_max_body_size 0;
# required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
chunked_transfer_encoding on;
# 设置默认使用推送代理
set $upstream "nexus_docker_hosted";
# 当请求是GET,也就是拉取镜像的时候,这里改为拉取代理,如此便解决了拉取和推送的端口统一
if ( $request_method ~* 'GET') {
set $upstream "nexus_docker_group";
}
# 只有本地仓库才支持搜索,所以将搜索请求转发到本地仓库,否则出现500报错
if ($request_uri ~ '/search') {
set $upstream "nexus_docker_hosted";
}
index index.html index.htm index.php;
location / {
proxy_pass http://$upstream;
proxy_set_header Host $host;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
proxy_set_header X-Real-IP $remote_addr;
proxy_buffering off;
proxy_request_buffering off;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto http;
}
}
server {
listen 80;
server_name repo.idukelu.com;
access_log /var/log/nginx/repo.sekorm.com.log main;
index index.html index.htm index.php;
location / {
proxy_pass http://nexus_website;
proxy_set_header Host $host;
client_max_body_size 512m;
proxy_connect_timeout 3600;
proxy_send_timeout 3600;
proxy_read_timeout 3600;
proxy_buffering off;
proxy_request_buffering off;
}
}
到这里,基本上就完成了 Nexus3 的搭建工作和 Nginx 的代理工作
参考:
https://help.sonatype.com/repomanager3
https://github.com/docker/docker-registry
https://zhang.ge/5139.html
网友评论