【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
让不同服务互通,避免网络问题
这样,你的微服务架构就变得更可维护、可扩展、可移植!🚀