Docker Compose 安装与使用新手指南

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本新手指南将引导你完成安装 Docker 和 Docker Compose 的过程,并教你如何使用 Compose 来定义、部署和管理你的应用程序。你将了解 Docker Compose 中可用的关键特性和配置选项,以及扩展和负载均衡你的 Compose 应用程序的最佳实践。

什么是 Docker Compose?

Docker Compose 是一个工具,可让你定义和运行多容器 Docker 应用程序。它通过提供一种声明式方式来定义应用程序的服务、网络和卷,简化了管理和编排多个 Docker 容器的过程。

使用 Docker Compose,你可以:

定义应用程序的服务

你可以在单个 YAML 文件中定义构成应用程序的不同服务,例如 Web 服务器、数据库和消息队列。这个文件称为 “Compose 文件”,它描述了每个服务的配置,包括要使用的 Docker 镜像、要暴露的网络端口以及要挂载的任何环境变量或卷。

管理应用程序的生命周期

Docker Compose 提供了用于启动、停止和管理整个应用程序生命周期的命令。你可以使用 docker-compose up 来创建并启动 Compose 文件中定义的所有服务,使用 docker-compose down 来停止并移除它们。

简化开发和测试

Docker Compose 在应用程序的开发和测试阶段特别有用。它允许你轻松启动一个包含所有必要服务的完整开发环境,从而更轻松地以一致且可重复的方式测试应用程序。

graph TD A[开发者] --> B[Docker Compose] B --> C[Web 服务器] B --> D[数据库] B --> E[消息队列]

通过使用 Docker Compose,你可以确保应用程序在从开发到生产的不同环境中以相同方式运行,降低特定于环境的问题风险。

服务 镜像 端口 环境
Web 服务器 nginx:latest 80:80 -
数据库 mysql:5.7 3306:3306 MYSQL_ROOT_PASSWORD=password
消息队列 rabbitmq:3-management 5672:5672, 15672:15672 -

总之,Docker Compose 是一个强大的工具,它简化了多容器 Docker 应用程序的管理和部署,使你能够以一致且可重复的方式更轻松地开发、测试和运行复杂应用程序。

安装 Docker 和 Docker Compose

在开始使用 Docker Compose 之前,你需要在系统上安装 Docker 和 Docker Compose。在本节中,我们将指导你在 Ubuntu 22.04 系统上完成安装过程。

安装 Docker

  1. 更新软件包索引:
sudo apt-get update
  1. 安装必要的软件包,以便 APT 可以通过 HTTPS 使用存储库:
sudo apt-get install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
  1. 添加官方 Docker GPG 密钥:
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
  1. 设置 Docker 存储库:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 安装 Docker 引擎:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
  1. 通过运行以下命令验证安装:
sudo docker run hello-world

安装 Docker Compose

在 Ubuntu 22.04 上,Docker Compose 作为 Docker 引擎安装过程的一部分进行安装。但是,如果你需要安装特定版本的 Docker Compose,可以按照以下步骤操作:

  1. 下载最新版本的 Docker Compose:
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
  1. 将可执行权限应用于 Docker Compose 二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
  1. 通过运行以下命令验证安装:
docker-compose --version

现在你已经安装了 Docker 和 Docker Compose,就可以开始使用 Docker Compose 定义和部署你的多容器应用程序了。

在 Compose 文件中定义服务

Docker Compose 应用程序的核心是 Compose 文件,它采用 YAML 格式编写。在这个文件中,你要定义构成应用程序的不同服务及其配置。

服务定义

Compose 文件中的每个服务都被定义为一个顶级键,比如 webdbredis。在每个服务下,你可以指定各种配置选项,例如要使用的 Docker 镜像、要暴露的网络端口、环境变量等等。

这是一个包含三个服务的简单 Compose 文件示例:

version: "3"
services:
  web:
    image: nginx:latest
    ports:
      - 80:80
    volumes: -./app:/usr/share/nginx/html

  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: password
    volumes:
      - db-data:/var/lib/mysql

  redis:
    image: redis:latest
    ports:
      - 6379:6379

volumes:
  db-data:

