【nexus】用nexus3.x 官方镜像搭建docker私有镜像仓库

一、说明

用nexus搭建docker私有镜像仓库,我们可以去官网下载nexus安装包安装,然后做安装配置。

【nexus】用nexus3.5搭建docker私有仓库

https://www.jianshu.com/p/7a7db54a538f

从nexus3.x开始,我们的另一个选择是拉nexus的镜像,用容器运行nexus服务。


二、实验环境

操作系统: CentOS7.5 Minimal

nexusServer   192.168.1.106

dockerClient    192.168.1.104


三、 安装docker

在nexusServer 和dockerClient  服务器

关闭selinux

# setenforce 0

# sed  -i  's/^SELINUX=.*/SELINUX=permissive/g'  /etc/selinux/config


安装docker

 # yum -y install  yum-utils device-mapper-persistent-data lvm2

# yum-config-manager   --add-repo    https://download.docker.com/linux/centos/docker-ce.repo

# yum list docker-ce  --showduplicates| sort  -r 

#  yum -y install docker-ce-18.06.0.ce  

# systemctl  start docker 

# systemctl  status docker 

# systemctl  enable  docker 

# docker version 


四、拉取镜像,运行nexus服务

在nexusServer 服务器

# docker pull sonatype/nexus3:3.16.0

# docker images


#  mkdir /opt/nexus-data 

# chown -R  200  /opt/nexus-data

注:容器中nexus的默认运行用户是nexus,uid和gid为200

# docker run -it --rm sonatype/nexus3:3.5.2 cat /etc/passwd

为什么需要提前创建目录并更改属主属组呢?

因为容器中nexus进程是普通用户nexus启动的,不是root,普通用户无法再宿主机上创建目录,如果目录属主不是nexus用户(或者映射在宿主的用户id),那么这个进程就没有写入权限。


用命令行形式运行nexus容器

#  docker run -d  \

--restart=always \

--name nexus \

--ulimit nofile=65536:65536 \

 -p 192.168.1.106:8081:8081 \

 -v /opt/nexus-data:/nexus-data \

sonatype/nexus3:3.16.0

# docker logs   -f  nexus

# docker  ps  -a 

# ss  -tan 


浏览器访问: http:192.168.1.106:8081


五,创建一个docker仓库

浏览器访问: http:192.168.1.106:8081

默认登录用户密码:admin/admin123

官方镜像搭建的nexus,不支持https,仓库端口只能选择http,否则服务异常


我们创建了一个名为 test的镜像仓库,仓库端口为 2019,协议为http,不是https!



重启nexus服务,开放2019端口


# docker stop nexus 

# docker rm nexus  


#  docker run -d  \

--restart=always \

--name nexus \

--ulimit nofile=65536:65536 \

 -p 192.168.1.106:8081:8081 \

 -p 192.168.1.106:2019:2019 \

 -v /opt/nexus-data:/nexus-data \

sonatype/nexus3:3.16.0


# docker ps -a

# ss  -tan 



服务端启动方式改进,将nexus注册成系统服务

编写unit文件

# vim /etc/systemd/system/nexus.service

####################################################

[Unit]

Description=Nexus

Documentation=https://www.sonatype.com

After=network-online.target  docker.service

Requires=docker.service

[Service]

ExecStartPre=-/usr/bin/docker rm -f nexus

ExecStart=/usr/bin/docker run \

--name nexus \

--ulimit nofile=65536:65536 \

-p 192.168.1.106:8081:8081 \

-p 192.168.1.106:2019:2019 \

-v /opt/nexus-data:/nexus-data \

sonatype/nexus3:3.16.0

ExecStop=/usr/bin/docker stop nexus

LimitNOFILE=65535

Restart=on-failure

StartLimitBurst=3

StartLimitInterval=60s

[Install]

WantedBy=multi-user.target

#####################################################

停止和删除命令行启动的nexus服务

# docker stop nexus

# docker rm nexus


用systemd启动服务

# systemctl daemon-reload

#  systemctl start  nexus 

#  systemctl enable nexus 

#  systemctl status nexus 

六、客户端测试


测试服务端端口连通性

# echo > /dev/tcp/192.168.1.106/8081

# echo > /dev/tcp/192.168.1.106/2019


# curl -I http://192.168.1.106:8081

# curl -I  http://192.168.1.106:2019

在nexusClient客户端登录仓仓库

#  docker  login  http://192.68.1.106:2019  -u admin  -p "admin123"

