Skip to content

Docker Compose使用指南:从入门到实践

引言

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。本文将详细介绍Docker Compose的使用方法和最佳实践。

基础概念

什么是Docker Compose

Docker Compose通过一个YAML文件配置应用程序的服务,然后使用一个命令创建并启动所有服务。

主要特性

  1. 单主机上的多个隔离环境
  2. 保持容器创建时的数据卷
  3. 仅重新创建已更改的容器
  4. 支持环境变量和变量替换

基本配置

docker-compose.yml

yaml
version: '3.8'

services:
  web:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - ./www:/usr/share/nginx/html
    depends_on:
      - php
      - mysql

  php:
    build: ./php
    volumes:
      - ./www:/var/www/html
    environment:
      - DB_HOST=mysql
      - DB_DATABASE=app
      - DB_USERNAME=root
      - DB_PASSWORD=secret

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_DATABASE=app
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:

常用命令

基本操作

bash
# 启动服务
docker-compose up -d

# 停止服务
docker-compose down

# 查看服务状态
docker-compose ps

# 查看服务日志
docker-compose logs -f

# 进入容器
docker-compose exec php bash

网络配置

自定义网络

yaml
version: '3.8'

networks:
  frontend:
    driver: bridge
  backend:
    driver: bridge

services:
  nginx:
    networks:
      - frontend
      - backend
    # ...

  php:
    networks:
      - backend
    # ...

  mysql:
    networks:
      - backend
    # ...

数据持久化

数据卷配置

yaml
version: '3.8'

volumes:
  db_data:
    driver: local
  redis_data:
    driver: local

services:
  mysql:
    volumes:
      - db_data:/var/lib/mysql
      - ./mysql/init.sql:/docker-entrypoint-initdb.d/init.sql:ro

  redis:
    volumes:
      - redis_data:/data
      - ./redis/redis.conf:/usr/local/etc/redis/redis.conf:ro

环境变量

使用.env文件

env
# .env
MYSQL_ROOT_PASSWORD=secret
MYSQL_DATABASE=app
REDIS_PASSWORD=secret
yaml
# docker-compose.yml
version: '3.8'

services:
  mysql:
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}

  redis:
    environment:
      - REDIS_PASSWORD=${REDIS_PASSWORD}

构建配置

Dockerfile

dockerfile
# php/Dockerfile
FROM php:8.1-fpm

# 安装扩展
RUN apt-get update && apt-get install -y \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# 安装Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

CMD ["php-fpm"]

构建配置

yaml
version: '3.8'

services:
  php:
    build:
      context: ./php
      dockerfile: Dockerfile
      args:
        PHP_VERSION: '8.1'

服务扩展

服务依赖

yaml
version: '3.8'

services:
  web:
    depends_on:
      - api
      - redis

  api:
    depends_on:
      - mysql
      - redis

  worker:
    depends_on:
      - redis
      - mysql

健康检查

yaml
version: '3.8'

services:
  mysql:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

生产环境配置

多环境配置

yaml
# docker-compose.prod.yml
version: '3.8'

services:
  web:
    restart: always
    environment:
      - VIRTUAL_HOST=example.com
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

  mysql:
    restart: always
    volumes:
      - /data/mysql:/var/lib/mysql

使用命令

bash
# 使用生产配置
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d

常见问题处理

容器启动顺序

yaml
version: '3.8'

services:
  web:
    depends_on:
      mysql:
        condition: service_healthy
      redis:
        condition: service_healthy

  mysql:
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

日志管理

yaml
version: '3.8'

services:
  web:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

实战案例

LNMP环境

yaml
version: '3.8'

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
    volumes:
      - ./nginx/conf.d:/etc/nginx/conf.d
      - ./www:/var/www/html
    depends_on:
      - php

  php:
    build: ./php
    volumes:
      - ./www:/var/www/html
    depends_on:
      mysql:
        condition: service_healthy

  mysql:
    image: mysql:8.0
    environment:
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=${DB_DATABASE}
    volumes:
      - mysql_data:/var/lib/mysql
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  mysql_data:

最佳实践

  1. 使用版本控制管理配置文件
  2. 合理使用环境变量
  3. 实现健康检查
  4. 配置日志轮转
  5. 使用数据卷持久化数据

总结

Docker Compose是一个强大的容器编排工具,通过合理的配置和使用,可以大大简化开发和部署流程。

参考资料

  1. Docker Compose官方文档
  2. Docker实战(第2版)
  3. Docker Compose实战指南

幸运的人用童年治愈一生,不幸的人用一生治愈童年 —— 强爸