一、  研究背景

        公司恰巧需要配置本地私有 Docker 仓库,同时要提供 Cache 功能,代理 DockerHub

        Nexus 3 不仅集成了 maven 、npm 等仓库功能,而且支持 Docker 了

        通过实验,发现 Nexus 3 能够基本满足需求,除了镜像管理能力差点以外(不如 Harbor 直观)

二、  部署步骤

2.1    部署环境

         操作系统:CentOS 7 64 

         Java:1.8.0_171  (Nexus 运行依赖  jdk 环境)

2.2     安装 Nexus 3

         安装比较简单,下载并解压即可

         下载地址:https://www.sonatype.com/download-oss-sonatype  nexus-3.10.0-04-unix.tar.gz

         解压到 /opt 目录下(目录你可以自己换。。。又说了废话)

# tar zxvf nexus-3.10.0-04-unix.tar.gz -C /opt

2.3    配置证书(自签名)

        默认 nexus 没有启用 https ,但 docker 却是启用的,为了统一,需要配置 https 证书

        这里,我们借助 keytool 实现

        第一步: 生成服务端需要配置的认证文件

                      将 IP 地址换成你机器的 IP 地址(为了方便,我这里域名和 IP 都配置的 IP)

                      运行该脚本,会在当前目录生成一个 keystore.jks

#!/bin/bash
NEXUS_DOMAIN=192.168.12.129
NEXUS_IP_ADDRESS=192.168.12.129
PASSWD=Nexus123
keytool -genkeypair -keystore keystore.jks -storepass ${PASSWD}  -keypass ${PASSWD} -alias nexus -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=${NEXUS_DOMAIN}, OU=Nexus, O=Nexus, L=Beijing, ST=Beijing, C=CN" -ext "SAN=IP:${NEXUS_IP_ADDRESS}" -ext "BC=ca:true"

                     将 keystore.jks 放到 nexus ssl 目录,其实不放也没事,方便管理

# cp keystore.jks /opt/nexus-3.10.0-04/etc/ssl/

       第二步: 生成客户端需要的证书

                     在 keystore.jks 所在目录,执行如下命令(密码跟上边保持一致):

# keytool -export -alias nexus -keystore keystore.jks -file keystore.cer -storepass Nexus123
                     会在当前文件夹下生成 keystore.cer 文件(这个以后要导入客户端机器)

       第三步: 配置 Nexus 使用证书,开启 https

# cp /opt/nexus-3.10.0-04/etc/nexus-default.properties /opt/nexus-3.10.0-04/etc/nexus-default.properties.bak  
# vim /opt/nexus-3.10.0-04/etc/nexus-default.properties
## DO NOT EDIT - CUSTOMIZATIONS BELONG IN $data-dir/etc/nexus.properties
##
# Jetty section
application-port-ssl=8443
application-port=8081
application-host=0.0.0.0
nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml,${jetty.etc}/jetty-https.xml,${jetty.etc}/jetty-http-redirect-to-https.xml
nexus-context-path=/

# Nexus section
nexus-edition=nexus-pro-edition
nexus-features=\
 nexus-pro-feature

                     然后,还要配置下 /opt/nexus-3.10.0-04/etc/jetty/jetty-https.xml 

# vim /opt/nexus-3.10.0-04/etc/jetty/jetty-https.xml
 <Set name="KeyStorePath">/opt/nexus-3.10.0-04/etc/ssl/keystore.jks</Set>
    <Set name="KeyStorePassword">Nexus123</Set>
    <Set name="KeyManagerPassword">Nexus123</Set>
    <Set name="TrustStorePath">/opt/nexus-3.10.0-04/etc/ssl/keystore.jks</Set>
    <Set name="TrustStorePassword">Nexus123</Set>
       

       第四步: 启动 Nexus

# /opt/nexus-3.10.0-04/bin/nexus start

                     启动日志可以到这里查看 :/opt/sonatype-work/nexus3/log/nexus.log

                     我们直接去浏览器看看吧!(admin/admin123)

      

                   确实是 https 了,但是没被信任,因为我们是自签名的

      第五步:我们实验下把证书导入浏览器

                   把第二步生成的 keystore.cer 文件导入到浏览器

                   谷歌浏览器:设置-高级-管理证书

             

                   点击导入,选择我们的证书文件,依次执行完成导入即可

                   重启Chrome,重新访问 https://192.168.12.129:8443 (Nexus 地址),

                   发现不提示不安全了,成功!

       

