在docker容器模式下搭建nexus3搭建docker私有仓库库

一、环境准备

#1.nexus3容器版
sonatype/nexus3
#2.nginx容器版
nginx
#从官方下载以上工具并安装docker-compose部署
#3.docker20.10.7版本

二、客户端使用操作

#1.客户端主机操作
echo "192.168.0.210 mydocker.io" |tee -a /etc/hosts
mkdir -p /etc/docker/certs.d/mydocker.io
#在(192.168.0.210)拷贝root.crt至客户端
scp -r /home/nexus3-nginx/conf.d/ssl/mydocker.io.crt 客户端IP:/etc/docker/certs.d/mydocker.io/
#2.客户端使用
#用户是在nexus3中创建
#登录
docker login -u autumner -p 1234qwer mydocker.io
#打标签
docker tag image:label mydocker.io/image:label
#推送
docker push mydocker.io/image:label
#拉取
docker pull mydocker.io/image:label
#注:
#因客户端不具备上网功能所以不能直接进行docker search image搜索,只能通过代理远程拉取,具体操作
docker pull mydocker.io/image:label

三、docker私库配置操作

3.1.nexus3准备工作

#1.docker-compose启动nexus3
vim docker-compose.yml
version: '3.1'

services: 
  nexus: 
    restart: always
    image: sonatype/nexus3
    container_name: nexus3
    ports: 
      - 80:8081

    volumes: 
      - nexus-data:/nexus-data


 
volumes: 
  nexus-data: 
#2.启动nexus3
docker-compose -f docker-compose.yml up -d
#停止
docker-compose -f docker-compose.yml down
#3.浏览器访问nexus3
http://192.168.0.210
#修改admin用户密码
#进入nexus3容器查看默认密码
docker exec -it nexus3 sh
sh-4.4$ cat /opt/sonatype/sonatype-work/admin.password
#然后在浏览器进行admin用户密码修改

3.2.blob存储创建

#浏览器
http://192.168.0.210 用户名:admin 密码:1234qwer点击配置
Repository-Blob Stores-Create blob store-Name("docker-blob")-Create blob store
#定义一个Name,其它内容会自动补全

3.3.创建hosted类型Docker仓库

Repository-Repositories-Create repository-docker(hosted)
Name: 定义一个名称docker-local
Online: 勾选。这个开关可以设置这个Docker repo是在线还是离线。
Repository Connectors(HTTP 8083):连接器允许docker客户端直接连接到docker仓库,并实现一些请求操作,如docker pull, docker push, API查询等。但这个连接器并不是一定需要配置的,尤其是我们后面会用group类型的docker仓库来聚合它。
                      把HTTP这里勾选上,然后设置端口为8083
Allow anonymous docker pull:不勾选。这样的话就不允许匿名访问了,执行docker pull或 docker push之前,都要先登录:docker login
Docker Registry API Support:Docker registry默认使用的是API v2, 但是为了兼容性,我们可以勾选启用API v1。
Storage-Blob store:下拉选择前面创建好的专用blob:docker-blob
Hosted-Delpoyment policy:开发环境允许运行重复发布,因此选择Allow redeploy。
最后保存

3.4.创建proxy类型Docker仓库

Repository-Repositories-Create repository-docker(proxy)
#proxy类型仓库,可以帮助我们访问不能直接到达的网络,如官方的dockerhub镜像库。
Name: docker-proxy
Repository Connectors: 不设置。
Docker Registry API Support-Enable Docker V1 API:勾选

Proxy-
    Remote Storage: docker hub的proxy,这里填写: https://registry-1.docker.io 这个是官方默认的一个链接
    Docker Index: Use Docker Hub
    Storage:idocker-hub
Auto blocking enabled:勾选
Storage-Blob store:下拉选择前面创建好的专用blob:docker-blob
Negative Cache-Not found cache enabled:勾选
最后保存

3.5.创建group类型Docker仓库

Repository-Repositories-Create repository-docker(group)
#group类型的docker仓库,是一个聚合类型的仓库。将前面创建的2个仓库聚合成一个URL对外提供服务,可以屏蔽后端的差异性,实现类似透明代理的功能。
name:docker-group
Repository Connectors(8082):启用了一个监听在8082端口的http连接器;
                把HTTP这里勾选上,然后设置端口为8082
Docker Registry API Support-Enable Docker V1 API:勾选
Storage-Blob store:下拉选择前面创建好的专用blob:docker-blob
group : 将左边可选的2个仓库,添加到右边的members下。
最后保存

3.6.创建docker私库用户

#1.设置nexus3的web端管理权限
Security-Realms-右侧
把Docker Bearer Token Realm 增加到Active中然后点击Save保存
#2.创建规则
Security-Roles-右侧Create role
Role ID: nx-docker-role #必填,nx-docker-role自定义的
Role name: nx-docker-hub-role #必填,nx-docker-hub-role自定义的
Privileges:
    把Filter中的
    nx-repository-admin-docker-docker-group-*
    nx-repository-admin-docker-docker-local-*
    nx-repository-admin-docker-docker-proxy-*
    nx-repository-view-docker-*-*
    增加到Given中然后点击Save保存
#3.创建docker用户
Security-Users-右侧Create local user
ID: 必填
First name: 必填
last name: 必填
email: 必填
Password: 必填
confirm password: 必填
Status:Active
Roles:
    nx-anonymous
    nx-docker-hub-role增加到Granted中
