Docker部署Spring Boot项目
Docker 是一个平台即服务的产品(PaaS),使用操作系统级虚拟的容器化技术帮助用户实现软件服务以互相隔离的形式高效运行。在立刻使用之前需要知道三个基本概念:
可以简单地把镜像理解为一个可执行程序,容器是运行中的进程。开发人员在完成软件的开发之后,需要将原工程打包成镜像,在这个过程中需要依赖 Dockerfile,它起到一个类似于清单的作用。
基于 Docker 进行发布与部署之前需要完成 Docker 环境的部署,具体流程因不同操作系统而存在差异。
完成 Docker 环境部署后,可以着手开始进行发布与部署。流程如下:
(1)在项目的 pom.xml 中插入以下内容,之后通过命令 mvn package 将项目以 Jar 形式打包。
(2)于项目工程的根目录编写 Dockerfile,示例如下:
Dockerfile 的内容主要用于描述构建一份 Docker 镜像所需要做的配置,下面对以上内容做出简单的解释:
(3)在 Dockerfile 文件的存放目录下,执行构建命令。
图1 Docker镜像构建过程
(4)将构建好的镜像推送至镜像仓库进行管理。推送前需要保证已完成仓库的登录,登录命令如下:
- Dockerfile。
- 镜像。
- 容器。
可以简单地把镜像理解为一个可执行程序,容器是运行中的进程。开发人员在完成软件的开发之后,需要将原工程打包成镜像,在这个过程中需要依赖 Dockerfile,它起到一个类似于清单的作用。
基于 Docker 进行发布与部署之前需要完成 Docker 环境的部署,具体流程因不同操作系统而存在差异。
完成 Docker 环境部署后,可以着手开始进行发布与部署。流程如下:
(1)在项目的 pom.xml 中插入以下内容,之后通过命令 mvn package 将项目以 Jar 形式打包。
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactld>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
(2)于项目工程的根目录编写 Dockerfile,示例如下:
FROM openjdk:8-jdk-alpine
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
Dockerfile 的内容主要用于描述构建一份 Docker 镜像所需要做的配置,下面对以上内容做出简单的解释:
- FROM:该定制镜像是基于 openjdk:8-jdk-alpine 的,后续的工作都是在该基础镜像上完成以得出所需的定制镜像。
- RUN:用于执行后续的命令。示例中的命令表示将添加名为 spring 的用户以及用户组,用于规避使用 root 用户运行服务将面对的风险。
- USER:用于指定运行服务的用户。
- ARG:声明构建参数。
- COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径。
- ENTRYPOINT:执行指令。使用方式 ENTRYPOINT ["<executable>","<par-am1>","<param2>",...],将参数内容发送至目标程序 executable,执行目标程序。
(3)在 Dockerfile 文件的存放目录下,执行构建命令。
docker build -t demo:v1 .
注意:命令的结尾有一个“.”,代表本次执行的上下文路径。
demo 与 v1 分别代表镜像的名称以及镜像的标签,构建过程如图 1 所示。图1 Docker镜像构建过程
(4)将构建好的镜像推送至镜像仓库进行管理。推送前需要保证已完成仓库的登录,登录命令如下:
docker login
推送命令如下:docker push
(5)在需要部署服务的机器上部署好 Docker 环境,通过拉取命令拉取仓库中的服务镜像。拉取命令如下:docker pull
(6)使用启动命令以启动镜像对应的容器。启动命令如下:docker run -p 8080:8080 demo/v1
至此,基于 Docker 的发布与部署便完成了。像这样的部署方式相较于基础的部署流程,减少了手工维护的程度,这样可以更方便地实现标准化和规范化。