# cat /root/.docker/config.json

nexsu仓库开的是http,dockr 要走https,怎么解决?


添加仓库信任

# vim /usr/lib/systemd/system/docker.service 

#######################################################

ExecStart=/usr/bin/dockerd   --insecure-registry 192.168.1.106:2019

########################################################


systemctl daemon-reload

# systemctl restart docker  


#  docker  login  192.168.1.106:2019  -u admin  -p "admin123"

#  docker  login  http://192.168.1.106:2019  -u admin  -p "admin123"


测试推送一个镜像

# docker pull busybox:latest

# docker tag busybox:latest 192.168.1.106:2019/busybox:v1

# docker push 192.168.1.106:2019/busybox:v1



七、改nexus仓库的http为https

前面我们用docker容器搭建nexus服务,创建了一个名为 test的镜像仓库,仓库端口为 2019,协议为http,不是https。

nexsu仓库开的是http,dockr 要走https,我们是通过在客户端添加仓库信任解决的。

那么,有没有更符合最佳实践的方式呢?有!用nexus-https镜像,nexus官方镜像的改进版。

Sonatype Nexus Repository Manager 3 with HTTPS support, based on CentOS

bradbeck/nexus-https

https://hub.docker.com/r/bradbeck/nexus-https

https://github.com/bradbeck/nexus-https



在nexusServer 服务器

#  docker  stop nexus 

# docker rm  nexus  

# rm  -rf  /opt/nexus-data/*


# docker pull bradbeck/nexus-https

# docker images


用nexus-https镜像起一个容器,获取配置https所需的配置文件

# docker run -it  --name  nexus-https   --rm bradbeck/nexus-https:latest bash

对nexusServer服务器,另开一个Xshell窗口

# docker  ps -a 

可以看到,起了一容器ID为 2f3bbae29dd3 的容器,当然,你起的容器ID肯定不同,灵活应变。


从容器中拷贝文件

# docker cp 2f3bbae29dd3:/opt/sonatype/nexus/etc/jetty/jetty-https.xml ./

或者你可以使用一行式:

#  docker exec -it   nexus-https  cat  /opt/sonatype/nexus/etc/jetty/jetty-https.xml  >  jetty-https.xml

创建容器服务相关目录

# mkdir /opt/nexus-data

# mkdir /opt/nexus-ssl

# mkdir /opt/nexus-jetty

#  chown   -R  200   /opt/nexus-data  /opt/nexus-ssl     /opt/nexus-jetty

# cp   jetty-https.xml     /opt/nexus-jetty


生成keystore证书文件


安装keytool证书工具

#  yum  -y install  java

生成证书

# keytool  \

-genkeypair \

-keystore  /opt/nexus-ssl/keystore.jks \

-alias nexus \

-keypass nexus@123 \

-storepass nexus@123 \

-keyalg RSA \

-keysize 2048 \

-validity 5000 \

-dname "CN=*.test.com,OU=TEST,O=TEST,L=Shenzhen,ST=Guangdong,C=CN" \

-ext "SAN=IP:192.168.1.106"  \

-ext "BC=ca:true"

# ll /opt/nexus-ssl/

# keytool -list -v -storepass "nexus@123" -keystore /opt/nexus-ssl/keystore.jks


修改配置文件中证书默认密码

# sed   -i   's/password/nexus@123/g'   /opt/nexus-jetty/jetty-https.xml

用nexus-https镜像启动nexus容器


# docker run -d \

--restart=always \

--name nexus \

--ulimit nofile=65536:65536 \

-p 192.168.1.106:8081:8081 \

-p 192.168.1.106:8443:8443 \

-v /opt/nexus-data:/nexus-data \

-v /opt/nexus-ssl:/opt/sonatype/nexus/etc/ssl/ \

-v /opt/nexus-jetty/jetty-https.xml:/opt/sonatype/nexus/etc/jetty/jetty-https.xml \

bradbeck/nexus-https:latest


# docker  ps -a 

# ss -tan  


浏览器访问

https:192.168.1.106:8443

http://192.168.1.106:8081

果不用http,那么启动容器的时候,不映射http的8081端口到宿主机。

默认登录用户密码:admin/admin123


我们创建了一个名为 test的镜像仓库,仓库端口为 2019,协议为https,不是http!



重启nexus服务,开放2019端口

# docker stop nexus 

# docker rm nexus  


# docker run -d \

--restart=always \

--name nexus \

--ulimit nofile=65536:65536 \