然后点击Create local user保存完成
    **最后docker的3个私有仓库建立完成,但在推送和拉取时需要各自地址操作,使用起来非常不方便,解决办法我们可以通过nginx代理来实现**

四、nginx代理访问Docker私有仓库

4.1.nginx安装

#本例通过容器模式部署nginx,直接通过dockerhub拉取镜像

4.2.证书生成

#通过工具一键生成证书
#创建配置文件和日志目录
mkdir -p /home/nexus3-nginx/conf.d/ssl
mkdir -p /home/nexus3-nginx/logs
cd /home/nexus3-nginx/conf.d/ssl
#一键生成证书 
./gencer.sh
    [root@nexus-nfs ssl]# ./gencer.sh 
    Enter your domain [www.example.com]:mydocker.io
    Enter your serverName [nginx]:mydocker.io
    Create server key...
    Generating RSA private key, 1024 bit long modulus
    ............++++++

附件:gencer.sh源码

#!/bin/sh

# create self-signed server certificate:

read -p "Enter your domain [www.example.com]:" DOMAIN
read -p "Enter your serverName [nginx]:" SERVERNAME

echo "Create server key..."

openssl genrsa -des3 -out $SERVERNAME.key 2048

echo "Create server certificate signing request..."

SUBJECT="/C=CN/ST=TJ/L=TJ/O=AUTUMNER/OU=ECW/CN=$DOMAIN"

openssl req -new -subj $SUBJECT -key $SERVERNAME.key -out $SERVERNAME.csr

echo "Remove password..."

mv $SERVERNAME.key $SERVERNAME.origin.key
openssl rsa -in $SERVERNAME.origin.key -out $SERVERNAME.key

echo "Sign SSL certificate..."

openssl x509 -req -days 3650 -in $SERVERNAME.csr -signkey $SERVERNAME.key -out $SERVERNAME.crt

openssl x509 -in $SERVERNAME.crt -out $SERVERNAME.cer -outform der

openssl x509 -inform der -in $SERVERNAME.cer -out $SERVERNAME.pem

4.3.nginx配置

#在主机/home/nexus3-nginx/conf.d目录创建dockerhub.conf
cd /home/nexus3-nginx/conf.d
vim dockerhub.conf #粘贴以下内容
#ip地址换成本服务器主机ip

upstream nexus_docker_get {
    server 192.168.0.210:8082;
}
 
upstream nexus_docker_put {
    server 192.168.0.210:8083;
}
server {
    listen 80;
    listen 443 ssl;
    server_name mydocker.io;
    access_log /var/log/nginx/mydocker.io.log;
    # 证书
    ssl_certificate /etc/nginx/conf.d/ssl/mydocker.io.crt; # 证书路径根据上面生成的来定
    ssl_certificate_key /etc/nginx/conf.d/ssl/mydocker.io.key;
    ssl_protocols TLSv1.1 TLSv1.2;
    ssl_ciphers '!aNULL:kECDH+AESGCM:ECDH+AESGCM:RSA+AESGCM:kECDH+AES:ECDH+AES:RSA+AES:';
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    # 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_put";
    # 当请求是GET,也就是拉取镜像的时候,这里改为拉取代理,如此便解决了拉取和推送的端口统一
    if ( $request_method ~* 'GET') {
        set $upstream "nexus_docker_get";
    }
    # 只有本地仓库才支持搜索,所以将搜索请求转发到本地仓库,否则出现500报错
    if ($request_uri ~ '/search') {
        set $upstream "nexus_docker_put"; 
    }
    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;
    }
}

4.4.nginx启动

#编辑nexus3和nginx的docker-compose文件
#停止nexus3的容器
docker-compose -f docker-compose.yml down
#编辑docker-compose.yml文件
version: '3.1'

services: 
  nexus: 
    restart: always
    image: sonatype/nexus3
    container_name: nexus3
    ports: 
      - 80:8081
      - 8082:8082     #开启docker的group类型端口
      - 8083:8083     #开启docker的hosted类型端口
    volumes: 
      - nexus-data:/nexus-data

  dockerhub:              #增加nginx容器
    restart: always
    image: nginx
    container_name: dockernginx
    depends_on: 
      - nexus
    ports: 
      - 443:443          #开启https端口
    volumes: 
      - /home/nexus3-nginx/logs:/var/log/nginx:rw        #挂载日志目录
      - /home/nexus3-nginx/conf.d:/etc/nginx/conf.d:ro   #挂载nginx配置文件和证书
 
volumes: 
  nexus-data: 
 #启动docker-compose   
docker-compose -f docker-compose.yml up -d

五、客户端机验证参考第二章节客户操作

#1.拉取镜像报如下错误
Error response from daemon: Head https://mydocker.io/v2/busybox/manifests/latest: no basic auth credentials
#解决方法
#登录
docker login -u autumner -p 1234abcD mydocker.io
#2.直接搜索镜像报错
 docker search redis
Error response from daemon: Get https://index.docker.io/v1/search?q=redis&n=25: dial tcp: lookup index.docker.io on 219.150.32.132:53: read udp 192.168.0.217:56157->219.150.32.132:53: i/o timeout
#解决方法
docker search mydocker.io/redis #带上mydocker.io标签实现代理下载redis
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容