nexus搭建maven私服,docker私服并与maven项目整合

目录

实现功能:

  • 通过nexus管理jar包
  • 通过nexus管理docker镜像
  • 开发端机器远程打包上传jar
  • 通过maven-docker插件编译为docker镜像,部署到测试环境,并上传的nexus私服

搭建环境

  • ubantu17 已经安装好docker 17.06.2-ce

搭建步骤

1. 通过docker安装nexus
2. 实现nexus管理maven私服(打包上传,拉取jar包等)
3. 实现nexus管理docker私服(打包上传,拉取jar包等)

通过docker安装nexus

## 启动nexus
docker run -d -p 8081:8081 -p 8082:8082 -p 8083:8083 --name nexus3 -v /home/nexus/nexus-data:/nexus-data --restart=always sonatype/nexus3
## -v /home/nexus/nexus-data:/nexus-data 将数据挂载到宿主机
## 8081:nexus3网页端
## 8082:docker(hosted)私有仓库,可以pull和push(后面实现docker的时候会详细说明)
## 8083:docker(proxy)代理远程仓库,只能pull(后面实现docker的时候会详细说明)

默认用户名密码:admin/admin123

访问启动机器ip:8081即可看见如下的界面

实现nexus管理maven私服

nexus设置maven仓库

默认情况下,nexus是提供了四个仓储
四个仓储

1. maven-central        代理中央仓库,从公网下载jar 
2. maven-release       发布版本内容(即自己公司发行的jar的正式版本) 
3. maven-snapshots  发布版本内容(即自己公司发行的jar的快照版本)
4. maven-public         以上三个仓库的小组         

maven-central设置代理位置,个人喜好阿里的国内镜像:http://maven.aliyun.com/nexus/content/groups/public/
设置代理位置

开发端设置私服的链接地址

下载的maven

在conf中有个settings.xml,开始设置maven链接私服的

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <!-- 本地存储路径 -->
    <localRepository>E:\Maven\Repository</localRepository>
    <pluginGroups>
        <pluginGroup>org.sonatype.plugins</pluginGroup>
    </pluginGroups>
    <proxies>
    </proxies>
    <servers>
        <server>
            <id>releases</id>
            <username>admin</username>
            <password>admin123</password>
        </server>
        <server>  
            <id>snapshots</id>  
            <username>admin</username>  
            <password>admin123</password>  
        </server>  
        <server>
            <id>docker-hub</id>
            <username>admin</username>
            <password>admin123</password>
            <configuration>
                <email>[email protected]</email>
            </configuration>
        </server>
    </servers>

    <mirrors> 
        <mirror>  
            <id>nexusSnapashots</id>  
            <url>http://192.168.80.129:8081/repository/maven-public/</url>  
            <mirrorOf>public-snapshots</mirrorOf>  
            <interval>always</interval>  
        </mirror>  
        <mirror>  
            <id>nexusMirror</id>  
            <name>local repos</name>  
            <url>http://192.168.80.129:8081/repository/maven-public/</url>  
            <mirrorOf>*</mirrorOf>  
        </mirror> 
    </mirrors> 
    <profiles>
        <profile>  
            <id>nexusRepository</id>  
            <!-- jar包仓库配置 -->  
            <repositories>  
                <repository>  
                    <id>nexusSnapashots</id>  
                    <name>nexus-snapshots</name>  
                    <url>http://192.168.80.129:8081/repository/maven-public/</url>  
                    <releases>  
                        <enabled>false</enabled>  
                    </releases>  
                    <snapshots>  
                        <enabled>true</enabled>  
                    </snapshots>  
                    <layout>default</layout>  
                    <snapshotPolicy>always</snapshotPolicy>  
                </repository>  
                <repository>  
                    <id>nexusMirror</id>  
                    <name>nexus-snapshots</name>  
                    <url>http://192.168.80.129:8081/repository/maven-public/</url>  
                    <releases>  
                        <enabled>true</enabled>  
                    </releases>  
                    <snapshots>  
                        <enabled>false</enabled>  
                    </snapshots>  
                    <layout>default</layout>  
                    <snapshotPolicy>always</snapshotPolicy>  
                </repository>  
            </repositories>  

            <!-- 插件仓库配置 -->  
            <pluginRepositories>  
                <pluginRepository>  
                    <id>nexusMirror</id>  
                    <name>nexus mirror</name>  
                    <url>http://192.168.80.129:8081/repository/maven-public/</url>  
                    <releases>  
                        <enabled>true</enabled>  
                    </releases>  
                    <snapshots>  
                        <enabled>false</enabled>  
                        <updatePolicy>always</updatePolicy>  
                        <checksumPolicy>warn</checksumPolicy>    
                    </snapshots>  
                </pluginRepository>  
            </pluginRepositories>  
        </profile>  
    </profiles>  
    <activeProfiles>
        <activeProfile>nexusRepository</activeProfile>
    </activeProfiles>