-p 192.168.1.106:8443:8443 \

-p 192.168.1.106:2019:2019 \

-v /opt/nexus-data:/nexus-data \

-v /opt/nexus-ssl:/opt/sonatype/nexus/etc/ssl/ \

-v /opt/nexus-jetty/jetty-https.xml:/opt/sonatype/nexus/etc/jetty/jetty-https.xml \

bradbeck/nexus-https:latest


# docker stop nexus 

# docker rm nexus  

服务端启动方式改进,将nexus注册成系统服务

编写unit文件

# vim /etc/systemd/system/nexus.service

####################################################

[Unit]

Description=Nexus

Documentation=https://www.sonatype.com

After=network-online.target  docker.service

Requires=docker.service

[Service]

ExecStartPre=-/usr/bin/docker rm -f nexus

ExecStart=/usr/bin/docker run \

--name nexus \

--ulimit nofile=65536:65536 \

-p 192.168.1.106:8443:8443 \

-p 192.168.1.106:2019:2019 \

-v /opt/nexus-data:/nexus-data \

-v /opt/nexus-ssl:/opt/sonatype/nexus/etc/ssl/ \

-v /opt/nexus-jetty/jetty-https.xml:/opt/sonatype/nexus/etc/jetty/jetty-https.xml \

bradbeck/nexus-https:latest

ExecStop=/usr/bin/docker stop nexus

LimitNOFILE=65535

Restart=on-failure

StartLimitBurst=3

StartLimitInterval=60s

[Install]

WantedBy=multi-user.target

#####################################################

停止和删除命令行启动的nexus服务

# docker stop nexus

# docker rm nexus


用systemd启动服务

# systemctl daemon-reload

#  systemctl start  nexus 

#  systemctl enable nexus


# docker  logs  -f nexus 

#  systemctl status nexus 


八、客户端测试

在dockerClient服务器

测试服务端端口连通性

# echo > /dev/tcp/192.168.1.106/8443

# echo > /dev/tcp/192.168.1.106/2019

# curl  -I    -k  https://192.168.1.106:8443

# curl  -I   -k  https://192.168.1.106:2019


在nexusClient客户端登录仓库

# docker login 192.168.1.106:2019 -u admin -p "admin123"


获取nexus服务端证书


# yum  -y install  java

# keytool -printcert  -sslserver  192.168.1.106:2019  -v

# keytool  -printcert  -sslserver  192.168.1.106:2019  -rfc



#  keytool  -printcert  -sslserver  192.168.1.106:2019  -rfc  >   /etc/pki/ca-trust/source/anchors/nexus.crt

# cat   /etc/pki/ca-trust/source/anchors/nexus.crt

刷新操作系统认证,重启docker


# update-ca-trust

# systemctl restart docker


# docker login 192.168.1.106:2019 -u admin -p "admin123"

# docker login https://192.168.1.106:2019 -u admin -p "admin123"

# cat /root/.docker/config.json



测试推送一个镜像

# docker pull busybox:latest

# docker tag busybox:latest 192.168.1.106:2019/busybox:v1

# docker push 192.168.1.106:2019/busybox:v1



九、参考

sonatype/docker-nexus3

https://hub.docker.com/r/sonatype/docker-nexus3

https://github.com/sonatype/docker-nexus3


nexus3.x docker镜像仓库及仓库代理配置

https://segmentfault.com/a/1190000015629878


sonatype nexus docker volume error

https://stackoverflow.com/questions/36405434/sonatype-nexus-docker-volume-error


Docker — 从入门到实践

https://yeasy.gitbooks.io/docker_practice


Understanding how uid and gid work in Docker containers

https://medium.com/@mccode/understanding-how-uid-and-gid-work-in-docker-containers-c37a01d01cf


bradbeck/nexus-https

https://hub.docker.com/r/bradbeck/nexus-https

https://github.com/bradbeck/nexus-https

Using Self-Signed Certificates with Nexus Repository Manager and Docker Daemon

https://support.sonatype.com/hc/en-us/articles/217542177-Using-Self-Signed-Certificates-with-Nexus-Repository-Manager-and-Docker-Daemon

Transport Layer Security (TLS) Self-Signed Certificates

https://support.sonatype.com/hc/en-us/articles/213465768-SSL-Certificate-Guide


Nexus Repository Manager 3 using SSL Unreachable by browsers or Docker

https://stackoverflow.com/questions/53183851/nexus-repository-manager-3-using-ssl-unreachable-by-browsers-or-docker

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容