使用docker部署SpringBoot微服务项目
1. 搭建部署环境
- 操作系统:win11-WSL2-debian
- docker版本:Docker version 25.0.3
- jdk版本:jdk17.0.8
- SpringBoot版本:
2. 准备运行jar包的专属镜像
-
首先进入WSL2-bebian中,创建的文件夹APP-0
-
在文件夹中放入Dockerfile、jdk包、字体文件
获取jdk文件:
wget https://download.oracle.com/java/17/archive/jdk-17.0.8_linux-x64_bin.tar.gz
获取字体文件:
直接下载:字体包链接 ,密码:fyxy
下载后,在APP-0文件夹中创建font文件夹,将字体包中的ttc都放入font文件夹中
编写Dockerfile文件(这里推荐用vscode在wsl中打开,直接编写)首先,在APP-0中创建一个Dockerfile(名字不要打错,否则后续创建容器会失败)
touch Dockerfile
在Dockerfile中写入下面的内容
# 使用Linux发行版作为基础镜像 FROM centos:7 #字体库安装 # RUN yum -y install fontconfig RUN mkdir -p /usr/share/fonts/ # COPY ./font/simsun.ttc /usr/share/fonts/ COPY ./font/msyh.ttc /usr/share/fonts/ COPY ./font/msyhbd.ttc /usr/share/fonts/ COPY ./font/msyhl.ttc /usr/share/fonts/ RUN chmod 755 /usr/share/fonts/* # RUN fc-cache -fv #JDK安装 # 解压JDK压缩包 ADD jdk-17.0.8_linux-x64_bin.tar.gz /usr/local # 设置JAVA_HOME环境变量 ENV JAVA_HOME=/usr/local/jdk-17.0.8/ # 将JDK的bin目录添加到PATH环境变量中 ENV CLASSPATH=.:$JAVA_HOME/lib/jrt-fs.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH=$PATH:$JAVA_HOME/bin #校准容器时间 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/timezone #切换容器字体编码 RUN localedef -c -f UTF-8 -i zh_CN zh_CN.utf8 RUN echo 'LANG="zh_CN.UTF-8"' > /etc/locale.conf ENV LANG zh_CN.UTF-8 ENV LC_ALL zh_CN.UTF-8 #回到主目录, 授权root WORKDIR / USER root
-
生成镜像,在APP-0下运行
docker build -t='jdk:17.0.8' .
-
检查镜像是否成功生成
如图所示,jdk:17.0.8镜像成功生成
3. 修改镜像
如果,你对当前生成的镜像不满意,可以现启动镜像,然后在生成的容器中进行修改
- 启动镜像,生成容器
docker run -di --name jdk17 -d jdk:17.0.8
- 进入容器
docker exec -it jdk17 /bin/bash
- 修改容器中的软件源为阿里源
这一步可能因为容器中没有wget命令,无法执行,可以现在外部下载Centos-7.repo,然后放到容器中/etc/yum.repos.d下,并重命名为CentOS-Base.repowget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
- 安装fontconfig
yum install fontconfig
fc-cache -fv
- 验证容器中的jdk版本是否正确
java --version
-
将运行中的容器打包成自己的镜像
详情可查看Docker 使用-将容器打成镜像
生成镜像:
docker commit -a "liangyi" -m "创建含有java17.0.8的镜像" bfdc275777e6 jdk17.0.8:v0
检查镜像是否生成:
4. 准备SpringBoot项目的jar包
随便创建一个就行
5. 在jar所在的文件夹创建Dockerfile
Dockerfile内容如下:
# 使用本地的jdk17.0.8:v0镜像
FROM jdk17.0.8:v0
# 创建工作目录
RUN mkdir /business
# 将jar包复制到镜像中
COPY ./business.jar /business/app.jar
# 设置工作目录
WORKDIR /business
# 暴露容器端口
EXPOSE 12802
# 运行business.jar
ENTRYPOINT [ "java", "-jar", "/business/app.jar" ]
6.创建运行jar包的容器
docker build -t your_image_name .
7.创建运行jar包的镜像并且启动
docker run -p 12802:12802 --name your_container_name your_image_name
补充1:将ENTRYPOINT 中执行的命令替换为一个运行的脚本
ENTRYPOINT 作为每次启动容器的入口,如果想要选择执行一些复杂的命令,可以选择使用可执行脚本来替换原先的
**ENTRYPOINT [ "java", "-jar", "/business/app.jar" ]**
替换为 runApp.sh(如下所示),这样就可以更加灵活地定义入口命令
#!/bin/bash
echo "-----------开始启动business服务-------------"
# 检查jar包是否存在
jar_path_original="/business/jar_file/business.jar"
jar_path_last="/jar_file/business.jar"
jar_path=""
if [ -f "$jar_path_last" ]; then
jar_path=$jar_path_last
else
jar_path=$jar_path_original
fi
echo $jar_path
# 运行jar文件夹
java -jar $jar_path
同时,也要记得将Dockerfile修改为如下所示:
# 使用本地的jdk17.0.8:v0镜像
FROM jdk17.0.8:v0
# 将运行服务的脚本复制到镜像中
COPY ./runApp.sh /business/app/bin/runApp.sh
COPY ./jar_file/business.jar /business/jar_file/business.jar
# 赋予文件运行可执行权限
RUN chmod +x /business/app/bin/runApp.sh
# 设置工作目录
WORKDIR /business
# 暴露容器端口
EXPOSE 12802
# 运行business.jar
ENTRYPOINT ["/business/app/bin/runApp.sh" ]
补充2:将宿主机的目录挂在到容器内部
在实际的运行容器的过程中,我们很快就能发现一个问题:
如果我想要更新我的jar包的话,就只能重新生成镜像,然后重新生成容器,如果想要只替换jar包应该如何呢?
我找到两个办法:
- 在宿主机其他的机器上建立一个nginx站点,将每次更新的jar包放到nginx站点上,然后使用在runApp.sh中的java -jar 命令执行之前,执行wget命令来获取更新后的jar包(比较繁琐,这里不做过多介绍)
- 在执行docker run 命令的时.执行: -v 宿主机文件夹:容器文件夹
这样就能实现宿主机和容器内文件夹的同步,我们可以把新打包好的jar包放在这里,以后每次启动容器的时候都执行这里的jar包docker run -p 12802:12802 --name business -v /home/ly/train_environment/business/jar_file:/jar_file train_busines
参考:
使用docker构建jdk17镜像
Docker 使用-将容器打成镜像
CentOS7配置阿里云镜像源(超详细过程)
Docker第七篇-Docker挂载Volume数据卷