DockerFile

dockerfile 复制代码
## 基础镜像
## AdoptOpenJDK 停止发布 OpenJDK 二进制,而 Eclipse Temurin 是它的延伸,提供更好的稳定性
## FROM eclipse-temurin:8-jre
## FROM指令指定了基础镜像为192.168.12.103:8006/images/arm64v8/openjdk:11-ea-jre-slim,该镜像基于OpenJDK 11的精简版。
FROM 192.168.12.103:8006/images/arm64v8/openjdk:11-ea-jre-slim
## 作者
## LABEL指令设置了镜像的作者为18836418455@163.com。
LABEL org.opencontainers.image.authors="18836418455@163.com"

## 定义参数

## 创建并进入工作目录
## RUN指令创建了/data目录。
RUN mkdir -p /data
## WORKDIR指令将工作目录设置为/data。
WORKDIR /data

## maven 插件构建时得到 buildArgs 种的值
## COPY指令将构建好的Java应用程序JAR文件复制到/data目录下,并命名为app.jar。
COPY target/*.jar app.jar

## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
## ENV指令设置了时区为Asia/Shanghai,并定义了JAVA_OPTS环境变量,用于设置Java虚拟机的初始和最大内存。
ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms256m -Xmx2560m"

## EXPOSE指令暴露了容器内的8080端口。
EXPOSE 8080

## 容器启动命令
## CMD 第一个参数之后的命令可以在运行时被替换
## CMD指令指定了容器启动时要执行的命令,即运行Java应用程序。其中${JAVA_OPTS}会从环境变量中获取值,并且可以通过docker run命令进行覆盖。--server.port=8080和--spring.profiles.active=k8s_dev是应用程序的特定参数。
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom  -jar app.jar  --server.port=8080 --spring.profiles.active=k8s_dev

jenkinsfile

java 复制代码
pipeline {
    agent {
        kubernetes {
            label 'maven'
        }
    }

    parameters {
        string(name: 'APP_NAME', defaultValue: 'lz-gateway', description: '请选择要部署的服务默认lz-gateway')
        string(name: 'DOCKERHUB_NAMESPACE', defaultValue: '1', description: '请选择部署到哪个镜像仓库(snapshots 和 releases)默认 snapshots')
        string(name: 'REPLICAS', defaultValue: '1', description: '请选择构建后的副本数默认1')
        string(name: 'BRANCH_NAME', defaultValue: 'master', description: '请输入要构建的分支名称')
        string(name: 'TAG_NAME', defaultValue: 'snapshot', description: '部署版本:必须以 v 开头,例如:v1、v1.0.0')
        string(name: 'PROD_OR_DEV', defaultValue: 'dev', description: '部署环境正式环境(prod)测试环境(dev),默认测试环境')
    }

    environment {
        DOCKER_CREDENTIAL_ID = 'harbor-user-pass'
        GIT_REPO_URL = '192.168.12.103:8005'
        GIT_CREDENTIAL_ID = 'git-user-pass'
        GIT_ACCOUNT = 'gitlab-user-pass'
        KUBECONFIG_CREDENTIAL_ID = 'de2b418c-cb9d-421e-8eaa-506a6afc1f47'
        REGISTRY = '192.168.12.103:8006'
        DOCKERHUB_NAMESPACE = 'snapshots'
        SONAR_CREDENTIAL_ID = 'sonarqube-token'
    }

    stages {


        stage('checkout scm') {
            steps {
                      git(url: 'http://192.168.12.103:8005/root/lz-cloud-mas-new.git',
          credentialsId: 'gitlab-user-pass', branch: '$BRANCH_NAME', changelog: true, poll: false)
            }
       }

        // maven 构建
      stage('清空和安装jar包') {
          steps {
            sh '''mvn clean'''
            sh '''mvn install'''
          }
     }


                 // 构建和推送到镜像仓库
        stage('build & push') {
            steps {
            //    sh '''mvn clean package -DskipTests'''
                sh '''chmod -R 777 ${PROD_OR_DEV}_copy.sh && ./${PROD_OR_DEV}_copy.sh'''
                sh '''cd  deploy/$APP_NAME/build/${PROD_OR_DEV}
                 docker build -f Dockerfile -t $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER .'''

                withCredentials([usernamePassword(passwordVariable: 'DOCKER_PASSWORD', usernameVariable: 'DOCKER_USERNAME', credentialsId: "$DOCKER_CREDENTIAL_ID",)]) {
                    sh '''echo "$DOCKER_PASSWORD" | docker login $REGISTRY -u "$DOCKER_USERNAME" --password-stdin'''
                    sh '''cd deploy/$APP_NAME/build/${PROD_OR_DEV}
                    docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER'''
                }
            }
        }



         // 从镜像仓库拉取最新的一个
        stage('push latest') {
            steps {
                sh '''docker tag $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest'''
                sh '''docker push $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:latest'''

                sh ''' docker rmi $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:SNAPSHOT-$BUILD_NUMBER'''
            }
        }

        // 部署测试环境
        stage('deploy to dev') {
            when {
                expression {
                    return params.PROD_OR_DEV =~ /dev.*/
                }
            }
            steps {
             input(id: 'deploy-to-dev', message: 'deploy to dev?')
                sh '''echo shell pwd '''
                sh '''
                    sed -i'' "s#REGISTRY#$REGISTRY#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                    sed -i'' "s#DOCKERHUB_NAMESPACE#$DOCKERHUB_NAMESPACE#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                    sed -i'' "s#APP_NAME#$APP_NAME#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                    sed -i'' "s#BUILD_NUMBER#$BUILD_NUMBER#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                    kubectl apply -f deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                '''
            }
        }
        // 部署到生产环境
        stage('deploy to production') {
            when {
                expression {
                    return params.PROD_OR_DEV =~ /prod.*/
                }
            }
            steps {
                input(id: 'deploy-to-production', message: 'deploy to production?')
                sh '''
                    sed -i'' "s#REGISTRY#$REGISTRY#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                    sed -i'' "s#DOCKERHUB_NAMESPACE#$DOCKERHUB_NAMESPACE#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                    sed -i'' "s#APP_NAME#$APP_NAME#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                     sed -i'' "s#BUILD_NUMBER#$BUILD_NUMBER#" deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                    kubectl apply -f deploy/$APP_NAME/$PROD_OR_DEV/deployment.yaml
                '''
            }
        }
    }
}