</settings>

具体标签意义详见Maven官网

此时便可以实现maven的私服拉取操作了。还有一部分就是如何上传呢?在自己的pom文件中加上如下的内容
mvn deploy便可上传

    <distributionManagement>
        <snapshotRepository>
            <id>snapshots</id><!-- 这个id和settings.xml中的servier标签下的对应 -->
            <url>http://192.168.80.129:8081/repository/maven-snapshots/</url><!-- nexus的仓储地址 -->
        </snapshotRepository>
        <repository>
            <id>releases</id>
            <url>http://192.168.80.129:8081/repository/maven-releases/</url>
        </repository>
    </distributionManagement>

实现nexus管理docker私服

nexus设置docker仓库

  • 仓库类型
项目 详细说明
hosted 本地存储,像官方仓库一样提供本地私库功能
proxy 提供代理其他仓库的类型
group 组类型,可以组合多个仓库为一个地址提供服务
  • 创建docker-releases(hosted )
项目 详细说明
类型 docker (hosted)
Name docker-releases
Blob store default
Deployment policy Allow redeploy

新建hosted类型的存储

  • 创建docker-central(proxy)
项目 详细说明
类型 docker (proxy)
Name docker-central
Location of the remote repository being proxied https://registry.docker-cn.com
Docker Index Use Docker Hub
Blob store default

创建proxy类型的存储
- 创建docker-public(group)

项目 详细说明
类型 docker (group)
Name docker-public
HTTP Port 8083
Member repositories docker-central
Member repositories docker-releases
Blob store default

创建group类型的存储

docker服务的设定

Docker的私库可以使用HTTP或者HTTPS,Nexus 3都予以支持,本文的方式采用HTTP方式,因此需要设定docker,在docker启动前设定如下信息是需要的

项目 详细说明
设定对象文件 /etc/docker/daemon.json
设定内容 insecure-registries

详情

{
            "registry-mirrors": ["https://registry.docker-cn.com"],
            "insecure-registries": ["192.168.80.129:8082","192.168.80.129:8083"],
            "disable-legacy-registry": true
}

设置完成后重启docker服务

root@ubuntu:/home/tianbocheng# service docker restart 
## 重启nexus服务
root@ubuntu:/home/tianbocheng# docker ps -a 
root@ubuntu:/home/tianbocheng# docker restart 016a4a644432(nexus的CONTAINER ID)
  • 验证docker login
项目 详细说明
docker-release仓库 docker login -u admin -p admin123 192.168.80.129:8082
docker-cenreal仓库 docker login -u admin -p admin123 192.168.80.129:8083

验证成功

root@ubuntu:/home/tianbocheng# docker login -u admin -p admin123 192.168.80.129:8082
Login Succeeded
root@ubuntu:/home/tianbocheng# docker login -u admin -p admin123 192.168.80.129:8083
Login Succeeded
root@ubuntu:/home/tianbocheng# 
  • docker-central(proxy)验证
root@ubuntu:/home/tianbocheng# docker pull 192.168.80.129:8083/redis
Using default tag: latest
latest: Pulling from redis
b0568b191983: Pulling fs layer 
6637dc5b29fe: Download complete 
7b4314315f15: Pulling fs layer 
2fd86759b5ff: Waiting 
0f04862b5a3b: Waiting 
2db0056aa977: Waiting 

查了一下nexus的一些issue,发现有不少都是跟blob相关,看起来相关的小的问题还有一些在不断的收拾中,但是不影响结果。 确认proxy仓库,发现pull的alpine的3.5版本已然在proxy仓库中保存完毕,所以上面的unknown blob也确实没有影响结果。
本地proxy仓库

  • docker-releases(hosted)验证

