马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
一、为什么需要先做镜像
把程序做成 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 纳入代码评审,统一基础镜像和构建参数,降低各团队之间的环境差异。
|