0

0

如何在Java中使用Docker搭建环境_Java容器化开发环境说明

P粉602998670

P粉602998670

发布时间:2026-02-05 05:47:35

|

961人浏览过

|

来源于php中文网

原创

优先选 eclipse-temurin(如 eclipse-temurin:17-jre-jammy),因其轻量、定期更新CVE、支持ARM64;避免已弃用的 java:8 或体积大且无多阶段构建支持的 openjdk 官方镜像。

如何在java中使用docker搭建环境_java容器化开发环境说明

Java应用打包成Docker镜像时,Dockerfile里该用哪个JDK基础镜像

优先选 eclipse-temurin(原 adoptopenjdk),不是 openjdk 官方镜像,也不是 java:8-jdk 这类已弃用的旧标签。后者在 Docker Hub 上已标记为 deprecated,且不更新安全补丁。

常见错误是直接写 FROM openjdk:17-jdk-slim —— 它虽能跑,但镜像体积大、无多阶段构建支持、底层 OS 包管理混乱。而 eclipse-temurin:17-jre-jammy 更轻量、定期扫描 CVE、支持 ARM64。

  • eclipse-temurin:17-jre-jammy:适合 Spring Boot 打包成 jar 后直接运行,体积约 120MB
  • eclipse-temurin:17-jdk-jammy:需要编译或调试时才用,比如集成 Jacoco 或运行 javac
  • 避免 FROM java:8:该镜像基于 Debian Jessie,2020 年已 EOL,存在已知 SSL/TLS 握手失败问题

Spring Boot应用构建Docker镜像时,为什么java -jar启动失败报ClassNotFoundException

根本原因不是类没打进 jar,而是 Docker 构建时用了错误的 COPY 路径,或者没跳过 Maven 的 test 阶段导致 fat jar 没生成。

典型错误:COPY target/*.jar app.jar 在多模块项目中会匹配到空目录或 pom.xml 生成的非可执行 jar;正确做法是明确指定构建产物名。

立即学习Java免费学习笔记(深入)”;

笔灵AI论文写作
笔灵AI论文写作

免费生成毕业论文、课题论文、千字大纲,几万字专业初稿!

下载
  • 确保 mvn clean package -DskipTests 成功执行,检查 target/your-app-0.0.1-SNAPSHOT.jar 是否存在且可执行(java -jar 能打印 help)
  • Dockerfile 中用精确路径:COPY target/your-app-*.jar app.jar,别依赖通配符匹配
  • 若用 Spring Boot 3+,需确认 jar 内 META-INF/MANIFEST.MFStart-ClassSpring-Boot-Classes,否则 java -jar 不识别为 Boot 应用

容器内Java进程无法被docker stop优雅终止,怎么修复

因为 Java 进程没收到 SIGTERM,或收到后未注册 shutdown hook,导致 docker stop 等 10 秒后强制发 SIGKILL,数据库连接、线程池、Actuator 的 /actuator/shutdown 全部失效。

关键点:必须让 JVM 成为 PID 1,且不被 shell 封装。错误写法:ENTRYPOINT ["sh", "-c", "java -jar app.jar"] —— 此时 sh 是 PID 1,Java 是子进程,SIGTERM 只发给 sh,不会透传。

  • 正确写法:ENTRYPOINT ["java", "-jar", "/app.jar"](exec form)
  • 加 JVM 参数确保信号处理:-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0,避免 OOMKilled
  • Spring Boot 项目中显式注册 hook:
    Runtime.getRuntime().addShutdownHook(new Thread(() -> { logger.info("Shutting down gracefully..."); }));

本地开发时用docker-compose连MySQL,Java应用总是连不上host.docker.internal

这个 DNS 名在 macOS / Windows 的 Docker Desktop 默认可用,但在 Linux 上默认不存在,直接导致 Connection refused。不能靠改 /etc/hosts编码 IP,因为容器网络每次重启可能变。

根本解法是让 Java 应用和 MySQL 同属一个自定义网络,并用服务名通信 —— 这才是 Docker 原生推荐方式,不是 hack。

  • 删掉所有 host.docker.internal 引用,把 JDBC URL 改成 jdbc:mysql://mysql:3306/mydb
  • docker-compose.yml 中定义 mysql 服务,并与应用服务同级,不加 network_mode: host
  • 验证方法:docker-compose exec app ping mysql,能通说明网络就绪
Java 容器化最常卡住的地方,其实是“以为自己在用 Docker”,实际还在用本地端口、本地配置、本地 JDK 路径思维去套容器——结果就是日志里满屏 Connection refusedFileNotFoundExceptionOutOfMemoryError,但容器本身明明显示 running。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

669

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

308

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

282

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

517

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

258

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

387

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

535

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

609

2023.08.14

抖音网页版入口与视频观看指南 抖音官网视频在线访问
抖音网页版入口与视频观看指南 抖音官网视频在线访问

本专题汇总了抖音网页版的入口链接、官方登录页面以及视频观看入口,帮助用户快速访问抖音网页版,提供免登录访问方式和直接进入视频播放页面的方法,确保顺利浏览和观看抖音视频。

61

2026.02.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.1万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 823人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号