游乐游手机版
首页/编程语言/文章详情

Ubuntu 系统安装与配置 Java 容器详细教程

时间:2026-05-06 20:18
Ubuntu 上使用 Ja va 容器的三种实用方式 在 Ubuntu 环境中部署 Ja va 应用,容器化无疑能带来环境一致性和部署便捷性。今天,我们就来聊聊三种最接地气的实现方式,你可以根据实际场景灵活选用。 方式一:直接使用官方 OpenJDK 镜像运行 JAR 适用场景:追求快速启动、维护成

Ubuntu 上使用 Ja va 容器的三种实用方式

在 Ubuntu 环境中部署 Ja va 应用,容器化无疑能带来环境一致性和部署便捷性。今天,我们就来聊聊三种最接地气的实现方式,你可以根据实际场景灵活选用。

方式一:直接使用官方 OpenJDK 镜像运行 JAR

适用场景:追求快速启动、维护成本低的简单应用。

这种方式最直接,核心思路就是“拿来即用”。具体操作分三步走:

  1. 准备应用包:首先,确保你的 app.jar 文件已经放在项目目录下。
  2. 运行容器:通过一条命令,将 JAR 文件挂载到官方 OpenJDK 镜像中并启动。例如,将宿主机的 8080 端口映射到容器的 8080 端口:
    docker run -d --name myapp \
    -p 8080:8080 \
    -v "$PWD/app.jar:/app.jar:ro" \
    openjdk:11 \
    ja va -jar /app.jar
  3. 查看日志与进入容器:启动后,你可以随时查看运行日志,或者进入容器内部进行调试:
    docker logs -f myapp
    docker exec -it myapp bash

这里有个小技巧:如果对镜像体积敏感,可以考虑使用 openjdk:8-jre 这类只包含运行环境的标签,能有效减小镜像体积。总的来说,这个流程和在 Ubuntu 宿主机上直接使用 Docker 启动 JAR 包几乎一模一样,学习成本极低。

方式二:基于 Ubuntu 自制 JDK 镜像

适用场景:需要特定 JDK 版本、自定义系统工具链,或者需要从内部仓库拉取依赖。

