当前位置: 首页 > article >正文

【Docker】-Docker Compose+Dockerfile最佳实践

最佳实践

在实际生产环境中,Docker Compose + Dockerfile 的最佳实践通常包括以下几部分:

  • 使用 Dockerfile 构建微服务镜像
  • 使用 docker-compose.yml 管理多个微服务
  • 使用 volumes 进行数据持久化
  • 使用 networks 进行服务间通信
  • 使用 depends_on 确保依赖服务先启动

📁 示例工程目录结构

my-microservices/
│── docker-compose.yml   # 管理所有微服务
│── .env                 # 环境变量
│── backend/
│   ├── Dockerfile       # 后端服务 Dockerfile
│   ├── src/             # 业务代码
│   ├── pom.xml          # Maven/Gradle 依赖文件
│── frontend/
│   ├── Dockerfile       # 前端服务 Dockerfile
│   ├── src/             # 前端代码
│   ├── package.json     # 前端依赖文件
│── database/
│   ├── init.sql         # 数据库初始化 SQL
│── logs/                # 日志存储
└── volumes/             # 持久化存储

1️⃣ Dockerfile 示例

🔹 后端 (backend/Dockerfile)

# 使用 OpenJDK 17 作为基础镜像
FROM openjdk:17-jdk-slim

# 设置工作目录
WORKDIR /app

# 复制 JAR 文件(假设已经通过 Maven/Gradle 构建)
COPY target/backend-service.jar app.jar

# 设置运行参数(支持环境变量注入)
ENTRYPOINT ["java", "-jar", "app.jar", "--spring.profiles.active=${SPRING_PROFILES_ACTIVE:-prod}"]

🔹 前端 (frontend/Dockerfile)

# 使用 Node.js 作为基础镜像
FROM node:18-alpine

# 设置工作目录
WORKDIR /app

# 复制 package.json 并安装依赖
COPY package.json package-lock.json ./
RUN npm install

# 复制项目代码并构建
COPY . .
RUN npm run build

# 使用 Nginx 作为前端服务器
FROM nginx:alpine
COPY --from=0 /app/build /usr/share/nginx/html
EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

2️⃣ docker-compose.yml

version: "3.8"

services:
  backend:
    build: ./backend  # 通过 Dockerfile 构建
    container_name: backend-service
    ports:
      - "8080:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=prod
      - SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/mydb
      - SPRING_DATASOURCE_USERNAME=root
      - SPRING_DATASOURCE_PASSWORD=root
    depends_on:
      db:
        condition: service_healthy
    networks:
      - backend-network
    volumes:
      - logs:/app/logs

  frontend:
    build: ./frontend  # 通过 Dockerfile 构建
    container_name: frontend-service
    ports:
      - "3000:80"
    depends_on:
      - backend
    networks:
      - backend-network

  db:
    image: mysql:8.0
    container_name: mysql-db
    restart: always
    environment:
      - MYSQL_ROOT_PASSWORD=root
      - MYSQL_DATABASE=mydb
    ports:
      - "3306:3306"
    volumes:
      - db-data:/var/lib/mysql
      - ./database/init.sql:/docker-entrypoint-initdb.d/init.sql
    networks:
      - backend-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      retries: 3
      timeout: 5s

networks:
  backend-network:

volumes:
  db-data:
  logs:

3️⃣ .env 文件(可选)

SPRING_PROFILES_ACTIVE=prod
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=mydb

这样 docker-compose.yml 可以引用环境变量:

environment:
  - SPRING_PROFILES_ACTIVE=${SPRING_PROFILES_ACTIVE}
  - MYSQL_DATABASE=${MYSQL_DATABASE}

4️⃣ 使用 Docker Compose 部署

1️⃣ 构建镜像

docker-compose build

2️⃣ 启动服务

docker-compose up -d

3️⃣ 查看日志

docker-compose logs -f

4️⃣ 重新启动某个服务

docker-compose up -d --build backend

5️⃣ 进入容器

docker exec -it backend-service sh

6️⃣ 停止并删除所有容器

docker-compose down

🔹 最佳实践总结

使用 Dockerfile 构建镜像,避免 docker-compose 直接拉取外部镜像
使用 depends_on 确保服务依赖关系,避免数据库未启动导致连接失败
使用 healthcheck 确保数据库启动完成,避免服务过早启动
使用 volumes 进行数据持久化,防止 MySQL 容器删除后数据丢失
使用 networks 让不同服务互通,避免网络问题

这样,你的微服务架构就变得更可维护可扩展可移植!🚀


http://www.kler.cn/a/590032.html

相关文章:

  • 百度正式发布文心大模型 4.5 及文心大模型 X1
  • 深入理解 HTML 字符实体:解决特殊字符显示难题
  • axios防止重复请求
  • 提高开发效率:公共字段自动化填充方案
  • LeetCode134☞加油站
  • 【农业大数据处理与应用】实验二 随机森林算法与LSTM循环神经网络
  • 来客推商城V3多用户uni-app商城源码怎么样?
  • Spark DataFrame、Dataset 和 SQL 解析原理深入解析(万字长文多张原理图)
  • 嵌入式Linux | 什么是 BootLoader、Linux 内核(kernel)、和文件系统?
  • 对最近的刷题做一个小总结(关于动态规划和贪心)
  • LVDS(Low Voltage Differential Signaling)电平详解
  • 【每日学点HarmonyOS Next知识】上下拉列表、停止无限循环动画、页面列表跟随列表滑动、otf字体、日期选择
  • Linux目录理解
  • 海外红人营销助力游戏出海:从单一营销到生态构建的转变
  • uniapp APP权限弹框
  • 图论——广度优先搜索实现
  • golang-嵌套结构体
  • Python----计算机视觉处理(Opencv:ROI图像切割)
  • 基于FPGA的3U机箱轨道交通网络通讯板,对内和主控板、各类IO板通信,对外可进行RS485、CAN或MVB组网通信
  • 结构型模式之组合模式:让对象构成树形结构