Docker Compose使用教程

1. 引言

Docker Compose是一个用于定义和运行多容器Docker应用程序的工具。通过一个简单的YAML文件,您可以配置应用程序的所有服务,然后使用单个命令创建并启动所有服务。本教程将详细介绍Docker Compose的安装、配置文件编写、常用命令、网络和卷管理、环境变量处理以及生产环境部署等各个方面,帮助您全面掌握Docker Compose的使用。

2. 安装Docker Compose

在开始使用Docker Compose之前,您需要先安装它。Docker Compose是一个独立的工具,与Docker引擎一起工作。以下是不同操作系统上的安装步骤:

2.1. Linux系统安装

下载最新版本的Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

为二进制文件添加可执行权限:

sudo chmod +x /usr/local/bin/docker-compose

创建软链接(可选):

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

验证安装:

docker-compose --version

2.2. macOS系统安装

在macOS上,Docker Compose已包含在Docker Desktop中。只需安装Docker Desktop即可自动包含Docker Compose。

2.3. Windows系统安装

在Windows上,同样需要安装Docker Desktop,Docker Compose会自动安装并包含在Docker环境中。

3. Docker Compose基本概念

Docker Compose的核心概念包括:

服务(Service):一个服务代表一个容器,例如Web服务器、数据库等。在docker-compose.yml文件中定义。

项目(Project):由一组关联的服务组成,由docker-compose.yml文件定义。

容器(Container):由服务创建的运行实例。

网络(Network):用于服务之间的通信。Docker Compose会自动创建一个默认网络。

卷(Volume):用于持久化数据,即使容器被删除,数据仍然保留。

4. 编写docker-compose.yml文件

docker-compose.yml是Docker Compose的核心配置文件,使用YAML格式编写。以下是一个典型的多服务应用程序的docker-compose.yml文件示例:

version: '3.8'  # 指定Compose文件版本

services:       # 定义服务
  web:          # 服务名称
    image: nginx:latest  # 使用的镜像
    ports:      # 端口映射
      - "8080:80"
    volumes:    # 卷挂载
      - ./html:/usr/share/nginx/html
    networks:   # 连接的网络
      - app-network
    environment:  # 环境变量
      - NGINX_HOST=example.com
    depends_on:  # 服务依赖
      - db

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: secret
      MYSQL_DATABASE: mydb
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - app-network
    healthcheck:  # 健康检查
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 3

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

volumes:        # 定义卷
  db-data:

4.1. 文件结构详解

version: 指定Compose文件版本格式,不同版本支持不同的功能。

services: 定义所有服务,每个服务由名称、镜像、端口、卷等属性组成。

image: 指定服务使用的Docker镜像。

ports: 将容器端口映射到主机端口,格式为"主机端口:容器端口"。

volumes: 挂载卷到容器,格式为"主机路径:容器路径"。也可以使用命名卷(如db-data)。

networks: 指定服务连接的网络。可以自定义网络,如app-network。

environment: 设置环境变量。

depends_on: 指定服务依赖关系,确保依赖的服务先启动。

healthcheck: 定义健康检查命令,用于监控服务状态。

networks (顶级): 定义网络配置。

volumes (顶级): 定义命名卷。

5. 使用docker-compose命令

Docker Compose提供了一套命令来管理应用程序的生命周期。以下是最常用的命令:

5.1. 启动服务

docker-compose up -d

-d 参数表示在后台运行服务。

5.2. 停止服务

docker-compose down

停止并删除容器、网络、卷和镜像(由--rmi选项控制)。

5.3. 查看服务状态

docker-compose ps

显示所有服务的运行状态。

5.4. 查看服务日志

docker-compose logs -f web

-f 参数表示实时跟踪日志,web 是服务名称。

5.5. 进入容器执行命令

docker-compose exec web bash

web服务中启动bash终端。

5.6. 构建镜像

docker-compose build