2.4    配置 Docker Registry(私有仓库)

        Repository - Repositories - Create repository - 选择 docker(hosted)

        填一个名称(如 docker-local)

        勾上 HTTPS,填一个端口(如 7709),勾上“Enable Docker V1 API",其他均默认

        点击 Create repository ,创建仓库

2.5    配置 Docker Mirror (镜像代理)         

        Repository - Repositories - Create repository - 选择 docker(proxy)

        填一个名称(如 docker-hub)

        勾上 HTTPS,填一个端口(如 7719)

        去掉 Force basic authentication 勾选,勾上“Enable Docker V1 API"

        填写 Remote storage:我这里写的自己的 DaoCloud 地址, http://cfdd5a36.m.daocloud.io

        Docker Index 选择 "Use Docker Hub",其他均默认

        点击 Create repository ,创建仓库

2.6    配置 Realms(之前没配这步,耽误不少时间)

        Security - Realms,把 Docker Realm 激活

             

2.7    客户端导入证书

        之前我们仅仅尝试了在浏览器导入证书,为了让 Docker 客户端能与仓库正常通信,

        需要客户端导入证书

        以 Centos 7 为例,导入证书分为两步 (Ubuntu 导入证书步骤,请移步文末附录)

        第一步: 将 keystore.cer 复制到 /etc/pki/ca-trust/source/anchors 目录下

        第二步:更新证书信息,执行 # update-ca-trust extract

2.8    配置 Docker Daemon ,使用 Mirror

        编辑  /lib/systemd/system/docker.service

        在 ExecStart=/usr/bin/dockerd  后追加参数 --registry-mirror=https://192.168.12.129:7719

        或者编写 /etc/docker/daemon.json

{"registry-mirrors": ["https://192.168.12.129:7719"]}

        重启 Docker 服务

# systemctl daemon-reload
# systemctl restart docker

2.9    验证 Docker 能否正常与 Nexus Docker 仓库正常通信

        登录私有仓库,用户名密码(admin/admin123)

# docker login 192.168.12.129:7709
      

        Push 镜像到私有仓库

# docker tag ubuntu:12.04  192.168.12.129:7709/library/ubuntu:12.04
# docker push 192.168.12.129:7709/library/ubuntu:12.04
         

        Pull 镜像(通过 Mirror)

# docker pull ubuntu:13.04
      

2.10   最后,我们看下 仓库里是否有我们操作过的镜像吧

       
      

    

    到这里,教程就结束了,配置成功,回家吃饭!

=====

关于 Ubuntu 16.04 导入证书的附加说明

    * Ubuntu 系统下,一般导入的证书格式都是 crt 的,因此,需要首先导出该格式的证书文件

# keytool -importkeystore -srckeystore keystore.jks -destkeystore keystore.p12 -deststoretype PKCS12
# openssl pkcs12 -in keystore.p12 -nokeys -out keystore.crt

    * 将导出的 keystore.crt 导入 Ubuntu 系统

# mkdir /usr/share/ca-certificates/extra
# cp keystore.crt /usr/share/ca-certificates/extra
# dpkg-reconfigure ca-certificates

     

     

      确定,即可(如果还提示不信任,重启一下客户端机器一般可以解决)
======

设置 Nexus 开机自动启动 :

     (注意修改 jdk 和 nexus 路径为你实际使用的路径)

# vim /lib/systemd/system/nexus.service
[Unit]
Description=nexus   
After=network.target         

[Service]    
Type=forking  
LimitNOFILE=65536
Environment="JAVA_HOME=/opt/jdk1.8.0_171" 
ExecStart=/opt/nexus-3.10.0-04/bin/nexus start 
ExecReload=/opt/nexus-3.10.0-04/bin/nexus restart
ExecStop=/opt/nexus-3.10.0-04/bin/nexus stop
PrivateTmp=true    

[Install]    
WantedBy=multi-user.target 
# systemctl enable nexus.service
# systemctl start nexus.service

Nexus 3 安装 Helm 插件:移步这里 https://blog.csdn.net/shida_csdn/article/details/80314674

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