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 容器,又因为Ubuntu和Debian的命令很多都一样)
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包步骤同上