当前位置: 首页 > news >正文

Dockerfile实现java容器构建及项目重启(公网和内网)

公网情况

0.Dockerfile关键字

关键字作用一句话出现位置
FROM指定基础镜像(任何 Dockerfile 必须且首行)全局
RUN在镜像构建阶段执行命令(常用来安装软件)构建期
COPY把宿主机文件/目录复制进镜像构建期
ADD类似 COPY,但额外支持远程 URL 与自动解压 tar构建期
WORKDIR设定后续指令的工作目录(不存在会自动创建)构建/运行
ENV设定环境变量构建+运行
EXPOSE声明容器对外监听端口(仅文档作用,仍需 -p)文档
CMD容器启动时的默认命令(可被 docker run 覆盖)运行期
ENTRYPOINT容器启动时的主进程(与 CMD 组合使用)运行期
VOLUME声明挂载点,匿名或具名卷运行期
USER切换后续指令的执行用户 / UID构建/运行
LABEL给镜像打键值对元数据(维护者、版本等)文档
ARG声明构建参数(docker build --build-arg)构建期
ONBUILD触发器:以此镜像作为基础镜像时自动执行构建期
STOPSIGNAL指定 docker stop 时发给容器的信号运行期
HEALTHCHECK定义容器健康检查命令运行期
SHELL更改 RUN/CMD 的默认 shell(Windows 常用)构建期
MAINTAINER已废弃,被 LABEL 替代历史遗留

最小可运行示例

# 关键字示例
FROM alpine:3.19
LABEL maintainer="you@example.com"
WORKDIR /app
COPY . .
RUN apk add --no-cache python3
EXPOSE 8000
CMD ["python3", "-m", "http.server", "8000"]

以上代码用到了 8 个关键字,足够覆盖 90% 的日常需求。

1.创建Dockerfile

# 使用 OpenJDK 8 官方镜像
FROM openjdk:8-jre# 设置工作目录
WORKDIR /app# 暴露端口
EXPOSE 5086# 使用 Shell 格式(注意:不要用方括号)
CMD java -Xms2g -Xmx2g -XX:+UseParallelGC -XX:ParallelGCThreads=4 -jar app.jar > /app/app.log 2>&1

2.build镜像

docker build -t java_image .

3.启动容器

docker run -d --restart always --name twin_java -p 8080:8080 -v /home/java:/app java_image

图中可以看到,容器已经启动,并且容器的监控线程已经由/bin/bash变成了/bin/bash -c 'java -X..",可见,当容器重启的时候,容器中的jar包也会一起重启

4.更新jar包

当java项目逻辑有修改的时候,都需要重新打包,重新启动项目,容器中的jar包冲抵方式是:

刚刚启动容器的时候,已经通过命令挂载了容器的工作目录到宿主机,即容器中/app和宿主机/home/java的目录是互通的,所以只需要将宿主机上的jar更新,又因为在Dockerfile中定义启动的jar包名称为app.jar,所以后续更新jar包时,需要将最新的jar包改名为app.jar,然后重启项目即可

重启容器命令:

docker restart twin_java

补充:

想在容器内看java运行状态,报bash: ps: command not found
可以通过命令安装(因为这个容器是Debian 容器,又因为UbuntuDebian的命令很多都一样)

apt update && apt install procps -y

查看jar包运行日志,可以在宿主机上使用tail命令进行查看,不需要进入容器

tail -100f app.log

内网环境

0.准备工作

将刚刚在公网环境下创建的镜像进行打包

docker save -o java_image.tar java_image

然后将tar包放在内网电脑上进行载入,启动即可

1.载入并启动

载入命令:

docker load -i java_image.tar

启动命令同上,更新jar包步骤同上

http://www.dtcms.com/a/357283.html

相关文章:

  • SOME/IP-SD IPv4组播的通信参数由谁指定?
  • React学习教程,从入门到精通, ReactJS - 特性:初学者的指南(4)
  • C++链表双杰:list与forward_list
  • ElasticSearch对比Solr
  • Node.js 的流(Stream)是什么?有哪些类型?
  • DQL单表查询相关函数
  • STM32F2/F4系列单片机解密和芯片应用介绍
  • Ubuntu虚拟机磁盘空间扩展指南
  • AI视频安防,为幼儿园安全保驾护航
  • 基于 GPT-OSS 的成人自考口语评测 API 开发全记录
  • 深度解密SWAT模型:遥感快速建模、DEM/LU/气象数据不确定性、子流域/坡度划分、未来土地利用与气候变化情景模拟及措施效益评估
  • 龙巍:探究青铜器在木雕中的运用
  • VS Code C#调试完全指南
  • [AI人脸替换] docs | 环境部署指南 | 用户界面解析
  • 红色视频剪辑制作——走进广州农讲所:在红墙黄瓦间感悟初心与传承
  • “游戏手柄”线性霍尔传感器IC替代方案:赛卓SC470X
  • Instance Normalization(实例归一化)
  • Stage应用模型及状态存储
  • 【Android 16】Android W 的冻结机制内核分析
  • 车载以太网通信测试:牢筑车载网络的质量防线
  • 【51单片机】【protues仿真】 基于51单片机叫号系统
  • 基于EB的K3XX_GPT定时器中断的实现方法
  • 精通与AI对话的艺术:如何通过角色扮演获得精准输出
  • 【Rust】 6. 字符串学习笔记
  • Day12-python文件操作(二)
  • java开发连接websocket接口
  • STM32CubeMX(十八)USB-MSC:外部flash模拟U盘
  • Day17_【机器学习—特征预处理(归一化和标准化)】
  • 期权杂记(二)
  • Hadoop(六)