构建或重建服务使用的镜像。

5.7. 扩展服务

docker-compose up -d --scale web=3

web服务扩展为3个实例。

6. 网络配置

Docker Compose默认创建一个名为<项目名>_default的网络。所有服务都连接到这个网络,可以使用服务名称作为主机名相互访问。

6.1. 自定义网络

在docker-compose.yml中定义自定义网络:

networks:
  app-network:
    driver: bridge
    ipam:
      driver: default
      config:
        - subnet: 172.20.0.0/16

6.2. 外部网络

连接到已存在的Docker网络:

networks:
  default:
    external:
      name: my_existing_network

7. 卷配置

卷用于持久化数据,有三种类型:

命名卷:在顶级volumes中定义,由Docker管理。

绑定挂载:挂载主机目录到容器。

临时卷:仅容器生命周期内存在。

7.1. 示例配置

services:
  web:
    volumes:
      - html:/usr/share/nginx/html  # 命名卷
      - ./config:/etc/nginx/conf.d   # 绑定挂载
      - /tmp                       # 临时卷

volumes:
  html:                           # 命名卷定义

8. 环境变量处理

Docker Compose支持多种方式处理环境变量:

8.1. 在docker-compose.yml中设置

environment:
  - DEBUG=1
  - DATABASE_URL=mysql://root:secret@db/mydb

8.2. 使用.env文件

创建.env文件:

DEBUG=1
DATABASE_URL=mysql://root:secret@db/mydb

然后在docker-compose.yml中引用:

environment:
  - DEBUG=${DEBUG}
  - DATABASE_URL=${DATABASE_URL}

8.3. 命令行覆盖

docker-compose up -e DEBUG=0

9. 生产环境部署

在生产环境中使用Docker Compose需要考虑以下因素:

9.1. 使用非root用户

在Dockerfile中创建非root用户:

FROM node:14
RUN useradd -m appuser
USER appuser

9.2. 安全配置

services:
  web:
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - NET_BIND_SERVICE
    read_only: true
    tmpfs:
      - /tmp:rw,size=100m

9.3. 日志管理

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

9.4. 反向代理

使用Nginx作为反向代理:

services:
  nginx:
    image: nginx:alpine
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./ssl:/etc/nginx/ssl
    depends_on:
      - web

9.5. 健康检查

healthcheck:
  test: ["CMD", "curl", "-f", "http://localhost/health"]
  interval: 30s
  timeout: 10s
  retries: 3
  start_period: 40s

9.6. 资源限制

services:
  web:
    deploy:
      resources:
        limits:
          cpus: '0.50'
          memory: 512M
        reservations:
          cpus: '0.25'
          memory: 256M

10. 高级特性

10.1. 依赖管理

depends_on:
  db:
    condition: service_healthy  # 依赖服务的健康状态

10.2. 配置文件

services:
  app:
    configs:
      - source: app_config
        target: /etc/app/config.json

configs:
  app_config:
    file: ./config.json

10.3. 密钥管理

services:
  db:
    secrets:
      - db_password

secrets:
  db_password:
    file: ./secrets/db_password.txt

11. 总结

Docker Compose是一个强大的工具,极大地简化了多容器应用程序的开发、测试和部署流程。通过本文的详细介绍,您应该能够:

安装并配置Docker Compose环境

编写复杂的docker-compose.yml文件,定义多服务应用程序

使用docker-compose命令管理容器生命周期

配置网络和卷实现服务通信和数据持久化

处理环境变量以适应不同环境

实施生产环境最佳实践,包括安全、日志和资源管理

利用高级特性如健康检查、依赖管理和密钥管理

Docker Compose特别适合开发环境和小规模生产环境,但对于大规模生产部署,建议结合使用Docker Swarm或Kubernetes等容器编排平台。继续实践和探索Docker Compose的各种功能,将帮助您构建更健壮、更高效的容器化应用程序。

发表回复

后才能评论