建议学习本博客之前,需要对docke的基本命令有过学习;
目录
- 前言
- 1、项目打包
- 2、编写Dockerfile文件
- 2.1、单个jar部署
- 🍕Dockerfile文件常用命令
- 2.2.1、编写一个Dockerfile 文件格式制作镜像
- 2.1.2、执行docker命令
- 2.2、多个jar一起部署到docker
- 2.2.1、编写start.sh启动文件
- 2.2.2、编写Dockerfile文件
- 2.2.3、执行docker命令
前言
该方式适用于jar包较少时,项目复杂度不高时使用,如果部署的比较多的话还是建议使用docker的编码工具Docker Compose或者k8s进行统一部署
1、项目打包
如果项目配置文件中有配置文件的ip地址是
localhost的
需要改为时间的IP地址
先把项目打成jar包,注意配置spring boot的maven打包
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- Maven Compiler Plugin -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- 在此处添加任何其他 Maven 编译插件的配置,如果需要的话 -->
</plugin>
</plugins>
</build>
避免在jar执行时出现如:servier-gateway-1.0.jar中没有主清单属性
、找不到或无法加载主类
等错误,打包完成后可以先在本地执行 java -jar xxx.jar
运行一下jar包,先在本地确保可以正常运行先。
2、编写Dockerfile文件
2.1、单个jar部署
🍕Dockerfile文件常用命令
命令 | 描述 |
---|---|
FROM | 指定基础镜像,用于构建新的镜像。 |
COPY | 将文件从宿主机复制到容器中。 |
ADD | 类似于COPY,但支持远程文件和自动解压缩。 |
RUN | 在镜像中运行命令,用于安装软件包和执行其他构建任务。 |
CMD | 定义容器启动时要执行的命令,只能有一个CMD命令,如果有多个,只有最后一个会生效。 |
ENTRYPOINT | 定义容器启动时要执行的命令,与CMD不同的是,ENTRYPOINT的参数不会被覆盖。 |
ENV | 设置环境变量,用于配置容器的运行环境。 |
WORKDIR | 设置容器内的工作目录,后续命令将在该目录下执行。 |
EXPOSE | 声明容器在运行时监听的端口,但并不映射端口到主机。 |
VOLUME | 创建一个挂载点,用于持久化数据。 |
2.2.1、编写一个Dockerfile 文件格式制作镜像
# 使用一个基础的 Java 镜像(根据自己项目中使用的是什么jdk版本设置,用于拉取执行jar包的jdk环境)
FROM openjdk:8-jdk-alpine
# 指定工作目录
VOLUME /tmp
# 复制应用程序的 JAR 文件到镜像中(需要时相对路径)
ADD ./servier-gateway/target/servier-gateway.jar servier-gateway.jar
# 定义容器启动时执行的命令
ENTRYPOINT ["java","-jar","servier-gateway.jar","&"]
2.1.2、执行docker命令
-
拉取生成镜像
docker build -t 对应着jar包的名字:版本(可以自己定) Dockerfile文件的路径,点是代表当前文件夹
docker build -t service-gateway:1.0.0 .
-
查看docker里面的镜像 :
docker images
-
创建容器
docker run -d --name servier-gateway -p 8200:8200 a0e2430dd36f -t
-
查看容器是否启动成功
-
启动成功之后,可以访问对应的端口进行查看验证
2.2、多个jar一起部署到docker
如果是有多个服务需要部署,则可以统一写在一个Dockerfile
文件里,可以减少麻烦
格式如下:通过创建一个启动脚步(start.sh
),在其中启动多个jar包;然后在 Dockerfile 中使用 CMD
指令来运行这个启动脚本。
2.2.1、编写start.sh启动文件
这种启动脚本的好处是它允许你在同一个容器中同时启动多个应用程序,这对于某些复杂的应用程序架构可能很有用。每个应用程序在后台运行,容器保持活跃,直到你手动停止容器。
java -jar service-sys.jar &
:命令表示以 Java 命令运行service-sys.jar
文件,&
符号表示在后台运行,以便同时启动多个应用程序。tail -f /dev/null
:用于防止容器在应用程序启动后立即退出,tail -f /dev/null
命令会持续监视/dev/null
文件(一个空文件);这是因为容器在主进程退出时会停止,但在这种情况下,tail
命令会一直运行,使容器保持活跃。
#!/bin/sh
# 启动多个JAR包,每个JAR包后台运行
java -jar service-activity.jar &
java -jar service-product.jar &
java -jar service-sys.jar &
java -jar service-user.jar &
# 保持容器运行
tail -f /dev/null
2.2.2、编写Dockerfile文件
# 使用一个基础的 Java 镜像
FROM openjdk:8-jdk-alpine
# 指定工作目录
WORKDIR /tmp
# 复制应用程序的 JAR 文件到镜像中的根路径下
COPY ./service-activity/target/service-activity.jar service-activity.jar
COPY ./service-product/target/service-product.jar service-product.jar
COPY ./service-sys/target/service-sys.jar service-sys.jar
COPY ./service-user/target/service-user.jar service-user.jar
# 定义容器启动时执行的命令
COPY start.sh start.sh
# 赋予启动脚本可执行权限
RUN chmod +x start.sh
# 定义容器启动时执行的命令
CMD ["./start.sh"]
2.2.3、执行docker命令
-
拉取下载镜像(同上)
docker build -t my-image .
-
查看镜像
docker images
-
创建容器
通过这个镜像为每个jar包创建容器,可以通过这个镜像分别为不同jar包创建容器
docker run -d -p 8205:8205 --name service-activity my-image java -jar service-activity.jar
docker run -d -p 8203:8203 --name service-product my-image java -jar service-product.jar
docker run -d -p 8202:8202 --name service-sys my-image java -jar service-sys.jar
docker run -d -p 8206:8206 --name service-user my-image java -jar service-user.jar
- 查看容器是否启动成功
docker ps