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**
容器编排和自动化部署工具
-
本地部署(部署准备)
-
先装
docker Desktop
可视化工具 管理docker容器 -
梳理服务部署表格
| 服务名称 | 英文名 | 端口号 | 版本号 | 服务类别 |
| --- | --- | --- | --- | --- |
| 数据库 | mysql | 3306 | v8 | 环境依赖 |
| 缓存 | redis | 63791 | v6 | 环境依赖 |
| 消息队列 | rabbitmq | 5672,15672 | v3.12.6 | 环境依赖 |
| 注册中心 | nacos | 8848 | v2.2.0 | 环境依赖 |
| 网关服务 | gateway | 8101 | java8 | 业务服务 |
| 用户服务 | user-service | 8102 | java8 | 业务服务 |
-
一键打包
- 父模块配置
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包的启动,没问题再进行后续的操作
- 给每一个服务编写
Dockerfile
文件(定义了容器镜像制作过程的文件) target同级目录下创建Dockerfile
shell
# 基础镜像
FROM openjdk:8-jdk-alpine
# 指定工作目录
WORKDIR /app
# 将 jar包添加到工作目录
ADD target/*.jar
## EXPOSE指令暴露了容器内的8080端口。
EXPOSE 8080
-
编写
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