Skip to main content

Docker 部署spring boot

执行流程:maven打包,dockerfile构建镜像,docker-compose编排容器,最终启动docker-compose构建服务

Maven打包

![image-20241204113532179](./assets/Docker 部署Springboot多模块服务/image-20241204113532179.png)

以下是 Maven 中一些常用的命令及其说明,整理成表格输出:

命令说明
mvn clean清理 Maven 项目产生的编译结果和临时文件
mvn compile编译 Maven 项目
mvn test运行 Maven 项目的单元测试
mvn package打包 Maven 项目(通常为 JAR 或 WAR 文件)
mvn install将 Maven 项目构建结果安装到本地仓库
mvn deploy将 Maven 项目构建结果发布到远程仓库

docker打包镜像Image

主要还是通过Dockerfile实现

dockerfile文件是根据他的特定语法生成的,语法关键字有FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD,使用说明如下:

关键字作用
FROM指定基础镜像,构建新镜像的起点。
LABEL设置镜像的元数据信息,包括维护者信息。
RUN执行命令,用于安装软件、配置环境等。
CMD容器启动时默认执行的命令,可以被覆盖。
EXPOSE声明容器运行时监听的端口,不会实际发布端口。
ENV设置环境变量。
ADD将文件添加到镜像中,自动处理 URL 和解压压缩文件。
COPY复制新文件或目录到镜像中,不会处理 URL 或解压压缩文件。
ENTRYPOINT容器启动时执行的命令,可以被 CMD 指令覆盖。
VOLUME创建挂载点,用于数据持久化。
USER指定运行容器时的用户。
WORKDIR设置工作目录。
ONBUILD当构建一个被继承的 Dockerfile 时,这些指令会被自动执行。
# Base images 基础镜像
FROM centos

#MAINTAINER 作者姓名和邮箱
MAINTAINER zqf<92973322@qq.com>

#ENV 设置环境变量,可通过 $变量名 引用
ENV PATH /usr/local/nginx/sbin:$PATH

#ADD 文件放在当前目录下,拷过去会自动解压,这与COPY命令差不多,区别是COPY不会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/

#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www

#WORKDIR 相当于cd,登录时切换到的目录
WORKDIR /usr/local/nginx-1.8.0

RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install

RUN echo "daemon off;" >> /etc/nginx.conf

#挂在数据卷
VOLUME /data : /usr

#镜像被子镜像继承后构建时,运行的命令
ONBUILD ["nginx"]
#EXPOSE 映射端口
EXPOSE 80

#CMD 容器启动时要运行的命令,如果有多个CMD则前面的会被覆盖,也会被dockr run 后面的脚本参数替换
CMD ["nginx"]

#容器启动时要运行的命令,有多个时会追加执行命令,而不会CMD那样被覆盖
ENTRYPOINT ["nginx"]

Maven集成docker插件完成镜像打包推送

一、配置Docker服务器

  高版本的Idea默认已经集成了Docker插件,我们只需要按图配置好Docker服务器即可。因为dockerfile-maven-plugin插件的作用只是避免我们直接进行Docker操作,最终的镜像构建还得是docker服务器来完成,因此需要为插件指定Docker服务器。下图的TCP套接字链接到Docker服务器开放远程端口,通过对该端口发送相关指令来完成镜像的构建。

![img](./assets/Docker 部署Springboot多模块服务/1428261-20231219152632950-1137170600.png)

 完成以上配置后,可以在Idea的服务窗口看到已经链接到Docker服务器的Docker服务,可以直接在该界面进行docker命令操作,如图:

![img](./assets/Docker 部署Springboot多模块服务/1428261-20231219155701974-1621140411.png)

二、配置DOCKER_HOST环境变量

  mvn命令的执行方式有cmd窗口、Idea的终端、Idea集成maven插件窗口3种,这3种方式运行mvn dockerfile 打包命令依赖于DOCKER_HOST环境变量来查找Docker服务器。如果不配置该环境变量,则默认使用本地的Docker服务器,如果本地没有安装,则会引发找不到Docker引擎的异常。

三、配置dockerfile-maven-plugin插件

  在maven的根pom.xml中的build.plugins节点下添加dockerfile-maven-plugin插件的配置。

           <!-- docker打包插件,groupId、artifactId、version表示插件自生的版本信息 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-plugin.version}</version>
