一、前言

最新的Nexus 3支持Docker仓库的管理、Maven仓库的管理、Windows开发组件的管理。

环境:
Ubuntu 14.04.4 LTS
docker-engine 17.05.0-ce

注意事项:
修改密码等操作只能在https下执行。

二、安装

1. Docker方式

  • 启动

要求数据和程序分离,开机自启动

# mkdir /data/nexus && chown -R 200 /data/nexus
# mkdir /temp/nexus && chown -R 200 /temp/nexus
# docker run -d --restart=always \
 -p 8081:8081 -p 8082:8082 -p 8443:8443 -p 9082:9082 \
 --name nexus \
 -v /data/nexus/home:/nexus-data \
 -v /data/nexus/data:/nexus-data/blobs \
 -v /data/nexus/conf:/nexus-data/etc \
 -v /temp/nexus/log:/nexus-data/log \
 -v /temp/nexus/tmp:/nexus-data/tmp \
 sonatype/nexus3 

DOCKER_OPTS是为了让jenkins的Docker build step plugin访问
默认用户名密码: admin / admin123

  • 查看Log
# docker logs -f nexus
  • 登录进 nexus docker
# docker exec -i -t nexus /bin/bash

2. 安装包方式

  • 下载安装

登录服务器,执行以下命令

# cd /opt
# wget https://download.sonatype.com/nexus/3/nexus-3.2.0-01-unix.tar.gz
# tar zxvf nexus-3.2.0-01-unix.tar.gz
ln -s nexus-3.2.0-01 nexus

解压后,在当前目录中除了nexus-3.2.0-01还有一个sonatyoe-work目录,用户存放仓库数据的,可根据需要将其改为其他路径,或使用软链接的方式。

# useradd -r nexus –shell /bin/bash
# chown -hR nexus:nexus /opt/nexus
  • 修改分离数据存储路径

编辑nexus-3.2.0-01/bin/nexus.vmoptions文件。
我们只需要改下日志存放路径、数据存放路径以及临时存放路径即可,分别对应着以下属性:

-XX:LogFile=/data/nexus-data/nexus3/log/jvm.log
-Dkaraf.data=/data/nexus-data/nexus3
-Djava.io.tmpdir=/data/nexus-datanexus3/tmp
  • 以非root运行,这步有问题,先跳过

编辑/opt/nexus-3.2.0-01/bin/nexus.rc,添加以下内容即可:

run_as_user="nexus"
  • 最后启动nexus:
# /opt/nexus-3.2.0-01/bin/nexus start

三、配置

1. 使能SSL

要想能远程push、pull,必须让nexus支持ssl。

  • 容器开启监听ssl协议端口

编辑/data/nexus-data/nexus3/etc/nexus.properties

# Jetty section
# application-port=8081
**application-port-ssl=8443**
# application-host=0.0.0.0
# nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml
**nexus-args=${jetty.etc}/jetty.xml,${jetty.etc}/jetty-http.xml,${jetty.etc}/jetty-requestlog.xml,**/data/nexus-data/nexus3/etc/jetty-https.xml**,${jetty.etc}/jetty-http-redirect-to-https.xml**
# nexus-context-path=/${NEXUS_CONTEXT}
**ssl.etc=/opt/sonatype/sonatype-work/nexus3/etc/ssl**                                                                                                                              

# Nexus section
# nexus-edition=nexus-pro-edition
# nexus-features=\
#  nexus-pro-feature 
  • 生成自签名证书
# cd /data/nexus-data/nexus3/etc
# mkdir ssl
# cd ssl
# keytool -genkeypair -keystore keystore.jks -storepass **nexus3** -keypass **nexus3** -alias example.com -keyalg RSA -keysize 2048 -validity 5000 -dname "CN=*.example.com, OU=Sonatype, O=Sonatype, L=Unspecified, ST=Unspecified, C=US" -ext "SAN=IP:192.168.1.2,IP:192.168.1.3"
  • 修改jetty-https.xml