微服务部署 docker compose (容器编排助手) 通过镜像快速安装启动应用

如果要把不同的容器部署到不同的服务器上采用专业的 **kubernetes**容器编排和自动化部署工具

  1. 本地部署(部署准备)

  2. 先装docker Desktop可视化工具 管理docker容器

  3. 梳理服务部署表格

    | 服务名称 | 英文名 | 端口号 | 版本号 | 服务类别 |

    | --- | --- | --- | --- | --- |

    | 数据库 | mysql | 3306 | v8 | 环境依赖 |

    | 缓存 | redis | 63791 | v6 | 环境依赖 |

    | 消息队列 | rabbitmq | 5672,15672 | v3.12.6 | 环境依赖 |

    | 注册中心 | nacos | 8848 | v2.2.0 | 环境依赖 |

    | 网关服务 | gateway | 8101 | java8 | 业务服务 |

    | 用户服务 | user-service | 8102 | java8 | 业务服务 |

  4. 一键打包

    1. 父模块配置pom.yml
      **<build>**标签中只留下:
xml 复制代码
   <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

2.子模块pom.yml中: (只要是Springboot实现的这个服务都要加这个配置)

xml 复制代码
   <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <executions>
                    <execution>
                    	<id>proackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
  3. 在`maven`根目录中执行 mvn package打包命令
  4. 在`target`下生成的jar包中右键打开控制台 输入 `java -jar jar包名`测试一下jar包的启动,没问题再进行后续的操作
  1. 给每一个服务编写Dockerfile文件(定义了容器镜像制作过程的文件) target同级目录下创建Dockerfile
