构建Spring boot 项目为Docker镜像并发布到仓库
第一步:编译Spring boot 项目为 jar 文件
此处为了减少等待时间,忽略了单元测试;实际生产环境中不应跳过单元测试;
mvn clean package -DskipTests=true
第二步:编写Dockerfile包含运行环境和jar文件
# 使用官方的OpenJDK镜像作为基础镜像
FROM openjdk:11-jre-slim
RUN apt update && apt install -y fontconfig
ARG app=xifei-server
# 设置工作目录
WORKDIR ${workdir}
## 将后端项目的 Jar 文件,复制到镜像中
COPY ./target/${app}.jar /app/server.jar
## 设置 TZ 时区
## 设置 JAVA_OPTS 环境变量,可通过 docker run -e "JAVA_OPTS=" 进行覆盖
ENV TZ=Asia/Shanghai JAVA_OPTS="-Duser.timezone=Asia/Shanghai -Xms512m -Xmx8192m -XX:+HeapDumpOnOutOfMemoryError" PROFILES_ACTIVE="" ARGUMENTS="" MYSQL_HOST=localhost:3306 MYSQL_DBNAME="" MYSQL_USER="" MYSQL_PWD="" REDIS_HOST=localhost REDIS_DB=0 REDIS_PORT=6379 REDIS_PWD=""
## 暴露后端项目的 48080 端口
EXPOSE 48080
## 启动后端项目
CMD java ${JAVA_OPTS} -Djava.security.egd=file:/dev/./urandom -jar /app/server.jar --spring.profiles.active=$PROFILES_ACTIVE $ARGUMENTS
第三步:编译为镜像,推送到仓库
docker buildx build -t xfky-server:latest --platform linux/amd64,linux/arm64 --build-arg app=xifei-server xifei-server
docker tag xifei-server:latest 192.168.0.200:5000/xifei-server:latest
docker push 192.168.0.200:5000/xifei-server
部署项目的镜像到K8S集群中
第一步:创建命名空间
kubectl create namespace xfky
也可以使用 yaml文件方式创建 kubectl apply -f xxx.yaml
:
apiVersion: v1
kind: Namespace
metadata:
name: xfky
第二步:创建Secret以及ConfigMap来保存配置
此处需要注意,data里面每一项的value都必须是base64编码过的
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: xfky-server-secret
namespace: xfky
data:
MYSQL_HOST: MTkyLjE2OC4wLjIwMDozMzA2
MYSQL_DBNAME: eGZreV9kZXY=
MYSQL_USER: eGlmZWk=
MYSQL_PWD: MTIzNDU2Nzg=
REDIS_HOST: MTkyLjE2OC4wLjIwMA==
REDIS_PORT: NjM3OQ==
REDIS_DB: MA==
REDIS_PWD: MTIzNDU2Nzg=
第三步 创建 Deployment
此时就需要创建应用以及应用用到的所有其他服务的Deployment的,如果使用的是已经存在的数据库或者Redis则不需要再创建,直接在上述的配置中配置已有的链接和密码即可。
为了减少篇幅,此处我仅演示已有MySQL和Redis服务器的情况下,仅部署应用Service,对于MySQL和Redis等服务的K8s部署计划可以单独列一个文章写。
因为考虑到应用中有上传文件的功能,为了保证文件被持久保存,所以需要先创建 PV 和 PVC,磁盘我这里用的是NFS的,如果你也可需要配置NFS 的 Storage Class,可以自己配置。
NFS 的 PV:
apiVersion: v1
kind: PersistentVolume
metadata:
name: xfky-server-pv
namespace: xfky
spec:
capacity:
storage: 2Gi
accessModes:
- ReadWriteOnce
storageClassName: nfs-storageclass
mountOptions:
- hard
- nfsvers=3
nfs:
server: 192.168.0.135
path: /nfs/k8s/xfky-server/data
下面是创建应用服务对应的Deployment 的YAML:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: xfky-server-pvc
namespace: xfky
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 2Gi
storageClassName: nfs-storageclass
volumeMode: Filesystem
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: xfky-server
namespace: xfky
labels:
app: xfky-server
spec:
replicas: 2
strategy:
type: RollingUpdate
selector:
matchLabels:
app: xfky-server
template:
metadata:
namespace: xfky
name: xfky-server
labels:
app: xfky-server
spec:
containers:
- name: xfky-server
image: 192.168.0.200:5000/xfky-server:latest
imagePullPolicy: Always
ports:
- containerPort: 48080
envFrom:
- secretRef:
name: xfky-server-secret
env:
- name: HTTP_PORT
value: '48080'
- name: ARGUMENTS
value: '' # 执行 Spring Boot main 方法传递的参数
- name: PROFILES_ACTIVE
value: dev,debug
volumeMounts:
- mountPath: /data
name: xfky-server-data
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 48080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 10
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 48080
scheme: HTTP
initialDelaySeconds: 30
timeoutSeconds: 10
periodSeconds: 10
successThreshold: 1
failureThreshold: 3
volumes:
- name: xfky-server-data
persistentVolumeClaim:
claimName: xfky-server-pvc
restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
name: xfky-server-service
namespace: xfky
spec:
type: ClusterIP
selector:
app: xfky-server
ports:
- name: http
port: 80
targetPort: 48080
第四步 在Gateway 上配置服务和域名绑定,暴露服务
我这里用的是 apisix 做的配置,所以比较简单,配置上游使用到完整的服务名 xfky-server-service.xfky.svc.cluster.local
和 对应的域名后,域名解析到 apisix 的 geteway上就可以了。apisix目前我还不是特别熟悉,有学习到高级的用法后再写文章分享出来。
了解 工作生活心情记忆 的更多信息
Subscribe to get the latest posts sent to your email.