查看镜像

root@ubuntu:/home/tianbocheng# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
192.168.80.129:8082/paascloud-eureka   1.0                 ee8335f1e9f3        15 hours ago        643MB
mysql                                  5.7                 5195076672a7        2 weeks ago         371MB
liumiaocn/nexus                        latest              3f2921de4b91        4 months ago        485MB
java                                   8                   d23bdf5b1b1b        14 months ago       643MB

tag镜像

root@ubuntu:/home/tianbocheng# docker tag mysql:5.7 192.168.80.129:8082/mysql:5.7
root@ubuntu:/home/tianbocheng# docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
192.168.80.129:8082/paascloud-eureka   1.0                 ee8335f1e9f3        15 hours ago        643MB
mysql                                  5.7                 5195076672a7        2 weeks ago         371MB
192.168.80.129:8082/mysql              5.7                 5195076672a7        2 weeks ago         371MB
liumiaocn/nexus                        latest              3f2921de4b91        4 months ago        485MB
java                                   8                   d23bdf5b1b1b        14 months ago       643MB

push镜像

root@ubuntu:/home/tianbocheng# docker push 192.168.80.129:8082/mysql:5.7
The push refers to a repository [192.168.80.129:8082/mysql]
c5479ef6e03d: Pushed 
1df83efbc52b: Pushed 
4b402dfbab7b: Pushing [=======>                                           ]  38.28MB/256.4MB
14d83b80d542: Pushed 
b0c77fd3841d: Pushed 
317e578f94b9: Pushing [=================>                                 ]  15.71MB/44.72MB
fbb39c7dedaf: Pushed 
55d5d837463a: Pushed 
f0f28cc0eea1: Pushed 
813996252a80: Pushed 
3358360aedad: Pushing [=========>                                         ]  10.31MB/55.27MB

本地hosted仓库

开发端设置私服的链接地址

docker服务端设定
由于开发段没有docker环境,需要开启远程http访问(不同版本操作系统,自行百度查询docker如何开启http访问)
1. 创建/etc/systemd/system/docker.service.d目录。
2. 创建一个/etc/systemd/system/docker.service.d/http-proxy.conf文件。
3. 刷新配置
4. 重启docker服务
5. 验证是否开启

$ sudo mkdir /etc/systemd/system/docker.service.d
$ sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
$ docker -H tcp://127.0.0.1:2375 images

开发端pom.xml的设定
开发端设置引入maven-docker插件,采用dockerfile的方式。

 <properties>
        <docker.host>http://192.168.80.129:2375</docker.host>
        <docker.repository>192.168.80.129:8082</docker.repository>
    </properties>


 <build>
        <finalName>${project.artifactId}</finalName>
        <plugins>
            <!-- 我的是spring boot项目,加入了boot打包的插件(非boot项目不需要引入) -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 添加docker-maven插件 -->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <!-- docker.host就是docker服务的地址 -->
                    <dockerHost>${docker.host}</dockerHost>
                    <serverId>docker-hub</serverId>
                    <!-- docker.repository就是私服的地址 -->
                    <imageName>${docker.repository}/${project.artifactId}:${project.version}</imageName>
                    <dockerDirectory>${project.basedir}/src/main/docker</dockerDirectory>
                    <resources>
                        <resource>
                            <targetPath>/</targetPath>
                            <directory>${project.build.directory}</directory>
                            <include>${project.build.finalName}.jar</include>
                        </resource>
                    </resources>
                    <forceTags>true</forceTags>
                </configuration>
            </plugin>
        </plugins>
    </build>

新建dockerfile文件夹和Dockerfile
ecplise中的样例

# Version 0.0.1
FROM java:8
ENV JVM_OPTS ''
RUN bash -c 'touch /app.jar'
EXPOSE 8761
ENTRYPOINT java ${JVM_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /paascloud-eureka.jar

执行命令即可

mvn clean package docker:build
mvn clean package docker:build  -DpushImage

参考链接

nexus 官方镜像

猜你喜欢

转载自blog.csdn.net/sinat_31908303/article/details/79799654
今日推荐