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

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

相关推荐
●VON2 小时前
本地大模型部署实录:从Docker环境搭建到Open WebUI公网访问
运维·docker·容器·大模型
迷路爸爸1802 小时前
Docker 入门学习笔记 03:端口映射到底是什么,为什么容器启动了却访问不到
笔记·学习·docker
迷路爸爸1802 小时前
Docker 入门学习笔记 07:用一个多服务案例真正理解 Docker Compose
运维·笔记·学习·spring cloud·docker·容器·eureka
斯普信云原生组3 小时前
Docker 开源软件应急处理方案及操作手册——Docker 服务启动故障处理
运维·docker·容器
斯普信云原生组3 小时前
Docker 开源软件应急处理方案及操作手册——存储卷与数据持久化问题
docker·容器·eureka
斯普信云原生组3 小时前
Docker 开源软件应急处理方案及操作手册——Docker Compose 应急处理
docker·容器·eureka
文静小土豆3 小时前
Harbor容器化部署
docker·kubernetes
Traving Yu3 小时前
Kubernetes(K8s)
云原生·容器·kubernetes
hanzhuhuaa3 小时前
golang工程部署到docker容器(三)
运维·docker·容器