手把手教你为 Spring Boot 应用制作 Docker 镜像,并实现配置文件外置

在当今微服务架构盛行的时代,Spring Boot 凭借其快速开发、便捷部署的特性,成为了 Java 开发者构建后端服务的首选框架。而 Docker 作为容器化技术的佼佼者,能够实现应用程序及其依赖项的打包和隔离,极大地提升了应用部署的效率和一致性。本文将详细介绍如何为 Spring Boot 应用制作 Docker 镜像,并实现配置文件外置,让你的应用部署更加灵活高效。​

一、准备工作​

在开始制作 Docker 镜像和外置配置文件之前,确保你已经完成以下准备工作(不具体展开赘述,默认大家已具备):​

  1. 安装 JDK:Spring Boot 应用需要 Java 运行环境,确保你的开发环境中已安装合适版本的 JDK(推荐 JDK 8 及以上)。​
  2. 安装 Maven 或 Gradle:用于构建 Spring Boot 项目,根据项目使用的构建工具进行安装。​
  3. 安装 Docker:前往 Docker 官方网站(https://www.docker.com/ ),根据你的操作系统下载并安装 Docker Desktop 或 Docker Engine。​

二、创建 Spring Boot 项目​并指定配置文件(比较简单,如果想要完整项目请评论区留言)

1.关键代码:

@EnableScheduling
@SpringBootApplication
@PropertySource("file:./application.properties")
public class ProjectApplication {

	public static void main(String[] args) {
		SpringApplication.run(ProjectApplication.class, args);
	}

}

@PropertySource("file:./application.properties")把外部配置文件加载到 Spring 的环境当中。

2、请求验证接口Controller层,非常简单不在赘述

@RestController
public class UserController {

	@GetMapping("/send/{cmd}")
	public String SendCmd(@PathVariable String cmd) {

		return cmd;
	}
}

2、配置文件:

server.port = 8082
spring.application.name=springboot
spring.main.allow-bean-definition-overriding=true

3、将文件上传至Linux目录下(作者用的centos7)

[root@localhost fileConfig]# ll
总用量 52612
-rw-r--r--. 1 root root      104 5月  16 17:53 application.properties
-rw-r--r--. 1 root root 53867587 5月  16 17:53 springboot-0.0.1.jar

三、编写 Dockerfile文件

1.创建名为Dockerfile的文件,内容如下:

FROM openjdk:8-jdk-alpine

RUN mkdir -p /appPath

WORKDIR /appPath

ARG JAR_FILE=springboot-0.0.1.jar

COPY ${JAR_FILE} app.jar

EXPOSE 8082

ENV TZ=Asia/Shanghai JAVA_OPTS="-Xms128m -Xmx256m -Djava.security.egd=file:/dev/./urandom"

CMD sleep 30; java -jar app.jar $JAVA_OPTS

2.放入同目录下

[root@localhost fileConfig]# ll
总用量 52616
-rw-r--r--. 1 root root      104 5月  16 17:53 application.properties
-rw-r--r--. 1 root root      277 5月  16 18:27 Dockerfile
-rw-r--r--. 1 root root 53867587 5月  16 17:53 springboot-0.0.1.jar

四、打docker镜像

1.打镜像

[root@localhost fileConfig]# docker build -t demo:0.1 .
[+] Building 6.0s (9/9) FINISHED                                                                                                                                                           docker:default
 => [internal] load build definition from Dockerfile                                                                                                                                                 0.0s
 => => transferring dockerfile: 375B                                                                                                                                                                 0.0s
 => [internal] load .dockerignore                                                                                                                                                                    0.0s
 => => transferring context: 2B                                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/openjdk:8-jdk-alpine                                                                                                                              0.7s
 => [internal] load build context                                                                                                                                                                    4.2s
 => => transferring context: 53.88MB                                                                                                                                                                 4.1s
 => CACHED [1/4] FROM docker.io/library/openjdk:8-jdk-alpine@sha256:94792824df2df33402f201713f932b58cb9de94a0cd524164a0f2283343547b3                                                                 0.0s
 => [2/4] RUN mkdir -p /appPath                                                                                                                                                                      3.8s
 => [3/4] WORKDIR /appPath                                                                                                                                                                           0.2s
 => [4/4] COPY springboot-0.0.1.jar app.jar                                                                                                                                                          0.3s
 => exporting to image                                                                                                                                                                               0.7s
 => => exporting layers                                                                                                                                                                              0.7s
 => => writing image sha256:aa7ed06093ce92c4a96473a1bd4ad00a00ef9b7477e2d1bd3a0fbc2807bcb71e                                                                                                         0.0s
 => => naming to docker.io/library/demo:0.1                                                                                                                                                          0.0s

2.查看打好的镜像

[root@localhost fileConfig]# docker images|grep demo
demo             0.1        aa7ed06093ce   3 minutes ago   159MB

五、启动容器

1、启动容器

[root@localhost fileConfig]# docker run -d -v $(pwd)/application.properties:/appPath/application.properties -p 8082:8082 --name demo01  demo:0.1
b84e11a89dabf01aa0b987af12bd6284b5c56967250b33c05935fae93f386b9d

2、查看日志

[root@localhost fileConfig]# docker logs -f demo01

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::       (v2.1.14.RELEASE)

2025-05-16 18:44:34.937  INFO 1 --- [           main] com.kangwei.ProjectApplication           : Starting ProjectApplication v0.0.1 on b84e11a89dab with PID 1 (/appPath/app.jar started by root in /appPath)
2025-05-16 18:44:34.984  INFO 1 --- [           main] com.kangwei.ProjectApplication           : No active profile set, falling back to default profiles: default
2025-05-16 18:44:43.029  INFO 1 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.
2025-05-16 18:44:43.122  INFO 1 --- [           main] faultConfiguringBeanFactoryPostProcessor : No bean named 'integrationHeaderChannelRegistry' has been explicitly defined. Therefore, a default DefaultHeaderChannelRegistry will be created.
2025-05-16 18:44:43.931  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.integration.config.IntegrationManagementConfiguration' of type [org.springframework.integration.config.IntegrationManagementConfiguration$$EnhancerBySpringCGLIB$$f4cbbf60] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-16 18:44:44.078  INFO 1 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'integrationDisposableAutoCreatedBeans' of type [org.springframework.integration.config.annotation.Disposables] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2025-05-16 18:44:46.491  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8082 (http)
2025-05-16 18:44:46.661  INFO 1 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Initializing ProtocolHandler ["http-nio-8082"]
2025-05-16 18:44:46.809  INFO 1 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2025-05-16 18:44:46.810  INFO 1 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.34]
2025-05-16 18:44:47.608  INFO 1 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2025-05-16 18:44:47.615  INFO 1 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 12132 ms
2025-05-16 18:44:50.518  INFO 1 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2025-05-16 18:44:52.186  INFO 1 --- [           main] o.s.s.c.ThreadPoolTaskScheduler          : Initializing ExecutorService 'taskScheduler'
2025-05-16 18:44:52.930  INFO 1 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : Adding {logging-channel-adapter:_org.springframework.integration.errorLogger} as a subscriber to the 'errorChannel' channel
2025-05-16 18:44:52.931  INFO 1 --- [           main] o.s.i.channel.PublishSubscribeChannel    : Channel 'springboot.errorChannel' has 1 subscriber(s).
2025-05-16 18:44:52.931  INFO 1 --- [           main] o.s.i.endpoint.EventDrivenConsumer       : started _org.springframework.integration.errorLogger
2025-05-16 18:44:53.013  INFO 1 --- [           main] o.a.coyote.http11.Http11NioProtocol      : Starting ProtocolHandler ["http-nio-8082"]
2025-05-16 18:44:53.160  INFO 1 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8082 (http) with context path ''
2025-05-16 18:44:53.168  INFO 1 --- [           main] com.kangwei.ProjectApplication           : Started ProjectApplication in 24.336 seconds (JVM running for 27.486)

3、请求服务接口

[root@localhost fileConfig]# curl http://127.0.0.1:8082/send/123456789
123456789
[root@localhost fileConfig]#

八、总结​

通过以上步骤,我们成功地为 Spring Boot 应用制作了 Docker 镜像,并实现了配置文件外置。这样不仅能够方便地在不同环境中部署应用,还能灵活地修改配置,而无需重新构建镜像。希望本文对你在 Spring Boot 应用的容器化部署和配置管理方面有所帮助。

上述步骤已涵盖制作镜像与外置配置文件的核心操作。若你在实践中遇到问题,或想了解更多优化技巧,欢迎交流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值