在这个示例中,我们有三个服务:

  1. web:运行最新版本的 Nginx 网络服务器,将主机上的端口 80 映射到容器中的端口 80,并将主机上的 ./app 目录挂载到容器中的 /usr/share/nginx/html 目录。

  2. db:运行 MySQL 5.7 数据库,设置 MYSQL_ROOT_PASSWORD 环境变量,并挂载一个名为 db-data 的卷来存储数据库数据。

  3. redis:运行最新版本的 Redis 内存数据存储,将主机上的端口 6379 映射到容器中的端口 6379。

卷和网络

除了定义服务之外,Compose 文件还允许你定义服务可以使用的共享卷和网络。

在上面的示例中,我们定义了一个名为 db-data 的卷来存储 MySQL 数据库数据。这个卷可以在多个服务之间共享,确保即使容器停止或重新创建,数据也能持久保存。

你还可以定义自定义网络来控制服务之间的连接。当你想要隔离某些服务或创建更复杂的网络拓扑时,这会很有用。

通过使用 Compose 文件,你可以轻松定义和管理应用程序的不同组件,从而更轻松地部署、扩展和维护你的多容器 Docker 应用程序。

部署和管理 Compose 应用程序

一旦你在 Compose 文件中定义了服务,就可以使用 Docker Compose 命令来部署和管理你的应用程序。

部署应用程序

要部署你的应用程序,请导航到包含 Compose 文件的目录并运行以下命令:

docker-compose up -d

-d 标志会以分离模式运行容器,这意味着它们将在后台运行。

Docker Compose 将读取 Compose 文件,创建必要的 Docker 网络和卷,并启动所有定义的服务。

管理应用程序生命周期

部署应用程序后,你可以使用以下 Docker Compose 命令来管理其生命周期:

  • docker-compose stop:停止所有正在运行的服务。
  • docker-compose start:启动已停止的服务。
  • docker-compose restart:重启所有正在运行的服务。
  • docker-compose down:停止并移除所有服务、网络和卷。

例如,要停止应用程序,可以运行:

docker-compose stop

要再次启动它,可以运行:

docker-compose start

扩展服务

Docker Compose 使你能够轻松地扩展服务的规模,增加或减少实例数量。要扩展特定服务,可以使用 scale 命令:

docker-compose scale web=3 db=2

这将把 web 服务扩展到 3 个实例,把 db 服务扩展到 2 个实例。

你还可以在部署应用程序时使用带有 --scale 标志的 up 命令来扩展服务:

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

查看日志

要查看应用程序的日志,可以使用 logs 命令:

docker-compose logs

这将显示所有服务的日志。你还可以通过指定服务名称来查看特定服务的日志:

docker-compose logs web

通过使用这些 Docker Compose 命令,你可以轻松地部署、管理和扩展多容器应用程序,从而更轻松地以一致且可重复的方式开发、测试和运行复杂应用程序。

高级 Compose 功能与配置

虽然基本的 Compose 文件结构和命令已经很强大,但 Docker Compose 还提供了一系列高级功能和配置选项,以帮助你构建更复杂、更健壮的应用程序。

环境变量与机密信息

你可以使用环境变量将配置设置传递给你的服务。Docker Compose 支持构建时和运行时环境变量,这些变量可以在服务级别或全局级别定义。

此外,你可以使用 Docker 机密信息来安全地存储敏感信息,例如数据库密码或 API 密钥,并将它们提供给你的服务。

version: "3"
services:
  web:
    image: myapp/web
    environment:
      - DATABASE_URL=mysql://root:${DB_PASSWORD}@db/myapp
    secrets:
      - db-password

secrets:
  db-password: file:./db-password.txt

依赖管理与健康检查

Docker Compose 允许你定义服务依赖关系,确保服务按正确顺序启动,并且在启动其他服务之前,依赖的服务是健康的。

你还可以为你的服务配置健康检查,这使 Compose 能够监控容器的健康状况并采取适当的行动,例如重启不健康的容器。

version: "3"
services:
  web:
    image: myapp/web
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 30s
      timeout: 10s
      retries: 5

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

网络与服务发现

Docker Compose 会自动为你的应用程序创建一个默认网络,但你也可以定义自定义网络并控制服务的网络配置。

此外,Compose 提供了内置的服务发现功能,允许你的服务使用 Compose 文件中定义的服务名称相互查找和通信。

version: "3"
services:
  web:
    image: myapp/web
    networks:
      - frontend
    environment:
      - DB_HOST=db

  db:
    image: mysql:5.7
    networks:
      - backend

networks:
  frontend:
  backend:

