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

文章目录

前言

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

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

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

准备

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

实操

1、打开docker的远程访问

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

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

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

bash 复制代码
DOCKER_OPTS="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"

服务器开放2375端口

bash 复制代码
firewall-cmd --zone=public --add-port=2375/tcp --permanent
systemctl restart firewalld

重启docker

bash 复制代码
systemctl daemon-reload
systemctl restart docker

2、编写dockerfile文件

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

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

bash 复制代码
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

3、指定nexus环境

父pom:

bash 复制代码
    <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>

子pom

bash 复制代码
    <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>

4、配置jenkins

新建一个maven项目的任务

旧版本管理

设置参数

设置git,指定代码分支

打包镜像的命令

bash 复制代码
#!/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

5、使用jenkins构建

构建时要删除旧版镜像,根据版本号删除镜像,防止占用服务器空间。

总结

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

相关推荐
qq_364371722 小时前
基于 Docker 容器化环境配置
运维·docker·容器
GentleDevin3 小时前
Docker 运维常用命令大全
docker·容器·运维命令
运维全栈笔记4 小时前
基于Docker的MinIO单机部署与功能测试指南
运维·docker·容器
心机之蛙qee4 小时前
docker的安装(RHEL9)
运维·docker·容器
炸炸鱼.5 小时前
Docker 高级管理 —— 容器通信技术与数据持久化
docker
乐hh5 小时前
DM8配置SSL
数据库·docker·ssl
Cat_Rocky5 小时前
kubernetes ingress粗浅学习
学习·容器·kubernetes
极客先躯6 小时前
高级java每日一道面试题-2025年12月05日-实战篇[Dockerj]-Docker 安装后的默认存储路径是什么?如何修改?
java·docker·默认存储路径在不同系统上的区别·linux overlay2·修改存储路径的理论方法·修改流程中的关键理论点
凤舞飘伶6 小时前
windows安装docker-desk
windows·docker·容器
运维全栈笔记6 小时前
Docker一键部署Immich:自建私有云相册,照片视频备份无忧
linux·服务器·网络·docker·容器