第四章 Docker Compose v1.0
第一部分 简介
一、什么是Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件来配置应用程序的服务,然后使用一个命令就可以创建并启动所有服务。
二、核心概念
- 服务(Service):一个容器的配置,包括镜像、端口、环境变量等
- 项目(Project):一组服务的集合,由一个
docker-compose.yml文件定义 - 网络(Network):服务之间通信的桥梁
- 卷(Volume):数据持久化的存储
第二部分 安装与配置
一、安装
新版 Docker 已经将 Compose 作为 Docker CLI 插件提供,安装 Docker Engine 时可以一并安装。
bash
# 检查是否安装
docker compose version二、配置文件结构
yaml
version: "3.8" # Docker Compose 文件版本
services: # 定义服务
web:
image: nginx:latest
ports:
- "8080:80"
volumes:
- ./html:/usr/share/nginx/html
networks:
- app-network
depends_on:
- app
app:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
networks:
- app-network
networks: # 定义网络
app-network:
driver: bridge
volumes: # 定义数据卷
db-data:第三部分 常用命令
一、服务管理
bash
# 启动所有服务(后台运行)
docker compose up -d
# 停止并删除容器、网络
docker compose down
# 停止并删除容器、网络、数据卷
docker compose down -v
# 重启所有服务
docker compose restart
# 停止所有服务
docker compose stop
# 启动已停止的服务
docker compose start二、查看状态
bash
# 查看服务状态
docker compose ps
# 查看服务日志
docker compose logs -f
# 查看特定服务日志
docker compose logs -f <服务名>
# 查看资源使用情况
docker compose top三、构建与拉取
bash
# 构建或重新构建服务
docker compose build
# 拉取服务依赖的镜像
docker compose pull
# 强制重新创建容器
docker compose up -d --force-recreate第四部分 配置详解
一、镜像与构建
yaml
services:
# 使用现有镜像
web:
image: nginx:latest
# 使用 Dockerfile 构建
app:
build:
context: ./app # 构建上下文路径
dockerfile: Dockerfile # 指定 Dockerfile
args: # 构建参数
- NODE_ENV=production二、端口映射
yaml
services:
web:
ports:
- "8080:80" # 宿主机端口:容器端口
- "443:443"
- "127.0.0.1:3000:3000" # 指定绑定地址三、数据卷挂载
yaml
services:
db:
volumes:
- ./data:/var/lib/mysql # 本地目录挂载
- db-data:/var/lib/mysql # 命名卷
- ./config/my.cnf:/etc/mysql/my.cnf:ro # 只读挂载
volumes:
db-data:四、环境变量
yaml
services:
app:
# 方式一:直接定义
environment:
- NODE_ENV=production
- DB_HOST=db
# 方式二:使用 .env 文件
env_file:
- .env五、依赖关系
yaml
services:
web:
depends_on:
- app
- db
app:
depends_on:
db:
condition: service_healthy # 等待 db 健康检查通过六、网络配置
yaml
services:
web:
networks:
- frontend
- backend
db:
networks:
- backend
networks:
frontend:
backend:第五部分 实战示例
一、Web应用 + 数据库
yaml
version: "3.8"
services:
web:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
- ./html:/usr/share/nginx/html
depends_on:
- app
networks:
- frontend
app:
build: ./app
ports:
- "3000:3000"
environment:
- DB_HOST=db
- DB_USER=root
- DB_PASSWORD=secret
- DB_NAME=myapp
depends_on:
db:
condition: service_healthy
networks:
- frontend
- backend
db:
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=secret
- MYSQL_DATABASE=myapp
volumes:
- db-data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 10s
timeout: 5s
retries: 5
networks:
- backend
networks:
frontend:
backend:
volumes:
db-data:二、监控栈(Prometheus + Grafana)
yaml
version: "3.8"
services:
prometheus:
image: prom/prometheus:latest
ports:
- "9090:9090"
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
- prometheus-data:/prometheus
networks:
- monitoring
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
- grafana-data:/var/lib/grafana
depends_on:
- prometheus
networks:
- monitoring
node-exporter:
image: prom/node-exporter:latest
ports:
- "9100:9100"
networks:
- monitoring
networks:
monitoring:
volumes:
prometheus-data:
grafana-data:第六部分 常用技巧
一、使用 .env 文件
创建 .env 文件管理环境变量:
bash
# .env
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=myapp
APP_PORT=3000在 docker-compose.yaml 中使用:
yaml
services:
db:
image: mysql:8
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=${MYSQL_DATABASE}
app:
ports:
- "${APP_PORT}:3000"二、多环境配置
bash
# 开发环境
docker compose -f docker-compose.yaml -f docker-compose.dev.yaml up -d
# 生产环境
docker compose -f docker-compose.yaml -f docker-compose.prod.yaml up -d三、常用别名
bash
# 在 ~/.bashrc 或 ~/.zshrc 中添加
alias dc='docker compose'
alias dcup='docker compose up -d'
alias dcdown='docker compose down'
alias dcps='docker compose ps'
alias dclogs='docker compose logs -f'