version: '3.2'
services:
nexus3:
container_name: nexus3
hostname: nexus3
image: sonatype/nexus3:3.14.0
deploy:
resources:
limits:
cpus: '1'
memory: 512M
environment:
- TZ=Asia/Shanghai
volumes:
- /data/docker/nexus3/data:/nexus-data
ports:
- 8081:8081
- 8082:8082
- 8083:8083
restart: always
networks:
- nexus
networks:
nexus:
driver: bridge
以上为nexus3的docker-compose.ymal
docker私有仓库
通过变量设置了时区,将数据盘映射到了本地,开放了8081,8082,8083三个端口,创建了名为nexus的桥接网络
为什么开放三个端口?
8081--web页面访问端口,也是maven依赖下载的端口
8082--docker私库的上传端口
8083--docker私有仓库的group端口
上图可以看到docker的私有仓库和maven的依赖仓库
创建专用的blob
为了仓库数据的独立性和安全性,我们可以给每一个repository创建一个独立的Blob块存储。
点击 Repository下面的 Blob Stores - Create blob store:
Name:填写一个易于辨认的名字
Path:会自动生成并补全。默认在Nexus安装目录下面的sonatype-work/nexus3/blobs/下,也可以修改到其它目录或磁盘,甚至可以是NFS或者cephfs的目录。
image
创建hosted类型的私有仓库
点击 Repository下面的 Repositories - Create repository - docker(hosted) :
配置后如图
这里http端口为8082,当我们需要上传镜像时就可以使用该端口
创建一个proxy类型的docker仓库
proxy类型仓库,可以帮助我们访问不能直接到达的网络,如另一个私有仓库,或者国外的公共仓库
配置如图
这里没有开放端口,因为proxy会集成到group中,当私有仓库中没有需要的镜像,就会去代理仓库下载,下载后会保存到私有仓库中
创建一个group类型的docker仓库
group类型的docker仓库,是一个聚合类型的仓库。它可以将前面我们创建的3个仓库聚合成一个URL对外提供服务,可以屏蔽后端的差异性,实现类似透明代理的功能。
配置如图
Group类型创建过程类似于上面的proxy类型。
group : 将左边可选的3个仓库,添加到右边的members下
启用了8083的监听端口
如何使用私有仓库
这是一个docker部署jar包的脚本
#!/bin/bash
# set -e
export BUILD_ID=dontkillme
\cp -f $WORKSPACE/target/xxxx.jar /data/docker/xxxx/jar && \
# 容器名称
CONTAINER="findhousewx"
# 服务名称
SERVICE_NAME="findhousewx_fbl-findhousewx-service"
# docker私有仓库的地址
REG_URL="xx.xx.xx.xx:8082/"
# 私有仓库账户密码
USER="admin"
PASSWD="xxxx"
# 登陆私有仓库
docker login -u $USER -p $PASSWD $REG_URL && \
# 镜像名称(以日期时间为镜像标签,防止重复)
IMAGE=$REG_URL$CONTAINER":"$(date -d "today" +"%Y%m%d_%H%M%S")
# dockerfile目录
cd /data/docker/findhousewx && \
# 创建新镜像
docker build -t $IMAGE . && \
# 上传镜像到私有仓库
docker push $IMAGE && \
echo "上传镜像完成" && \
# 定义删除未使用镜像和容器的函数
deletenotused(){
# 删除未使用的pod
docker container prune -f --filter "label=pod_category=fwx" --filter "until=48h"
# 删除未使用的image(使用标签label来定位改服务的pod,防止删除其他服务的pod)
docker image prune -a -f --filter "label=image_category=fwx" --filter "until=48h"
}
docker service ls | grep -i $CONTAINER
# 如果服务正在运行则滚动更新,如果没有就创建
if [ $? -eq 0 ];then
# 滚动升级
docker service update --image $IMAGE $SERVICE_NAME && \
deletenotused
else
# 删除 docker-compose.jenkins.yml 文件,防止使用相同镜像
rm -rf docker-compose.jenkins.yml && \
# 复制 docker-compose.src.yml 文件,防止污染原文件
cp docker-compose.src.yml docker-compose.yml && \
# 替换镜像名标志位为最新镜像
sed -i s%IMAGE_LATEST%$IMAGE%g docker-compose.yml && \
# 使用 docker stack 启动服务
docker stack deploy --with-registry-auth -c docker-compose.yml $CONTAINER && \
deletenotused
fi
这里我们自己创建的镜像push到私有仓库是通过8082端口
拉取镜像可以通过8083端口,当访问8083端口拉取私有仓库没有的镜像,则会由proxy仓库去远程拉取镜像,然后保存到本地。
maven私有仓库
maven-central:maven*库,默认从https://repo1.maven.org/maven2/拉取jar
maven-releases:私库发行版jar
maven-snapshots:私库快照(调试版本)jar
maven-public:仓库分组,把上面三个仓库组合在一起对外提供服务,在本地maven基础配置settings.xml中使用。
将nexus中maven-central地址配置到maven的setting.xml文件中就能使用
需要注意的
在nexus中创建完私服后,我们需要在docker中配置下,因为我们启用的是http端口,所以首先需要修改下docker的配置文件,执行以下命令:
修改配置文件
vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://registry.docker-cn.com"],
"insecure-registries": ["x.x.x.x:8083","x.x.x.x:8082"],
"disable-legacy-registry": true
}
配置客户端,和私有registry交互
这里的地址就是私有仓库的地址
systemctl daemon-reload
systemctl start docker