如采用Docker方式运行,则在docker的bash内运行

# cp /opt/sonatype/nexus/etc/jetty/jetty-https.xml /opt/sonatype/sonatype-work/nexus3/etc/

在docker的bash内编辑
/opt/sonatype/sonatype-work/nexus3/etc/jetty-https.xml
或在docker的host机器上编辑
/data/nexus-data/nexus3/etc/jetty-https.xml

    <Set name="KeyStorePath"><Property name="ssl.etc"/>/keystore.jks</Set>
    <Set name="KeyStorePassword">nexus3</Set>
    <Set name="KeyManagerPassword">nexus3</Set>
    <Set name="TrustStorePath"><Property name="ssl.etc"/>/keystore.jks</Set>
    <Set name="TrustStorePassword">nexus3</Set>  
  • docker 运行的主机上新增或修改/etc/docker/daemon.json
{ 
    "insecure-registries":["192.168.1.2:9082","192.168.1.3:9082"] 
}

然后重启docker服务

service docker  restart 
  • 验证
docker login your-nexus-ip:port

输入nexus的登录账号,
提示Login Succeeded表示成功

四、使用

1. 创建Docker私有仓库

  • 通过浏览器访问Nexus

    http://服务器IP:8081

  • 点击右上角进行登录

    初始用户名和密码为:admin/admin123

  • 点击设置界面,选择Repositories,点击Create repository,如下图所示:

    这里写图片描述

  • 选择仓库类型

    这里Docker有三种类型,分别是group、hosted、proxy。这里选择docker(hosted),如下图:
    这里写图片描述

  • 配置仓库

    首先必须为该仓库指定一个唯一的名称,然后是HTTP的端口,最后是docker的api与该仓库进行交互,如下图:
    这里写图片描述
    注意这个HTTP端口号也比较关键,在上面修改docker服务时指定的参数需要用到,后面与该仓库进行交互也需要用到。
    最后点击下方Create repository完成创建仓库。

2. 创建定制的容器镜像

  • 首先编写一个定制容器镜像脚本。
    # vim Dockerfile
FROM debian 
CMD [“echo”, “hello, docker”] 
  • 创建镜像
# docker build -t="hello-docker"
  • 运行容器测试
# docker run hello-docker
可以看到控制台打印出hello, docker了,证明我们自制的镜像成功。

3. 上传镜像到私服

  • 登录私服仓库

    注意在push上传之前必须要先登录

# docker login 192.168.1.2:9082

此时会出现以下提示:

Error response from daemon: Get https://192.168.1.2:9082/v1/users/: dial tcp 192.168.1.2:9082: getsockopt: connection refused

可能因为服务未完全启动、请等待几分钟

或者提示

Error response from daemon: Get https://192.168.1.2:9082/v1/users/: x509: certificate signed by unknown authority

此时我们需要新增或修改/etc/docker/daemon.json

{ "insecure-registries":["192.168.1.2:9082"]}

然后重启docker服务

service docker  restart 
  • 打标记

在上传镜像之前需要先打一个tag,用于版本标记。格式
docker tag <imageId | imageName> <nexus-hostname>:<repository-port>/<image>:<tag>

# docker tag hello-docker 192.168.1.2:8082/hello-docker:latest
  • 上传镜像
# docker push 192.168.1.2:8082/hello-docker:latest

5. 从私服中下载镜像

# docker pull 192.168.1.2:8082/hello-docker
  • 搜索镜像
# docker search 192.168.1.2:8082/hello

6. Docker push证书的设置

# echo -n | openssl s_client -showcerts -connect 192.168.1.2:8443 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' >>  /usr/local/share/ca-certificates/nexus.crt 
# update-ca-certificates
# reboot

参考文档:

  1. http://books.sonatype.com/nexus-book/reference3/docker.html
Logo

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

更多推荐