Maven仓库的搭建
1. 仓库选型
这里经过了解,好像没有什么其他的选择,Nexus
就是一个不二之选,网上的帖子区别也就是在于是nexus2还是nexus3,这里鉴于nexus3的颜值较好,就选择了nexus3。
两者一个有趣的区别在于,文件的存储方式不同,nexus2对上传的文件直接存放的是源文件,而nexus3则是存放的blob文件,以一种二进制的大对象将数据存储了起来。这就导致,在2上可以直接将maven仓库C&V过去,但是在3上没法这么干。
首先下载nexus安装包:
tar -zxvf nexus-3.*.tar.gz
## 之后进入nexus-3.28.0-01/bin📂
./nexus start
## 启动后默认端口为8081
## 用户admin,密码需要在sonatype-work中获取
## 当然,启动端口可以进行修改,在sonatype-work/nexus3/etc中找到相应的配置文件进行修改,之后重启
2. 进行仓库配置
首先,nexus仓库中有三种类型,为hosted,proxy和group,下面对三种分别描述:
- hosted :主机模式,相当于使用本地的maven仓库
- proxy :代理模式,可以设定一个在线仓库进行Jar包的下载更新,更新之后的Jar包会存储在本地Maven仓库,hosted仓库中可以检索到
- group :组合模式,可以把设定的仓库repositories进行组合,统一提供服务。
这里可以将maven-central设置如下:
查看maven-public提供服务的路径
之后就可以像使用阿里的maven镜像一样设置好settings.xml中的mirrors,或者修改repository的设置:
<repositories>
<repository>
<id>nexus</id>
<layout>default</layout>
<url>http://localhost:30203/repository/maven-public/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
settings.xml文件的完整描述
详见: Setting.xml文件详解
上面有一个概念比较有意思,一个是mirror,一个是repository,一个叫镜像,一个叫仓库,都是为用户下载jar包而指定的,两者有什么差别呢?
简言之[1],mirror就是repository的一个镜像,相当于在用户和仓库之间做了个转发,将用户对A仓库的请求,转发到对B镜像仓库的请求上。
POM文件的完整描述
详见:POM文件详述
目前可以关注一下distributionManagement,因为后面向nexus仓库中上传当前项目的Jar包时,需要指定该属性
3. Maven中的几种命令的意义[2]
其中涉及到了Maven的生命周期和一个常用的插件maven-dependency-plugin。
3.1 Maven的生命周期【TODO】
3.2 上传项目生成的Jar包
这里主要用到了mvn deploy的命令,需要预先设定好POM中的distributionManagement
,其中的id应该与setting文件中的<server/>
节点做好对应,方便进行用户&密码的读取。
<distributionManagement>
<!-- 部署项目产生的构件到远程仓库需要的信息 -->
<repository>
<!-- 是分配给快照一个唯一的版本号(由时间戳和构建流水号)?还是每次都使用相同的版本号?参见
repositories/repository元素 -->
<uniqueVersion />
<id> banseon-maven2 </id>
<name> banseon maven2 </name>
<url> file://${basedir}/target/deploy
</url>
<layout></layout>
</repository>
<!-- 构件的快照部署到哪里?如果没有配置该元素,默认部署到repository元素配置的仓库,参见
distributionManagement/repository元素 -->
<snapshotRepository>
<uniqueVersion />
<id> banseon-maven2 </id>
<name> Banseon-maven2 Snapshot Repository
</name>
<url> scp://svn.baidu.com/banseon:/usr/local/maven-snapshot
</url>
<layout></layout>
</snapshotRepository>
</distributionManagement>
之后运行mvn deploy即可
idea中出现如下日志,即为上传成功
之后查看nexus,成功在snasnapshot库中加入该jar包
2. docker仓库的搭建
1. 仓库的选型
仓库无外乎就是docker中官方推荐的registry和Harbor,Nexus。网上有人沉迷于Harbor方便的给镜像分包归置的功能,但是又希望融合在线镜像,所以选择了Nexus代理在线镜像。比较冗余了,个人认为直接选Nexus就可以满足一般的需求,这里还是选择Nexus。
2. 仓库的配置
与maven仓库类似,创建proxy类型的docker仓库代理阿里上的docker镜像,同时创建hosted类型的docker仓库用于存储下载或者上传的docker镜像,之后创建group类型,用于统一管理proxy和hosted两种仓库。
这里设置releases的端口和pulic的端口,分别作为上传和下载的端口。
之后需要进行安全设置
【另可参见】:docker下的nexus搭建[3]
3. 上传本地docker中的images
以上传java:8的镜像为例,步骤如下:
graph LR
id1(修改images的Tag)-->id2(docker push)
id2-->id3{是否上传成功}
id3--成功-->id4[end]
id3-.失败.->id5((圆形))
id5-->id6(进行登录后上传)
之后可以在Nexus中看到该镜像
为了验证pulic可以为外部提供镜像下载的功能,这里将镜像仓库地址配置到docker的daemon.json中。
docker pull 127.0.0.1:30205/java:8
# 可以正常下载
4. 制作项目的docker镜像
这里有两种方式:
graph LR
已有项目-->id1(打包package)
subgraph 打包
id1-->打成jar包-->制作基于jre的Dockerfile-->id2
id1-->打成war包-->制作基于tomcat的Dockerfile-->id2
id2(手动生成镜像)
end
subgraph 通过插件
id1-->借助docker-maven-plugin-->在package之后自动封装镜像
end
这里采用插件
的方案:
1.在pom中定义image
首先在父pom中引入该插件, 之后在其中进行配置,主要需要配置docker的连接和相关的证书,以及dockerhub的连接和相关用户密码。
<profiles>
<profile>
<id>build-jar-docker</id>
<activation>
<!-- 这里默认构建-->
<!-- <activeByDefault>true</activeByDefault>-->
<!-- 当pom中包含这个键值对时启用该配置-->
<property>
<name>build.method</name>
<value>jar-docker</value>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<!--相关的配置-->
<configuration>
<!--构建的镜像的名字-->
<imageName>${project.artifactId}</imageName>
<imageTags>
<!--构建的镜像的tag,可以设置多个, 但是push的时候,会有一些报错,建议设置一个-->
<imageTag>${project.version}</imageTag>
</imageTags>
<!--使用的基础镜像,类似于FROM ...-->
<baseImage>java:8-jre-alpine</baseImage>
<!--docker的地址和相关证书-->
<dockerHost>${docker.host}</dockerHost>
<dockerCertPath>E:\\Docker\\Docker\\ca</dockerCertPath>
<resources>
<resource>
<!--放在容器的位置-->
<targetPath>/</targetPath>
<!--需要移动的资源的位置-->
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--运行容器时,启动jar包-->
<entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>
<!--是否强制覆盖tag-->
<forceTags>true</forceTags>
<!--调用setting中设定好的server中的用户密码-->
<serverId>nexus</serverId>
<!--dockerHub的位置,注意不要带http://,否则push会报错-->
<registryUrl>${dockerhub.host}</registryUrl>
</configuration>
<executions>
<execution>
<id>build-image</id>
<!--对应maven中的一个生命阶段-->
<phase>package</phase>
<!--对应docker中的操作-->
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
<configuration>
<image>${project.artifactId}:${project.version}</image>
<newName>${dockerhub.host}/${project.artifactId}:${project.version}</newName>
</configuration>
</execution>
<execution>
<id>push-image</id>
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
<configuration>
<imageName>${dockerhub.host}/${project.artifactId}:${project.version}</imageName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
在子pom中通过属性进行启用
<properties>
<build.method>jar-docker</build.method>
</properties>
2. 在Dockerfile中定义image👍
其实还可以通过在目录下定义Dockerfile来个性化的定制。
<profile>
<id>build-jar-dockerfile</id>
<activation>
<!-- 这里默认构建-->
<!-- <activeByDefault>true</activeByDefault>-->
<!-- 当pom中包含这个键值对时启用该配置-->
<!-- <property>-->
<!-- <name>build.method</name>-->
<!-- <value>jdk-dockerfile</value>-->
<!-- </property>-->
<!--这里通过判断是否存在这个文件来决定是否启用-->
<file>
<exists>Dockerfile</exists>
</file>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.1</version>
</plugin>
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.1.0</version>
<!--相关的配置-->
<configuration>
<!--构建的镜像的名字-->
<imageName>${project.artifactId}</imageName>
<imageTags>
<!--构建的镜像的tag,可以设置多个, 但是push的时候,会有一些报错,建议设置一个-->
<imageTag>${project.version}</imageTag>
</imageTags>
<!--Dockerfile-->
<dockerDirectory>${project.basedir}</dockerDirectory>
<!--用于将构造的jar的文件名传入Dockerfile-->
<buildArgs>
<Jar_File>${project.build.finalName}.jar</Jar_File>
</buildArgs>
<!--docker的地址和相关证书-->
<dockerHost>${docker.host}</dockerHost>
<dockerCertPath>E:\\Docker\\Docker\\ca</dockerCertPath>
<resources>
<resource>
<!--放在容器的位置-->
<targetPath>/</targetPath>
<!--需要移动的资源的位置-->
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
<!--调用setting中设定好的server中的用户密码-->
<serverId>nexus</serverId>
<!--dockerHub的位置,注意不要带http://,否则push会报错-->
<registryUrl>${dockerhub.host}</registryUrl>
</configuration>
<executions>
<execution>
<id>build-image</id>
<!--对应maven中的一个生命阶段-->
<phase>package</phase>
<!--对应docker中的操作-->
<goals>
<goal>build</goal>
</goals>
</execution>
<execution>
<id>tag-image</id>
<phase>package</phase>
<goals>
<goal>tag</goal>
</goals>
<configuration>
<image>${project.artifactId}:${project.version}</image>
<newName>${dockerhub.host}/${project.artifactId}:${project.version}</newName>
</configuration>
</execution>
<execution>
<id>push-image</id>
<phase>deploy</phase>
<goals>
<goal>push</goal>
</goals>
<configuration>
<imageName>${dockerhub.host}/${project.artifactId}:${project.version}</imageName>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
对应的Dockerfile定义为:
FROM java:8-jre-alpine
ARG Jar_File
ADD ${Jar_File} /app.jar
ENTRYPOINT ["java","-jar","-Dserver.port=8080","/app.jar"]
EXPOSE 8080
至于构造war包的镜像配置,这里留个坑🕳
5. 上传项目的docker镜像
配置同样在上面,已经将push方法绑定到了deploy方法上了,在上传jar包的时候,同时也会上传image镜像。
-
详见:mirror和repository的区别 https://www.cnblogs.com/bollen/p/7143551.html ↩
-
基于docker 安装 nexus: https://www.jianshu.com/p/86e573f18df3?from=singlemessage ↩