shell 复制代码
# 基础镜像
FROM openjdk:8-jdk-alpine

# 指定工作目录
WORKDIR /app

# 将 jar包添加到工作目录
ADD target/*.jar

## EXPOSE指令暴露了容器内的8080端口。
EXPOSE 8080
  1. 编写docker-compose文件快速同时启动多个服务 docker-compose.env.yml(环境依赖) docker-compose.service.yml(业务服务) 先启动环境依赖 再启动业务服务
    ai快速生成模板

    现在我需要用 docker compose 来部署mysql8(3306 端口)username=root,password=123456
    redis6(无密码,6379端口)、rabbitmq v.3.12.6(5672端口 password: guest,username:guest)、nacos2.2.0(8848端口);还有4个本地的springboot服务(名称分别为:yuoj-backend-user-service 8102端口、yuoj-backend-question-service 8103端口、yuoj-backend-judge-service8104端口、yuoj-backend-gateway8101端口),每个服务本地目录都有一个Dockerfile,请帮我自动生成dockercompose的yml配置文件,要求这些服务网络能够连通

yaml 复制代码
version: '3.8'

services:
  mysql:
    image: 'mysql:8'
    container_name: mysql_service
    restart: always
    ports:
      - '3306:3306'
    environment:
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_DATABASE: 'your_database_name' # 可选,初始化数据库名
    volumes:
      - mysql_data:/var/lib/mysql

  redis:
    image: 'redis:6'
    container_name: redis_service
    ports:
      - '6379:6379'

  rabbitmq:
    image: 'rabbitmq:3.12.6-management'
    container_name: rabbitmq_service
    ports:
      - '5672:5672'
      - '15672:15672' # 管理界面端口
    environment:
      RABBITMQ_DEFAULT_USER: 'guest'
      RABBITMQ_DEFAULT_PASS: 'guest'

  nacos:
    image: 'nacos/nacos-server:2.2.0'
    container_name: nacos_service
    ports:
      - '8848:8848'
    environment:
      - MODE=standalone

  yuoj-backend-user-service:
    build: ./yuoj-backend-user-service # 假设这是服务的本地目录
    container_name: user-service
    ports:
      - '8102:8102'
    networks:
      - backend_net

  yuoj-backend-question-service:
    build: ./yuoj-backend-question-service
    container_name: question-service
    ports:
      - '8103:8103'
    networks:
      - backend_net

  yuoj-backend-judge-service:
    build: ./yuoj-backend-judge-service
    container_name: judge-service
    ports:
      - '8104:8104'
    networks:
      - backend_net

  yuoj-backend-gateway:
    build: ./yuoj-backend-gateway
    container_name: gateway-service
    ports:
      - '8101:8101'
    networks:
      - backend_net

volumes:
  mysql_data:

networks:
  backend_net:
    driver: bridge
相关推荐
鲁正杰1 小时前
在一个服务器上抓取 Docker 镜像并在另一个服务器上运行
运维·服务器·docker
F-2H1 小时前
C语言:指针4(常量指针和指针常量及动态内存分配)
java·linux·c语言·开发语言·前端·c++
苹果酱05671 小时前
「Mysql优化大师一」mysql服务性能剖析工具
java·vue.js·spring boot·mysql·课程设计
老大白菜2 小时前
Windows 11 安装 Dify 完整指南 非docker环境
windows·docker·容器
_oP_i2 小时前
Pinpoint 是一个开源的分布式追踪系统
java·分布式·开源
mmsx2 小时前
android sqlite 数据库简单封装示例(java)
android·java·数据库
武子康3 小时前
大数据-258 离线数仓 - Griffin架构 配置安装 Livy 架构设计 解压配置 Hadoop Hive
java·大数据·数据仓库·hive·hadoop·架构
豪宇刘4 小时前
MyBatis的面试题以及详细解答二
java·servlet·tomcat
秋恬意4 小时前
Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别
java·数据库·mybatis
FF在路上5 小时前
Knife4j调试实体类传参扁平化模式修改:default-flat-param-object: true
java·开发语言