• 项目打包docker镜像 | 上传nexus | jenkins一键构建


    前言

      Docker部署项目是指使用Docker容器化技术将应用程序及其依赖项打包成一个独立的、可移植的运行环境,并在各种操作系统和平台上进行部署和运行。

      使用Docker的主要原因是解决了应用程序在不同环境中部署和运行的问题。传统上,应用程序在部署时需要考虑操作系统、软件版本、依赖项等因素,不同环境之间存在差异,导致部署和运维变得复杂。

      Docker可以将应用程序及其所有依赖项打包成一个独立的容器,该容器包含了应用程序运行所需的所有组件,如操作系统、库、运行时环境等。这样,无论在哪个环境中部署,只需要安装Docker并运行容器,就可以保证应用程序在各个环境中的一致性和可移植性。


    准备

    • maven项目(java)
    • nexus(镜像仓库)
    • gitLab(代码仓库)
    • jenkins构建工具
    • 安装了docker的服务器

    实操

    1、打开docker的远程访问

      Docker 安装成功之后,首先需要修改 Docker 配置来开启允许远程访问 Docker 的功能。

    文件位置:/lib/systemd/system/docker.service

      修改内容: 加入如下内容:

    DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
    
    • 1

      服务器开放2375端口

    firewall-cmd --zone=public --add-port=2375/tcp --permanent
    systemctl restart firewalld
    
    • 1
    • 2

      重启docker

    systemctl daemon-reload
    systemctl restart docker
    
    • 1
    • 2


    2、编写dockerfile文件

      dockerfile文件用来生成docker镜像,镜像就像安装包,可以运行为一个个的容器。

      将dockerfile文件放到resource文件夹下。

    FROM openjdk:11
    # 将jar包添加到容器中,并命名为 demo.jar
    COPY merit-excitation-*.jar /home/admin/merit-backend/merit-excitation-*.jar
    #COPY agent /home/admin/agent
    # 设置环境变量
    ENV SPRING_NACOS_SERVERADDRESS='nacos.tfjy.tech:8848'
    ENV SPRING_NACOS_NAMESPACE='merit-test'
    # 设置时区
    RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
    # 启动jar包命令
    #CMD java -javaagent:/home/admin/agent/skywalking-agent.jar -DSW_AGENT_NAME=merit-excitation -DSW_AGENT_COLLECTOR_BACKEND_SERVICES=skywalking.tfjy.tech:11800  -Xms228m -Xmx228m -Dspring.cloud.nacos.config.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.config.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.config.username=merit -Dspring.cloud.nacos.config.password=merit -Dspring.cloud.nacos.discovery.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.discovery.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.discovery.username=merit -Dspring.cloud.nacos.discovery.password=merit -jar /home/admin/merit-backend/merit-excitation-*.jar
    CMD java -Xms228m -Xmx228m -Dspring.cloud.nacos.config.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.config.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.config.username=merit -Dspring.cloud.nacos.config.password=merit -Dspring.cloud.nacos.discovery.server-addr=${SPRING_NACOS_SERVERADDRESS} -Dspring.cloud.nacos.discovery.namespace=${SPRING_NACOS_NAMESPACE} -Dspring.cloud.nacos.discovery.username=merit -Dspring.cloud.nacos.discovery.password=merit -jar /home/admin/merit-backend/merit-excitation-*.jar
    # SpringBoot项目配置的端口号为9001,需要将9001暴露出去
    EXPOSE 9071
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15


    3、指定nexus环境

      父pom:

        <profiles>
            <profile>
                <!--不同环境Profile的唯一id-->
                <id>dev</id>
                <properties>
                    <!--profiles.active是自定义的字段(名字随便起),自定义字段可以有多个-->
                    <profiles.active>dev</profiles.active>
                </properties>
            </profile>
            <profile>
                <id>prod</id>
                <properties>
                    <profiles.active>prod</profiles.active>
                    <docker-url>http://192.168.0.100:2375</docker-url>
                </properties>
            </profile>
            <profile>
                <id>test</id>
                <properties>
                    <profiles.active>test</profiles.active>
                    <docker-url>http://192.168.0.200:2375</docker-url>
                </properties>
                <activation>
                    <activeByDefault>true</activeByDefault>
                </activation>
            </profile>
        </profiles>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

      子pom

        <parent>
            <artifactId>merit-backend</artifactId>
            <groupId>com.xxx</groupId>
            <version>1.0.15</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>merit-template</artifactId>
        <properties>
            <maven.compiler.source>11</maven.compiler.source>
            <maven.compiler.target>11</maven.compiler.target>
            <registry-url>192.168.0.xxx:8083</registry-url>
            <skipTests>true</skipTests><!--编译打包跳过测试类-->
        </properties>
    
        <build>
            <finalName>${project.artifactId}-${project.parent.version}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>1.2.2</version>
                    <configuration>
                        <serverId>docker-local</serverId>
                        <dockerHost>${docker-url}</dockerHost>
                        <imageName>${registry-url}/${project.artifactId}-${profiles.active}:${project.parent.version}</imageName>
                        <!--nexus3 hosted 仓库地址-->
                        <registryUrl>${registry-url}</registryUrl>
                        <!-- 在生成图像后将其推入的标志。默认为false -->
                        <pushImage>true</pushImage>
                        <imageTags>
                            <!-- 指定镜像标签,可以排至多个标签 -->
                            <imageTag>${project.version}</imageTag>
                        </imageTags>
                        <!--是否强制覆盖已有镜像-->
                        <forceTags>true</forceTags>
                        <!--方式一:1、指定Dockerfile文件所在目录,通过文件执行打包上传nexus私服-->
                        <dockerDirectory>src/main/resources</dockerDirectory>
                        <!-- 指定docker镜像打包参数,即dockerfile中使用的参数,通过${参数名}取值 -->
                        <buildArgs>
                            <JAR_FILE>${project.build.finalName}.jar</JAR_FILE>
                        </buildArgs>
                        <resources>
                            <resource>
                                <targetPath>/</targetPath>
                                <!--指定需要复制的根目录,${project.build.directory}表示target目录-->
                                <directory>${project.build.directory}</directory>
                                <!--用于指定需要复制的文件,${project.build.finalName}.jar表示打包后的jar包文件-->
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58


    4、配置jenkins

      新建一个maven项目的任务

    在这里插入图片描述

      旧版本管理
    在这里插入图片描述
      设置参数
    在这里插入图片描述
      设置git,指定代码分支

    在这里插入图片描述

    在这里插入图片描述
      打包镜像的命令
    在这里插入图片描述
    在这里插入图片描述

    #!/bin/bash
    
    echo admin | sudo -S docker stop merit-excitation
    # 删除旧的容器
    echo admin | sudo -S docker rm -f merit-excitation
    # 删除旧版镜像
    echo admin | sudo -S docker rmi 192.168.0.xxx:8083/merit-excitation-prod:${old_version}
    #删除所有悬空镜像
    echo admin | sudo -S docker rmi $(echo admin | sudo -S docker images -f "dangling=true" -q)
    # 启动镜像
    echo admin | sudo -S docker run --net=host --restart=always -d --name merit-excitation -p 9071:9071 -e SPRING_NACOS_NAMESPACE=merit-prod -v /home/admin/logs:/logs 192.168.0.xxx:8083/merit-excitation-prod:${new_version}
    
    exit
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13


    5、使用jenkins构建

      构建时要删除旧版镜像,根据版本号删除镜像,防止占用服务器空间。
    在这里插入图片描述
    在这里插入图片描述



    总结

      配置好以后把镜像推到服务器上运行就很简单了。

  • 相关阅读:
    java之反射
    【算法刷题 | 贪心算法03】4.25(最大子数组和、买卖股票的最佳时机|| )
    JVM整体结构
    python 文本文件的编码格式:ASCII编码和UNICODE编码
    事件总线--EvenBus
    WMS仓库管理系统库位功能
    c++ 11 recursive_mutex 递归锁
    python pdf文件转图片
    vue2双向绑定原理:深入响应式原理defineProperty、watcher、get、set
    示例:WPF中如何绑定ContextMenu和Menu
  • 原文地址:https://blog.csdn.net/CharmaineXia/article/details/132508109