从零开始:教你将程序打包成 Docker 镜像

[复制链接]
发表于 2026-10-6 11:12:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×

一、为什么需要先做镜像

把程序做成 Docker 镜像,本质是给应用套一个「打包好的运行环境」:操作系统层、依赖库、运行时、代码加配置全在里面,换任何一台装了 Docker 的机器都能直接跑,不用再折腾「我这台明明能跑」。

  • 一次构建到处运行,开发、测试、生产三套环境一致性高。
  • 启动快,容器是共享内核的轻量进程,秒级起来。
  • 弹性好,配合编排工具按负载增减实例,不用重新装机器。

二、准备工作

本地或服务器上先确认 Docker 装好:

docker --version
docker info

以 Java 的 Spring Boot 项目为例,别的语言同理,只是 ENTRYPOINT 换一下。假设项目结构是:

my-app/
├── Dockerfile
├── pom.xml
└── target/
    └── my-app.jar

三、写 Dockerfile

生产里推荐多阶段构建,编译阶段用 JDK 镜像,运行阶段只留一个 JRE,镜像能小一半以上:

FROM maven:3.9-eclipse-temurin-17 AS build
WORKDIR /src
COPY pom.xml ./
RUN mvn -q -DskipTests dependency:go-offline
COPY . ./
RUN mvn -q -DskipTests package

FROM eclipse-temurin:17-jre
WORKDIR /app
COPY --from=build /src/target/my-app.jar /app/my-app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app/my-app.jar"]

几个关键点:dependency:go-offline 先把依赖缓存下来,之后改业务代码不用每次重新拉包;COPY --from=build 只把成品 jar 带进运行阶段;ENTRYPOINT 用数组形式(exec 模式),容器里的进程就是 Java 本身,docker stop 才能收到信号优雅退出。

四、构建和打标签

在 Dockerfile 所在目录执行:

docker build -t my-app:1.0 .

建议 tag 带上仓库地址和版本,方便推送:

docker tag my-app:1.0 registry.example.com/team/my-app:1.0
docker push registry.example.com/team/my-app:1.0

构建过程逐层输出,某一层失败会停在对应步骤,看错误日志日志定位是哪条指令炸的。第一层拉基础镜像慢是正常的,后续层有缓存会快很多。

五、跑起来和验证

docker run -d --name my-app -p 8080:8080 my-app:1.0
docker ps
docker logs -f my-app

容器起来后打一次接口确认:

curl http://127.0.0.1:8080/actuator/health

进容器内部排查更方便:

docker exec -it my-app /bin/bash

六、让镜像在小场景里更好用

  • 把依赖层和工作目录写在前头:代码天天改,依赖不常变,分层缓存能省掉大量重复下载。
  • 用 .dockerignore:把 .git、target/、日志日志目录排除掉,构建上下文小,传输快。
  • 别用 latest:镜像标签钉死版本号,回滚有据可依;latest 出问题时你不知道线上跑的是哪份。
  • 非 root 运行:运行阶段加个 useradd 建普通用户再切过去,容器被逃逸时危害小很多。
  • 配置走环境变量:连接串、密钥不要写死在镜像里,运行时用 -e 或编排文件的 env 注入,同镜像换环境就换配置。

七、镜像体积怎么看、怎么瘦身

docker images
docker system df
docker history my-app:1.0

docker history 能看出哪一层占了大头。常见杀手是「装了编译工具又没清缓存」和「把整个源码目录拷进运行镜像」。多阶段构建、运行阶段换 slim 或 distroless 基础镜像、构建后删 /var/cache,这三招基本能解决八成体积问题。

qidao123.com企服评测-应用市场 编辑提示

本文以 Spring Boot 为例讲 Docker 镜像打包全流程,构建、打标签、运行验证、体积优化和常见坑。命令按 Linux 环境给出,构建上下文建议配 .dockerignore;生产环境注意镜像仓库鉴权、非 root 运行与配置注入。企业可把 Dockerfile 纳入代码评审,统一基础镜像和构建参数,降低各团队之间的环境差异。

回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表