<configuration>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth> <!-- 是否使用maven配置(仓库账号密码)来进行推送认证 -->
<repository>${docker.image.prefix}/qrcode-admin</repository> <!-- 指定镜像构建后要推送的仓库地址 -->
<tag>1.1.0_prod</tag> <!-- 指定构建镜像的版本tag -->
<buildArgs> <!-- 构建参数,该节点下的参数将在构建时传递给Dockerfile文件,与文件中ARG声明的变量对应 -->
<JAR_FILE>target/qrcode-admin.jar</JAR_FILE>
</buildArgs>
<skipTags>true</skipTags> <!-- 跳过默认标记 -->
<useCache>false</useCache> <!-- 关闭缓存机制 -->
<forceTag>true</forceTag> <!-- 强制创建新标记 -->
<verbose>true</verbose> <!-- 输出更详细信息 -->
<pushImage>true</pushImage> <!-- 是否将镜像推送到Docker Registry -->
<contextDirectory>/path/</contextDirectory> <!-- 指定构建的上下文目录,该目录中的文件和目录会被复制到Docker镜像中。默认情况下dockerfile-maven-plugin会将Maven项目的根目录作为构建上下文目录-->
<dockerfile>src/main/docker/Dockerfile</dockerfile><!-- Dockerfile所在目录路径 -->
<additionalBuildArgs>--no-cache=true --pull=true</additionalBuildArgs> <!-- 添加其他构建参数 -->
</configuration>
</plugin>

三、编写Dockerfile文件并放入指定目录

 根据实际需求编写Dockerfile文件后,应该将Dockerfile文件应该放在Maven项目的根目录下或者src/main/docker目录下,这是默认的dockerfile-maven-plugin所查找的路径。如果不在这两个目录下,则需要使用configuration.dockerfile标签指定文件的路径。以下是dockerfile文件示例:

FROM openjdk:8-jre
MAINTAINER sjht xxx@qq.com

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo "Asia/Shanghai" > /etc/timezone

ARG JAR_FILE
COPY ${JAR_FILE} /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]

 ### 四、绑定Docker命令到Maven的生命周期

  maven本质上是只是一个插件框架,它的核心并不执行任何具体的构建任务,全部任务都是由插件来完成的。构建过程的每一个步骤都都对应一个插件来负责,例如清理阶段由内置插件maven-clean-plugin的目标clean完成清理操作。Maven提供了Build plugins、Reporting plugins两种类型的插件。Build plugins在构建时执行,Reporting plugins在网站生成过程中执行。

  使用插件时需要先明确插件的目标是什么?在maven生命周期哪个阶段执行?dockerfile-maven-plugin插件的目标有build 、tag和push:

  • mvn dockerfile:build 通过dockerfile文件构建镜像(需要在docker服务器中执行)。

  • mvn dockerfile:tag:使用指定的tag给已经build镜像打标签。

  • mvn dockerfile:push :推送镜像到docker镜像仓库(需要配置docker镜像仓库地址并登录)。

     插件目标和生命周期绑定是通过executions节点配置来完成的,举例如下:

            <!-- docker打包插件 -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<version>${dockerfile-maven-plugin.version}</version>
<configuration>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<repository>${docker.image.prefix}/qrcode-admin</repository>
<tag>1.1.5_xxx</tag>
<buildArgs>
<JAR_FILE>target/qrcode-admin.jar</JAR_FILE>
</buildArgs>
</configuration>
<executions> <!-- 插件目标执行集合 -->
<execution> <!-- 表示一个具体的插件目标执行 -->
<id>build</id> <!-- 用于唯一标识一个执行 -->
<phase>install</phase> <!-- 指定插件目标应该何时执行,即绑定的生命周期阶段,compile、test、package等 -->
<goals> <!-- 指定要执行的插件目标集合 -->
<goal>build</goal> <!-- 指定要执行的插件目标名称 -->
</goals>
<configuration>
</configuration>
</execution>
</executions>
</plugin>

  配置完成后执行maven生命周期方法时该插件目标便会自动运行,如图:

![img](./assets/Docker 部署Springboot多模块服务/1428261-20231220174730141-1441327164.png)

四、运行mvn dockerfile命令

  • mvn clean install package:项目的清理、安装、打包命令。
  • mvn dockerfile:build:通过dockerfile文件构建镜像。
  • mvn dockerfile:push:推送镜像到仓库。
  • mvn dockerfile:tag:使用指定的tag给已经build镜像打标签。