企业开发、微服务部署、自动化打包必须掌握的三件套
全程结构:
- Dockerfile 制作自定义镜像(核心)
- 最佳实践与避坑
- Docker Compose 一键编排整套项目
- 企业标准完整案例(SpringBoot + MySQL + Redis)
一、先搞懂三者关系(一句话)
- Dockerfile :构建镜像的脚本(代码 + 环境 = 镜像)
- 自定义镜像 :项目打包好的运行包
- Docker Compose :一键启动多个容器(项目+数据库+中间件)
二、第一部分:Dockerfile 详解(制作自定义镜像)
1. 什么是 Dockerfile?
一个文本文件,定义了:
- 基础系统
- 拷贝代码
- 执行命令
- 启动命令
执行一次,就能生成一个可分发的标准镜像。
2. 核心指令(必须记住)
dockerfile
FROM # 基础镜像(必须第一条)
WORKDIR # 工作目录
COPY # 拷贝文件
RUN # 构建时执行命令
EXPOSE # 暴露端口
ENV # 环境变量
ENTRYPOINT # 容器启动命令(重点)
CMD # 启动参数
3. 企业级标准 Dockerfile(SpringBoot 项目)
dockerfile
# 基础镜像(JDK17 精简版,体积小、安全)
FROM openjdk:17-jdk-slim
# 工作目录
WORKDIR /app
# 拷贝 jar 包(把你的项目jar复制到镜像里)
COPY target/*.jar app.jar
# 环境变量(JVM 参数)
ENV JAVA_OPTS="-Xms512m -Xmx512m"
# 暴露端口
EXPOSE 8080
# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]
4. 构建镜像命令
bash
docker build -t myapp:1.0 .
-t:镜像名称 + 版本.:Dockerfile 所在目录
5. 运行镜像
bash
docker run -p 8080:8080 myapp:1.0
三、Dockerfile 进阶:多阶段构建(企业必备)
作用:让镜像体积减少 80%!
- 第一阶段:打包项目
- 第二阶段:只保留运行环境
- 最终镜像极小、安全、干净
dockerfile
# 阶段1:Maven 构建(只在构建时用,最终不保留)
FROM maven:3.8-openjdk-17 AS build
WORKDIR /app
COPY . .
RUN mvn clean package -DskipTests
# 阶段2:运行环境(最终镜像,极小)
FROM openjdk:17-slim
WORKDIR /app
# 从构建阶段复制 jar 包
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]
四、Dockerfile 生产最佳实践
- 使用 alpine / slim 最小镜像
- 多阶段构建
- 不使用 root 用户运行
- 设置 WORKDIR
- EXPOSE 声明端口
- ENTRYPOINT 而不是 CMD
- 镜像打标签(版本号)
- 清理缓存,减小体积
五、第二部分:Docker Compose 神器(一键启动整套系统)
1. Compose 是什么?
用一个 YAML 文件,定义并启动多个容器
比如:
- 你的应用
- MySQL
- Redis
- MQ
- Elasticsearch
一条命令启动所有服务!
2. 核心命令
bash
docker-compose up -d # 后台启动所有服务
docker-compose down # 停止并删除容器
docker-compose ps # 查看状态
docker-compose logs -f # 查看日志
3. 企业标准 docker-compose.yml
yaml
version: '3.8'
# 服务列表
services:
# 1. 你的应用(使用前面构建的自定义镜像)
myapp:
build: . # 根据 Dockerfile 构建镜像
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=prod
- DB_HOST=mysql # 直接用服务名当地址(服务发现)
- REDIS_HOST=redis
depends_on:
- mysql
- redis
networks:
- app-network
# 2. MySQL
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=appdb
volumes:
- mysql-data:/var/lib/mysql # 数据持久化
networks:
- app-network
# 3. Redis
redis:
image: redis:alpine
volumes:
- redis-data:/data
networks:
- app-network
# 自定义网络(服务互相用名称访问)
networks:
app-network:
# 数据卷(数据不丢失)
volumes:
mysql-data:
redis-data:
六、最强组合:Dockerfile + Compose(企业标准流程)
步骤 1:写好 Dockerfile
步骤 2:写好 docker-compose.yml
步骤 3:一键启动整个项目
bash
docker-compose up -d
效果:
- 自动构建你的项目镜像
- 自动启动 MySQL
- 自动启动 Redis
- 自动配置网络
- 自动持久化数据
- 应用自动连接数据库
这就是企业开发的标准部署方式!
七、最关键的知识点总结
1. Dockerfile
- FROM 基础镜像
- COPY 拷贝代码
- ENTRYPOINT 启动命令
- 多阶段构建 减小体积
2. 自定义镜像
- 一次构建,到处运行
- 环境统一,无差异部署
3. Docker Compose
- 一个文件管理所有服务
- 服务名 = 域名(自动服务发现)
- volumes 持久化
- networks 隔离网络
- 一键启动、一键停止
八、流程总结
✅ 打包自己的项目镜像
✅ 一键启动微服务
✅ 开发/测试/生产环境完全一致
✅ 部署极其简单:丢服务器 → docker-compose up -d
✅ 企业开发、面试、运维全能用