通过利用这些高级功能,你可以构建更复杂、更具弹性和可扩展性的 Docker Compose 应用程序,以满足你组织的需求。

使用 Compose 进行扩展和负载均衡

使用 Docker Compose 的主要优势之一是能够轻松扩展服务并实现负载均衡。在本节中,我们将探讨如何实现这些功能。

扩展服务

如前所述,你可以使用 scale 命令来扩展服务的规模,增加或减少实例数量。当你需要处理增加的流量或资源需求时,这特别有用。

例如,假设你的 Compose 文件中定义了一个 web 服务:

version: "3"
services:
  web:
    image: myapp/web
    ports:
      - 80:80

要将 web 服务扩展到 3 个实例,你可以运行以下命令:

docker-compose scale web=3

这将创建另外两个 web 服务实例,使你能够在多个容器之间分配负载。

负载均衡

Docker Compose 还提供了内置的负载均衡功能。当你定义一个服务的多个实例时,Compose 将自动在可用容器之间对传入请求进行负载均衡。

version: "3"
services:
  web:
    image: myapp/web
    ports:
      - 80:80
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure

在这个例子中,我们将 web 服务定义为有 3 个副本。当你运行 docker-compose up 时,Compose 将创建三个 web 服务实例,并在它们之间对传入请求进行负载均衡。

你还可以配置其他负载均衡选项,例如重启策略,以确保你的应用程序保持高可用性。

graph TD A[Client] --> B[Load Balancer] B --> C[Web Service 1] B --> D[Web Service 2] B --> E[Web Service 3]

通过利用 Docker Compose 的扩展和负载均衡功能,你可以构建高度可扩展且具有弹性的应用程序,以处理增加的流量和资源需求。

故障排除与最佳实践

与任何技术一样,在使用 Docker Compose 时,你可能会遇到问题或挑战。在本节中,我们将介绍一些常见的故障排除步骤和最佳实践,以帮助你有效地管理基于 Compose 的应用程序。

故障排除

  1. 检查日志:如果你在 Compose 应用程序中遇到问题,第一步是使用 docker-compose logs 命令检查日志。这将帮助你识别服务中的任何错误或问题。
  2. 检查容器:你可以使用 docker-compose ps 命令列出正在运行的容器及其状态。这可以帮助你识别任何未按预期运行的容器。
  3. 调试服务:如果特定服务的行为不符合预期,你可以使用 docker-compose exec 命令访问容器并调试问题。例如,docker-compose exec web bash 将在 web 服务容器内为你提供一个 shell。
  4. 验证配置:仔细检查你的 Compose 文件,以确保服务定义、网络配置和卷设置正确。你可以使用 docker-compose config 命令验证 Compose 文件的语法和结构。

最佳实践

  1. 使用环境变量:利用环境变量来存储配置设置,例如数据库凭据或 API 密钥。这使得管理敏感信息并使你的应用程序适应不同环境变得更加容易。
  2. 分离关注点:考虑将你的应用程序拆分为更小、更易于管理的服务。这将使扩展、维护和测试应用程序的各个组件变得更加容易。
  3. 实施健康检查:为你的服务配置健康检查,以确保容器正常运行。这将帮助 Compose 监控应用程序的健康状况并采取适当的行动,例如重启不健康的容器。
  4. 对你的 Compose 文件进行版本控制:将你的 Compose 文件存储在版本控制系统中,如 Git。这将帮助你跟踪更改、与团队成员协作,并确保在不同环境中进行一致的部署。
  5. 明智地使用网络:利用自定义网络来隔离和控制服务之间的连接。这可以提高应用程序的安全性和性能。
  6. 利用 LabEx:考虑使用 LabEx,这是一个强大的平台,提供额外的功能和工具来增强你的 Docker Compose 体验。LabEx 可以帮助你简化基于 Compose 的应用程序的部署、监控和管理。

通过遵循这些故障排除步骤和最佳实践,你可以有效地管理和维护你的 Docker Compose 应用程序,确保它们在各种环境中平稳、可靠地运行。

总结

在本教程结束时,你将对如何安装和使用 Docker Compose 以简化应用程序部署和管理有扎实的理解。你将能够定义你的服务、部署和管理你的 Compose 应用程序,并对可能出现的任何问题进行故障排除。无论你是 Docker 的新手还是希望提高你的 Compose 技能,本指南都将为你提供入门所需的知识和工具。