当官方镜像无法满足定制化需求时,自己动手构建一个专属镜像就成了最佳选择。流程同样清晰:

  1. 编写 Dockerfile:在项目根目录创建一个 Dockerfile 文件。以下是一个安装 OpenJDK 11 的示例:
    FROM ubuntu:22.04
    RUN apt-get update && apt-get install -y --no-install-recommends \
        openjdk-11-jdk wget ca-certificates unzip && \
        rm -rf /var/lib/apt/lists/*
    ENV JA VA_HOME=/usr/lib/jvm/ja va-11-openjdk-amd64
    ENV PATH=$JA VA_HOME/bin:$PATH
    WORKDIR /app
    COPY app.jar /app/app.jar
    CMD ["ja va","-jar","/app/app.jar"]
  2. 构建并运行:使用 Docker 命令构建镜像并启动容器:
    docker build -t ubuntu-jdk11-app .
    docker run -d --name myapp -p 8080:8080 ubuntu-jdk11-app

如果需要使用 Oracle JDK,思路也是类似的:在 Dockerfile 中通过 wgetcurl 下载指定版本的安装包,并正确设置 JA VA_HOME 环境变量。当然,务必注意 Oracle 的许可证条款以及确保下载地址的有效性。

方式三:在运行的 Ubuntu 容器内安装 Ja va 并启动 JAR

适用场景:已经存在一个正在运行的 Ubuntu 容器,需要临时为其加入 Ja va 运行环境。

这种方式更像是一种“热插拔”操作,适合临时调试或对现有容器进行功能扩展。

  1. 进入容器并安装 OpenJDK:首先,连接到目标容器内部,然后像在普通 Ubuntu 系统上一样安装 Ja va:
    docker exec -it <容器名> bash
    apt-get update && apt-get install -y openjdk-11-jdk
    ja va -version
  2. 运行 JAR:安装完成后,就可以启动你的 Ja va 应用了。建议使用绝对路径,并将日志重定向到文件,方便后续排查:
    mkdir -p /app/logs
    nohup ja va -Dfile.encoding=UTF-8 -Xms512m -Xmx1024m \
    -jar /app/app.jar >/app/logs/app.log 2>&1 &

为了让操作更规范,你还可以在容器内准备一个启动脚本(例如 run.sh),以后台方式执行,这样既便于管理,也方便复用。

关键注意事项与最佳实践

无论选择哪种方式,下面这些实践要点都值得关注,它们能帮你避开不少“坑”。

  • 选择合适的基础镜像:生产环境优先考虑 openjdk:-jre 这类仅包含运行环境的镜像,体积更小,安全性更高。如果是需要编译或深度调试的场景,则可以使用完整的 openjdk: 或基于 Ubuntu 自制的镜像。
  • 时区与编码:这是容器化应用的一个经典问题。务必在 Dockerfile 中统一设置时区和字符编码,避免日志时间错乱和中文乱码:
    ENV TZ=Asia/Shanghai
    RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
    ENV LANG=C.UTF-8
  • 日志与数据持久化:务必将容器内的日志目录(如 /app/logs)、配置文件以及重要数据目录,通过卷(Volume)挂载到宿主机。这样既能防止数据丢失,也极大方便了日志查看和问题排查。
  • 资源与健康检查:为容器设置合理的内存和 CPU 限制,防止单个应用耗尽主机资源。同时,配置健康检查探针,让编排工具(如 Docker Compose, Kubernetes)能够感知应用状态,提升整体稳定性。
  • 最小权限原则:尽量避免使用 –privileged=true 这种赋予容器全部权限的危险操作。应该按需授予特定能力,例如使用 –cap-add 参数,严格遵守最小权限原则,这是保障容器安全的重要防线。
来源:https://www.yisu.com/ask/27021299.html
上一篇Ubuntu系统Java程序监控方法与步骤详解 下一篇Linux系统下Golang程序调试方法与实战指南
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
如何在ThinkPHP中实现定时任务与命令行调度方法
编程语言 · 2026-07-04

如何在ThinkPHP中实现定时任务与命令行调度方法

用ThinkPHP实现定时任务时,很多开发者第一步就卡在命令行报错上,直接输入php think your:command却无法识别——这种情况绝大多数是因为命令类的注册方式存在问题。下面先梳理几个核心要点。 ThinkPHP 6 中 think 命令如何正确触发自定义指令 直接运行 php thi

ThinkPHP API接口防重放攻击实现方法
编程语言 · 2026-07-04

ThinkPHP API接口防重放攻击实现方法

先说几个核心判断:API防重放攻击这件事,做对了是道防火墙,做错了就是个心理安慰。很多开发者到踩坑了才明白——验签这东西,放错位置、漏掉字段、存错nonce,每一环都能让整个安全体系直接归零。 验签必须放在中间件里,不能在控制器里写 ThinkPHP 的请求生命周期中,中间件是唯一能在路由匹配、参数

ThinkPHP文件上传必须验证扩展名安全必要性分析
编程语言 · 2026-07-04

ThinkPHP文件上传必须验证扩展名安全必要性分析

在使用ThinkPHP进行文件上传时,ext扩展名验证通常是开发者首先接触的关键环节。但你真的了解它的实际工作原理吗?它仅比对文件名后缀,而不读取文件内容,甚至对空格和大小写都极其敏感。更为重要的是——它是TP文件上传验证五层防线中不可忽视的第一道关卡,一旦配置遗漏,整个validate验证链将直接

ThinkPHP关联模型自动写入与更新使用教程
编程语言 · 2026-07-04

ThinkPHP关联模型自动写入与更新使用教程

需要明确的是,ThinkPHP关联模型并没有提供所谓的“自动写入 更新”魔法开关。所谓的“自动”功能,实际上都需要开发者手动编写配置逻辑才能生效。核心原则在于:主模型和从模型必须分开独立处理,时间戳字段和业务字段需依靠修改器或钩子接管;批量操作则要规规矩矩地绕过模型逻辑来执行——只有理解透彻这些要点

BoxLayout中仅居中一个组件其他默认左对齐
编程语言 · 2026-07-04

BoxLayout中仅居中一个组件其他默认左对齐

在 Java Swing 中使用 BoxLayout 的 Y_AXIS 方向布局时,很多初学者容易掉进一个常见陷阱:希望将某个组件单独设置为中心对齐,但当调用 `setAlignmentX(CENTER_ALIGNMENT)` 后,却发现其他组件也跟着发生了偏移,完全达不到预期效果。实际上,关键之处