文章目录
- 步骤 1:准备文件结构
- 步骤 2:编写 Dockerfile
- 步骤 3:构建 Docker 镜像
- 步骤 4:运行容器
- 常见问题解决
- Q1:容器启动后立即退出
- Q2:时区不一致
- Q3:依赖外部服务(如MySQL)
步骤 1:准备文件结构
在项目根目录创建以下结构(假设 JAR 包名为 app.jar
):
my-java-app/
├── Dockerfile # Docker构建脚本
├── app.jar # 编译好的Java可执行包
└── config/ # 配置文件目录(可选)
└── application.properties
步骤 2:编写 Dockerfile
# 使用官方Java基础镜像(根据JDK版本选择)
FROM openjdk:8-jdk-alpine
# 设置工作目录
WORKDIR /app
# 复制JAR文件和配置文件到容器
COPY app.jar /app/app.jar
COPY config/application.properties /app/config/
# 声明暴露端口(与Spring Boot应用的server.port一致)
EXPOSE 8080
# 使用环境变量传递JVM参数
ENTRYPOINT exec java $JAVA_OPTS -jar app.jar
步骤 3:构建 Docker 镜像
# 在Dockerfile所在目录执行(-t指定镜像名称和标签)
docker build -t my-java-app:1.0 .
关键参数说明:
-t my-java-app:1.0
:定义镜像名称和标签.
:指定构建上下文为当前目录
步骤 4:运行容器
docker run -d \ # 后台运行
-p 8081:8080 \ # 端口映射(宿主机端口:容器端口)
-e JAVA_OPTS="-Xms2g -Xmx2g -Xmn1g -XX:MaxMetaspaceSize=256m -Xss256k" \ # 传递JVM参数(如内存限制)
--name my-app my-java-app:1.0 # 使用的镜像
常见问题解决
Q1:容器启动后立即退出
- 检查日志:
docker logs my-app
- 常见原因:
- JAR包路径错误 → 确认Dockerfile中的
COPY
路径 - 端口冲突 → 修改
-p
参数或应用配置文件中的端口
- JAR包路径错误 → 确认Dockerfile中的
Q2:时区不一致
在Dockerfile中设置时区:
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
Q3:依赖外部服务(如MySQL)
使用 docker-compose.yml
编排多容器:
version: '3'
services:
app:
image: my-java-app:1.0
ports:
- "8080:8080"
depends_on:
- mysql
environment:
SPRING_DATASOURCE_URL: jdbc:mysql://mysql:3306/db
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: db