Docker 进阶核心实战:自定义镜像 + Dockerfile + Docker Compose

企业开发、微服务部署、自动化打包必须掌握的三件套

全程结构:

  1. Dockerfile 制作自定义镜像(核心)
  2. 最佳实践与避坑
  3. Docker Compose 一键编排整套项目
  4. 企业标准完整案例(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 生产最佳实践

  1. 使用 alpine / slim 最小镜像
  2. 多阶段构建
  3. 不使用 root 用户运行
  4. 设置 WORKDIR
  5. EXPOSE 声明端口
  6. ENTRYPOINT 而不是 CMD
  7. 镜像打标签(版本号)
  8. 清理缓存,减小体积

五、第二部分: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

✅ 企业开发、面试、运维全能用

相关推荐
爱吃龙利鱼7 小时前
K8s 监控实战:victoria-metrics-k8s-stack 高可用部署,资源占用直降 70%,比 Prometheus 省 5 倍磁盘
docker·kubernetes·prometheus
STDD7 小时前
Kubeflow ML 流水线 K8s 部署教程:机器学习工作流编排全攻略
机器学习·容器·kubernetes
爱吃龙利鱼7 小时前
k8s1.36部署helm和storageclass
云原生·容器·kubernetes
yuezhilangniao7 小时前
2026删除K8s命名空间 卡 Terminating 的 ns
java·容器·kubernetes
又是进步的一天7 小时前
一台虚拟机学习CI流程
学习·ci/cd·云原生·容器·kubernetes·devops
IT WorryFree8 小时前
GitHub Actions 流水线注入敏感配置完整方案(Antora + Docker Compose)
docker·容器·github
我爱学习好爱好爱8 小时前
Docker Compose部署SpringBoot2+Vue3+redis项目(Rockylinux9.6):MySQL 主从复制实战
redis·mysql·docker
梦想的颜色8 小时前
Dockerfile 深度实战:从指令底层原理到生产级镜像构建的艺术
docker·容器·镜像·dockerfile·dockerfile解析
heimeiyingwang9 小时前
【架构实战】Docker容器化:从镜像到部署的完整实践
docker·容器·架构
遇见火星18 小时前
Docker Compose 完全入门:一键启动所有容器
运维·docker·容器·docker compose