使用DockerCompose部署SpringBoot项目

2023-12-22 15:18

本文主要是介绍使用DockerCompose部署SpringBoot项目,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 环境准备
  • 构建Docker镜像
    • docker command构建
    • maven插件构建
  • Docker Compose构建
    • docker-compose 文件
    • run docker-compose
  • 扩展

环境准备

  1. 首先需要安装Docker环境,如果是Mac或者Windows系统可从官网直接下载Docker Desktop,Linux用户可参考官网的安装示例。
  2. 准备两个SpringBoot项目demo和demo1,其中demo的接口会调用demo1的接口。

构建Docker镜像

这里有两种构建方式,一种是通过docker原生command来进行构建,另一种则是通过集成maven插件进行构建。

docker command构建

首先需要一个Dockerfile文件

FROM java:8
ADD demo-0.0.1-SNAPSHOT.jar app.jar
ENTRYPOINT ["java","-jar","/app.jar"]
  • FROM: 当前镜像基于java8来构建
  • ADD : 将demo-0.0.1-SNAPSHOT.jar添加到容器种,并修改名称为app.jar
  • ENTRYPOINT:程序的入口点,这里即为执行jar包

注意:这里的jar包需在Dockerfile同目录或者子目录下,不然找不到
此时的目录结构为:

D:\docker\Dockerfile>dir
2019/07/31  10:12    <DIR>          .
2019/07/31  10:12    <DIR>          ..
2019/07/30  15:58        56,318,184 demo1-0.0.1-SNAPSHOT.jar
2019/07/29  16:16        49,392,759 demo-0.0.1-SNAPSHOT.jar
2019/08/01  10:34               198 Dockerfile

然后执行build命令

D:\docker\Dockerfile>docker build --tag=demo:1.0 .
Sending build context to Docker daemon  105.7MB
Step 1/4 : FROM java:8---> d23bdf5b1b1b
Step 2/4 : VOLUME /tmp---> Running in a557dc8afb78
Removing intermediate container a557dc8afb78---> 6ac5921c3836
Step 3/4 : ADD demo-0.0.1-SNAPSHOT.jar app.jar---> b19a4faddb87
Step 4/4 : ENTRYPOINT ["java","-jar","/app.jar"]---> Running in b6da1b5e5bf9
Removing intermediate container b6da1b5e5bf9---> cfd2a5181c1f
Successfully built cfd2a5181c1f
Successfully tagged demo:1.0
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

build成功后可以查看当前所有镜像

D:\docker\Dockerfile>docker image ls
REPOSITORY                                            TAG                 IMAGE ID            CREATED             SIZE
demo                                                   0.0.1-SNAPSHOT                 cfd2a5181c1f        2 minutes ago       693MB
demo1                                                  0.0.1-SNAPSHOT      25eeb44db881        2 minutes ago        693MB
java                                                  8                   d23bdf5b1b1b        2 years ago         643MB
java                                                  latest              d23bdf5b1b1b        2 years ago         643MB

maven插件构建

pom.xml里加入插件:

<plugins><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.0</version><configuration><!-- 详见:https://github.com/spotify/docker-maven-plugin    --><imageName>${project.artifactId}:${project.version}</imageName><baseImage>java:8</baseImage><entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>
</plugins>

这里这样配置之后就不需要Dockerfile了,如果想用Dockerfile来管理,可将<dockerDirectory>src/main/resources</dockerDirectory>放开,即:

<plugins><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.0</version><configuration><!-- 详见:https://github.com/spotify/docker-maven-plugin    --><imageName>${project.artifactId}:${project.version}</imageName><dockerDirectory>src/main/resources</dockerDirectory><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin>
</plugins>

此时执行命令:

clean package -Dmaven.test.skip=true docker:build

即可构建成功。此时如果启动的话需要一个个执行启动命令

D:\docker\Dockerfile>docker run cfd2a5181c1f
D:\docker\Dockerfile>docker run 25eeb44db881

cfd2a5181c1f为image ID,如果需要一次性多个容器运行,则应该使用Docker Compose

Docker Compose构建

使用Compose需要三个步骤:

  1. build docker image。这一步在上面已经完成
  2. 编写docker-compose文件
  3. run docker-compose。

docker-compose 文件

version: '3'
services:demo1:container_name: demo1image: demo1:0.0.1-SNAPSHOTports: - "8099:8099"volumes: - "D:/docker/log:/log"networks: - local-networksenv_file: - demo.envdemo:container_name: demoimage: demo:0.0.1-SNAPSHOTports: - "9093:9093"depends_on: - demo1networks: - local-networksenv_file: - demo.envnetworks: local-networks: 
  • container_name: 容器名称
  • image:镜像名称:版本号,先从本地寻找,如本地没有,会从DockerHub拉取
  • ports: Host:Contanier 将主机端口映射到容器端口
  • volumes:host绝对路径:容器绝对路径。将主机目录挂载到容器目录上。
  • networks:网络配置,如上面2个容器使用了一个网络,代表他们可以进行通信
  • env_file:环境变量文件,,格式为键值对
  • depends_on:依赖关系,此处则为在启动demo时,会先启动demo1,但不会等待demo1启动完成。

demo.env

#env file
demo1-uri=http://data-exchange:8099

这个配置完成之后,application.propertise文件可使用${demo1-uri}来进行解耦。
以上所有基础配置已完成,更多的的配置参考官方文档

run docker-compose

执行命令启动compose,即可发现先启动demo,在启动demo1

D:\docker\Dockerfile>docker-compose up

扩展

如果想用idea远程调试docker容器里的代码,参考官方文档

这篇关于使用DockerCompose部署SpringBoot项目的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524445

相关文章

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分