Docker Compose
多容器应用的定义与编排工具
核心概念
Docker Compose 通过 docker-compose.yml 文件定义和运行多容器应用。
yaml
version: '3.8'
services:
app:
build: .
ports:
- "8080:3000"
environment:
- NODE_ENV=production
- DB_HOST=db
depends_on:
- db
networks:
- app-network
db:
image: mysql:8
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: myapp
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
mysql-data:
networks:
app-network:
driver: bridge常用命令
bash
# 启动(后台运行)
docker compose up -d
# 启动并重新构建
docker compose up -d --build
# 停止并删除
docker compose down
# 停止并删除卷
docker compose down -v
# 查看日志
docker compose logs
docker compose logs -f
# 查看服务状态
docker compose ps
# 执行命令
docker compose exec app ls -la
# 扩容
docker compose up -d --scale app=3
# 查看资源
docker compose top服务配置详解
build 配置
yaml
services:
app:
build:
context: ./src
dockerfile: Dockerfile.prod
args:
- NODE_ENV=production
image: myapp:latest # 构建后的镜像名ports 端口映射
yaml
services:
app:
ports:
- "8080:3000" # 主机:容器
- "9090:3001" # 多个端口
- "127.0.0.1:8080:3000" # 绑定特定 IPenvironment 环境变量
yaml
services:
app:
environment:
- NODE_ENV=production
- DB_HOST=db
# 或使用对象形式
environment:
NODE_ENV: production
DB_HOST: ${DB_HOST:-db} # 支持默认值depends_on 依赖关系
yaml
services:
app:
depends_on:
- db
- redis
# 等待依赖就绪(v2.1+)
depends_on:
db:
condition: service_healthy
db:
image: mysql:8
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 3s
retries: 5volumes 数据卷
yaml
services:
app:
volumes:
- ./src:/app/src # 绑定挂载
- app-data:/app/data # 命名卷
- /host/config:/config:ro # 只读
volumes:
app-data:networks 网络
yaml
services:
app:
networks:
- frontend
- backend
networks:
frontend:
driver: bridge
ipam:
config:
- subnet: 172.20.0.0/16
backend:
driver: bridgerestart 策略
yaml
services:
app:
restart: always # 总是重启
# restart: on-failure # 失败时重启
# restart: unless-stopped # 除非手动停止多环境配置
环境变量文件
bash
# .env
DB_PASSWORD=secret
REDIS_HOST=redisyaml
# docker-compose.yml
services:
app:
environment:
DB_PASSWORD: ${DB_PASSWORD}多配置文件
├── docker-compose.yml # 基础配置
├── docker-compose.dev.yml # 开发环境
├── docker-compose.prod.yml # 生产环境
└── docker-compose.override.yml # 开发覆盖bash
# 使用特定配置
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d开发与生产分离
yaml
# docker-compose.yml (通用)
services:
app:
build: .
environment:
- NODE_ENV=${NODE_ENV}
# docker-compose.dev.yml (开发)
services:
app:
volumes:
- ./src:/app/src
environment:
- NODE_ENV=development
command: npm run dev
# docker-compose.prod.yml (生产)
services:
app:
command: npm start
deploy:
replicas: 3
resources:
limits:
cpus: '0.5'
memory: 512M完整示例:前端应用
yaml
version: '3.8'
services:
# 前端开发
frontend:
build:
context: ./frontend
dockerfile: Dockerfile.dev
ports:
- "3000:3000"
volumes:
- ./frontend:/app
- /app/node_modules
environment:
- NODE_ENV=development
command: npm run dev
networks:
- app-network
# 后端 API
api:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "4000:4000"
environment:
- NODE_ENV=development
- DB_HOST=db
- REDIS_HOST=redis
depends_on:
db:
condition: service_healthy
redis:
condition: service_started
networks:
- app-network
# 数据库
db:
image: mysql:8
ports:
- "3306:3306"
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: myapp
volumes:
- mysql-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- app-network
# 缓存
redis:
image: redis:7-alpine
ports:
- "6379:6379"
volumes:
- redis-data:/data
networks:
- app-network
# Nginx 反向代理
nginx:
image: nginx:alpine
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
- frontend
- api
networks:
- app-network
volumes:
mysql-data:
redis-data:
networks:
app-network:
driver: bridge面试高频题
Q1: Docker Compose 的作用是什么?
答案:
- 定义和管理多容器应用
- 通过 YAML 文件配置服务
- 一键启动/停止整个应用
- 支持环境变量、多配置文件
Q2: depends_on 的作用和限制?
答案:
- 作用:定义服务依赖关系,确保启动顺序
- 限制(旧版本):仅等待容器启动,不等待服务就绪
- 解决方案(v2.1+):使用
condition: service_healthy+ healthcheck
Q3: docker-compose up --scale 的作用?
答案:
- 扩容服务实例数量
- 用于负载均衡和高可用
bash
docker compose up -d --scale app=3Q4: docker-compose vs Kubernetes?
| 特性 | Docker Compose | Kubernetes |
|---|---|---|
| 规模 | 单主机 | 跨集群 |
| 复杂度 | 简单 | 复杂 |
| 功能 | 基础编排 | 完整容器编排平台 |
| 适用 | 开发/测试 | 生产环境 |