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

发布于:2025-08-30 ⋅ 阅读:(25) ⋅ 点赞:(0)

公网情况

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包步骤同上


网站公告

今日签到

点亮在社区的每一天
去签到