# Docker Compose 使用教程

Docker Compose 是 Docker 官方提供的用于定义和运行多容器 Docker 应用程序的工具。通过一个 YAML 文件,您可以配置应用程序需要的所有服务,并使用单个命令创建和启动所有服务。本教程将详细介绍 Docker Compose 的使用方法。

1. 安装 Docker Compose

在开始之前,请确保您已经安装了 Docker。然后根据您的操作系统安装 Docker Compose:

# Linux 系统
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

# macOS (使用 Homebrew)
brew install docker-compose

# Windows (从官网下载安装包)
# https://docs.docker.com/compose/install/

2. 基本概念

Docker Compose 使用 YAML 文件 (默认为 `docker-compose.yml`) 来定义服务、网络和卷。核心概念包括:

  • **服务 (Service)**:一个服务就是一个应用容器,例如 web 服务、数据库服务等
  • **项目 (Project)**:由一组关联的服务组成的完整应用单元
  • **网络 (Network)**:用于容器之间通信的网络
  • **卷 (Volume)**:持久化存储数据
  • 3. 编写 docker-compose.yml 文件

这是 Docker Compose 的核心文件,用于定义应用程序的服务、网络和卷。以下是一个基本示例:

version: '3.8'  # 使用版本3.8

services:
  web:
    image: nginx:latest  # 使用nginx最新镜像
    ports:
      - "8080:80"  # 将主机8080端口映射到容器80端口
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf  # 挂载配置文件
      - ./html:/usr/share/nginx/html  # 挂载静态文件
    networks:
      - app-network  # 连接到app-network网络

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example  # 设置root密码
    volumes:
      - db-data:/var/lib/mysql  # 挂载数据卷
    networks:
      - app-network

volumes:
  db-data:  # 定义命名卷

networks:
  app-network:  # 定义网络
    driver: bridge

4. Docker Compose 常用命令

在包含 `docker-compose.yml` 的目录中,可以使用以下命令:

启动服务

# 在前台启动服务(显示日志)
docker-compose up

# 在后台启动服务(-d 表示 detached)
docker-compose up -d

# 启动特定服务
docker-compose up web

停止服务

# 停止所有服务
docker-compose down

# 停止并删除数据卷
docker-compose down -v

# 停止特定服务
docker-compose stop web

查看服务状态

# 查看所有服务状态
docker-compose ps

# 查看服务日志
docker-compose logs

# 实时查看日志(-f 表示 follow)
docker-compose logs -f web

其他常用命令

# 重新构建服务
docker-compose build

# 启动已停止的服务
docker-compose start

# 重启服务
docker-compose restart

# 在服务中执行命令
docker-compose exec web bash

# 查看配置
docker-compose config

5. 高级配置示例

以下是一个更复杂的示例,包含环境变量、依赖服务和健康检查:

version: '3.8'

services:
  app:
    build: .  # 构建镜像
    dockerfile: Dockerfile
    environment:
      DATABASE_URL: mysql://root:example@db:3306/mydb
    depends_on:
      db:
        condition: service_healthy  # 等待db服务健康检查通过
    ports:
      - "5000:5000"
    networks:
      - app-network
    volumes:
      - .:/app  # 挂载当前目录到容器/app

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: mydb
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      timeout: 20s
      retries: 10
      interval: 5s

volumes:
  db-data:

networks:
  app-network:

6. 环境变量和覆盖文件

Docker Compose 支持使用环境变量和覆盖文件:

使用 .env 文件

创建 `.env` 文件:

MYSQL_PASSWORD=secret

然后在 `docker-compose.yml` 中使用:

services:
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: ${MYSQL_PASSWORD}

使用覆盖文件

创建 `docker-compose.override.yml`(开发环境专用):

version: '3.8'
services:
  app:
    volumes:
      - .:/app
    environment:
      - DEBUG=1

运行时 Compose 会自动合并两个文件:

docker-compose up

7. 实例:部署 WordPress

这是一个使用 Docker Compose 部署 WordPress 和 MySQL 的完整示例:

version: '3.8'

services:
  wordpress:
    image: wordpress:latest
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - wordpress:/var/www/html
    networks:
      - app-network
    depends_on:
      - db

  db:
    image: mysql:5.7
    environment:
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
      MYSQL_ROOT_PASSWORD: rootpassword
    volumes:
      - db:/var/lib/mysql
    networks:
      - app-network
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  wordpress:
  db:

networks:
  app-network:

启动这个应用:

docker-compose up -d

现在您可以通过浏览器访问 `http://localhost:8080` 来配置 WordPress。

8. 生产环境最佳实践

在生产环境中使用 Docker Compose 时,建议:

1. 使用多个 Compose 文件(docker-compose.yml + docker-compose.prod.yml)

2. 不要在 Compose 文件中硬编码密码,使用环境变量

3. 为容器设置资源限制:

```python

deploy:

resources:

limits:

cpus: '0.5'

memory: 512M

```

4. 使用外部卷和网络:

```python

volumes:

db-data:

external: true

```

5. 定期备份重要数据

总结

Docker Compose 是一个强大的多容器管理工具,通过一个简单的 YAML 文件即可定义复杂的分布式应用。本教程涵盖了从安装、基本概念、编写配置文件到高级配置和实际应用部署的完整流程。掌握 Docker Compose 可以显著简化多容器应用的开发、测试和部署流程,提高工作效率。对于更复杂的容器编排需求,可以进一步学习 Kubernetes,但 Docker Compose 仍然是许多场景下的理想选择,尤其是在开发和中小规模部署环境中。

发表回复

后才能评论