前言
阅读本文前,你需要了解Maven,Docker,K8S等一些基本知识,本文涉及内容并没有什么难度,所以只要求一些基本知识即可。
大家阅读后,要懂得举一反三,后续基本对Java Web项目你都可以用文中的方法进行部署。如果有更好的办法,欢迎大家一起交流。
标识符
1. 指令中 [xxx] 内容均作为补充,可删除
2. 指令中 <xxx> 内容均需要根据自己的实际情况进行替换
正文
一、检查项目
1. 检查项目是否是一个Maven项目,如果不是,则请使用其他方式进行打包,目的是得到项目工程的可运行 jar 包。
2. 通过检查之后,对项目进行打包,可使用以下指令:
mvn clean package [-DskipTests]
-DskipTests 用来跳过测试,比如跳过Junit用例的执行等。
结果:如果你的项目是一个Java Web项目,那么你打完包应该会产生一个可执行的jar包。如果没有特殊设置,一般会存放在项目工程的 target目录 下。
3. 为工程创建 Dockerfile 文件,文件名为 Dockerfile
该文件是 docker 打镜像时候会使用到,里面主要是一些配置,脚本等等。如果想要具体了解,搜索引擎你值得拥有。
Dockerfile内容大致如下:
# 基础环境, 你可以理解为一个linux系统, 里面已经安装好比如jdk等足以支撑你的jar包运行的环境。可以从Docker官方仓库获取到哦,大家根据自己实际情况选择即可,本文选的是jdk8的环境
FROM openjdk:8-jdk-alpine
# 执行指令,新建一个文件夹
RUN mkdir -p /workdir
# 将新建的文件夹作为工作目录
WORKDIR /workdir
# JavaWeb工程暴露的服务接口
EXPOSE 9000
# 将项目工程打包生成的jar包添加到当前工作目录下,并重命名为 app.jar
ADD ./target/demo.jar ./app.jar
# 入口点,可以理解为到时镜像启动执行的指令
# -Djava.security.egd=file:/dev/./urandom 这个非必需,主要用来加快大量随机数的性能
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
# 该示例比较简单,但足够使用,除此之外,你还可以添加比如时区的设置,做更多的bash操作等等都可以
4. Dockerfile文件准备好后就可以打包Docker镜像了。
注意:
1)docker相关命令要求大家本地要安装docker的环境。可以直接到官网下载Docker Desktop直接安装即可。
2)Dockerfile文件我是放在项目工程的根目录下,你也可以放到其他地方,命令执行时通过 -f 进行指定即可,Dockerfile 里面的涉及到的路径可能需要进行改动。
执行一下命令进行打包:
# 由于我不指定Dockerfile,默认是在当前目录下,而且Dockerfile内容涉及到的路径都是以根目录为基准配置的,所以需要先cd到工程根目录下再执行
# 注意命令后面的 . 不要遗漏
docker build -t <Docker镜像名>:<Docker镜像版本号> .
5. 打镜像完成后,就可以将镜像推送到镜像仓库,到时k8s部署的时候从这个仓库拉取镜像即可。
# ============================================
# 以下指令供检查前一步骤打的镜像满不满足要求所使用
# ============================================
# 查看Docker镜像列表
docker images
# 如果镜像不满足要求,需要打tag
# 要求是:镜像名格式需要是 <镜像要推送到的镜像仓库的地址>,版本号根据实际需要设置即可
docker tag <源镜像名称>:<源镜像版本号> <目标镜像名称>:<目标镜像版本号>
# 比如我要推送的镜像仓库是 yushunyun-docker.pkg.coding.net/xxx,然后我打的镜像名称是demo,版本号1.0.0
# 那么我就得把我的镜像名设置成 yushunyun-docker.pkg.coding.net/xxx/demon,版本号1.0.0
# 只需执行 docker tag demo:1.0.0 yushunyun-docker.pkg.coding.net/xxx/demon:1.0.0 即可
# 以上情况可以规避,在打包镜像的时候直接将镜像名称设置正确就可以,这样不用再打一次tag
# ============================================
# 以下指令为推镜像仓库正常使用
# ============================================
# 如果你之前没有登录过你要将镜像推到的镜像仓库或者镜像仓库缓存的认证信息失效了,需要先登录远程的镜像仓库,具体以大家使用的镜像仓库为准
docker login -u <镜像仓库访问的用户名> -p <镜像仓库访问的用户密码> <镜像仓库地址>
# 登录完成之后执行推镜像操作
docker push <镜像名称>:<镜像版本号>
6. 镜像已经推到远程镜像仓库之后,开始部署操作。远程登录到 K8S 节点上进行操作。
创建 deployment.yaml 文件,我们通过 yaml 文件创建 K8S 的Pod将我们的镜像运行起来。
deployment.yaml文件内容大致如下:如果要详细了解,搜索引擎或K8S官方文档你值得拥有
apiVersion: apps/v1
kind: Deployment
metadata:
name: <一般为服务名>
spec:
minReadySeconds: 0
paused: false
# pod初始化节点数
replicas: 1
revisionHistoryLimit: 2
selector:
matchLabels:
name: <一般为服务名>
template:
metadata:
labels:
name: <一般为服务名>
spec:
containers:
# 容器启动的一些参数,根据实际情况设置即可
- args:
- '-Xmx512m'
- '-Xloggc:/jvmgc.log'
- '-XX:+PrintGCDetails'
- '-XX:+PrintGCDateStamps'
- '-XX:+PrintGCCause'
- '-XX:+PrintHeapAtGC'
- '-jar'
# 执行的jar包路径,具体以Dockerfile里面的配置为准
- /workdir/app.jar
command:
- java
# 镜像地址
image: 'yushunyun-docker.pkg.coding.net/xxx/demo:1.0.0'
imagePullPolicy: Always
name: <一般为服务名>
ports:
- containerPort: <容器端口>
protocol: TCP
readinessProbe:
exec:
command:
- /bin/sh
- '-c'
- nc -z localhost <容器端口>
failureThreshold: 3
initialDelaySeconds: 45
periodSeconds: 5
successThreshold: 1
timeoutSeconds: 3
resources:
limits:
cpu: 512m
memory: 1024Mi
requests:
cpu: 100m
memory: 128Mi
# 启动时拉取镜像用的认证信息
# 可以通过 kubectl create secret 执行进行创建,这里不赘述,不然拉取私有仓库镜像会401
# 无需鉴权的镜像仓库无需配置
imagePullSecrets:
- name: <拉取镜像的认证名称>
7. 创建 Pod,运行服务
kubectl create -f <deployment配置文件名> -n <命名空间>
# 如果要删除Pod可以使用
# kubectl delete -f <deployment配置文件名> -n <命名空间>
# 如果要查看Pod列表
# kubectl get pod -n <命名空间>
# 如果要查看Pod情况
# kubectl describe pod <Pod名称> -n <命名空间>
# 如果要查看Pod日志
# kubectl logs -n <命名空间> --tail 2000 -f <Pod名称>
# 以上指令基本可以满足你的部署过程
# 当然,Pod部署成功之后,验证服务是否可以正常使用也是需要的,这里就不展开说了。
# 可能你需要配置Service暴露端口,可能需要设置防火墙等等,具体大家走搜索引擎吧。牵你入门就到这里了,感谢你看到最后。
作者有话说:如果有幸帮助到你,麻烦给个赞,给个收藏,给个关注,感谢!你的赞,收藏和关注是我的动力源泉