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

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

相关推荐
疯狂成瘾者16 分钟前
对比JAR 包部署 vs Docker 部署方式
java·docker·jar
ℳ₯㎕ddzོꦿ࿐1 小时前
实战:在 Linux 系统用 Docker-Compose 优雅部署 GitLab 及防坑指南
linux·docker·gitlab
invicinble1 小时前
对于docker相关的理解
运维·docker·容器
米高梅狮子1 小时前
09.kube-proxy、Ingress和Network Policy
云原生·容器·架构·kubernetes·自动化
今天又在写代码1 小时前
Docker部署
java·阿里云·docker
AI服务老曹1 小时前
深度解析:支持异构计算与 Docker 部署的 AI 视频管理平台——基于 GB28181/RTSP 与源码交付的架构实战
人工智能·docker·音视频
liao__ran2 小时前
Kubernetes攻防 Docker in Docker
docker·容器·kubernetes
Nice_Fold2 小时前
Kubernetes命名空间与Pod核心概念(自用笔记)
笔记·容器·kubernetes
杨浦老苏10 小时前
大模型安全接入网关LinkAI
人工智能·docker·ai·群晖·隐私保护
Dillon Dong14 小时前
【系列主题】Next.js 16 + Turbopack 的暗礁:深入剖析 Tailwind v4 的 CSS 模块解析陷阱
javascript·css·容器·turbopack