DockerFile实战
背景
在上一篇文章中,我们对DockerFile有了一个较为深刻的认识,那么这篇文章,我将会向你展示如何自定义一个镜像并且在docker上运行。
一、基础指令
指令 | 技术说明 | 生产环境最佳实践 | 典型错误示例 |
---|---|---|---|
FROM | - 必须作为Dockerfile第一条指令 - 推荐使用官方镜像的LTS版本 | FROM eclipse-temurin:17-jre-jammy | FROM ubuntu:latest |
ENV | - 支持多变量定义:ENV A=1 B=2 - 会被后续RUN/CMD等指令继承 | ENV JAVA_OPTS="-Xms512m -Xmx1024m" | ENV PATH=$PATH:/tmp |
COPY | - 支持通配符:COPY *.jar /app/ - 会保留文件元数据 | COPY --chown=1000:1000 . /app | COPY /opt/xxx /app |
RUN | - 多个命令用&& 连接- 用 \ 换行提高可读性 | RUN apt update && apt install -y \ curl && rm -rf /var/lib/apt/lists/* | RUN cd /app && tar xf pkg.tar |
EXPOSE | - 只是声明而非实际开放端口 - 需与 docker run -p 配合 | EXPOSE 8080/tcp 8443/udp | EXPOSE 8080-8090 |
ENTRYPOINT | - 容器的主进程 - 建议用JSON数组格式 | ENTRYPOINT ["java", "-jar", "app.jar"] | ENTRYPOINT java -jar app.jar |
#1、准备Linux运行环境(推荐使用轻量级基础镜像)
FROM eclipse-temurin:17-jre-alpine#2、安装JRE并配置环境变量(基础镜像已包含,此处为扩展配置)
ENV JAVA_OPTS="-Xms512m -Xmx1024m"
ENV TZ=Asia/Shanghai#3、拷贝Jar包(使用分层构建优化)
COPY target/*.jar /app/application.jar#4、编写运行脚本(使用ENTRYPOINT+CMD组合)
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app/application.jar"]
EXPOSE 8888
二、分步骤技术解析
① 基础镜像选择
-
推荐方案:
FROM eclipse-temurin:17-jre-alpine
- 比
openjdk
镜像更小(Alpine版约85MB) - 已包含完整的JRE环境
- 比
-
替代方案:
FROM amazoncorretto:17 # 亚马逊优化版
② 环境配置增强
# 内存配置(根据应用需求调整)
ENV JAVA_OPTS="-Xms512m -Xmx1024m -XX:+UseG1GC"# 时区设置
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
③ 应用部署优化
- 分层构建技巧:
COPY --chown=1000:1000 target/*.jar /app/ # 指定非root用户
- 版本控制:
ARG JAR_FILE=target/*.jar COPY ${JAR_FILE} /app/application.jar
④ 启动脚本进阶
# 健康检查(K8s就绪探针)
HEALTHCHECK --interval=30s --timeout=3s \CMD curl -f http://localhost:8888/actuator/health || exit 1# 允许传递启动参数
CMD ["--spring.profiles.active=prod"]
三、构建与运行命令
-
构建镜像:
docker build -t java-app:v1 .
-
运行容器:
docker run -d -p 8860:8888 \-e JAVA_OPTS="-Xmx2048m" \java-app:v1
容器创建成功:
四、生产环境建议
-
安全加固:
USER 1000 # 使用非root用户 RUN addgroup -S appgroup && adduser -S appuser -G appgroup
-
多阶段构建(如需包含JDK编译):
FROM eclipse-temurin:17-jdk as builder WORKDIR /build COPY . . RUN ./gradlew bootJarFROM eclipse-temurin:17-jre-alpine COPY --from=builder /build/build/libs/*.jar /app.jar
-
镜像扫描:
docker scan java-app:v1
五、常见问题排查
问题现象 | 解决方案 |
---|---|
容器启动立即退出 | docker logs <container> 查看JVM错误 |
内存溢出(OOM) | 调整-Xmx 参数并检查内存泄漏 |
时区不正确 | 确认TZ 环境变量已正确设置 |
应用性能低下 | 考虑使用-XX:+UseContainerSupport |