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

DockerFile实战

背景

在上一篇文章中,我们对DockerFile有了一个较为深刻的认识,那么这篇文章,我将会向你展示如何自定义一个镜像并且在docker上运行。

一、基础指令

指令技术说明生产环境最佳实践典型错误示例
FROM- 必须作为Dockerfile第一条指令
- 推荐使用官方镜像的LTS版本
FROM eclipse-temurin:17-jre-jammyFROM 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 . /appCOPY /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/udpEXPOSE 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"]

三、构建与运行命令

  1. 构建镜像​:

    docker build -t java-app:v1 .
  2. 运行容器​:

    docker run -d -p 8860:8888 \-e JAVA_OPTS="-Xmx2048m" \java-app:v1

容器创建成功:

四、生产环境建议

  1. 安全加固​:

    USER 1000  # 使用非root用户
    RUN addgroup -S appgroup && adduser -S appuser -G appgroup
  2. 多阶段构建​(如需包含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
  3. 镜像扫描​:

    docker scan java-app:v1

五、常见问题排查

问题现象解决方案
容器启动立即退出docker logs <container> 查看JVM错误
内存溢出(OOM)调整-Xmx参数并检查内存泄漏
时区不正确确认TZ环境变量已正确设置
应用性能低下考虑使用-XX:+UseContainerSupport

相关文章:

  • 护网行动——蓝队防守方案指南
  • 系分论文《论信息系统缓存的分析和应用》
  • AI日报 - 2025年05月19日
  • C++:⾯向对象的三⼤特性
  • TensorRT
  • 使用 Auto-Keras 进行自动化机器学习
  • 拓展运算符与数组解构赋值的区别
  • Vibe Coding:编程中的氛围与效率的艺术
  • java19
  • COCO数据集神经网络性能现状2025.5.18
  • React方向:react脚手架的使用
  • 单列集合——ArrayList,LinkedList,迭代器的底层原理和源码
  • 中山市东区信息学竞赛2025 题目解析
  • SAP集团内部公司间交易自动开票
  • SEO长尾词优化与提升路径
  • 8.1UDP点对点聊天小项目
  • Oc语言学习 —— Foundation框架总结
  • 系统架构设计(十三):虚拟机体系结构风格
  • 12.输出常量的两个小扩展
  • Elasticsearch 集群管理秘籍 [特殊字符]
  • 经济日报金观平:促进信贷资金畅达小微企业
  • 信俗与共:清代新疆回疆儒释道庙宇的中华政教
  • 俄乌官员即将在土耳其会谈,外交部:支持俄乌开启直接对话
  • 上海市税务局回应刘晓庆被举报涉嫌偷漏税:正依法依规办理
  • 中国证券业协会修订发布《证券纠纷调解规则》
  • 上海锦江乐园摩天轮正在拆除中,预计5月底6月初拆完