简介
本新手指南将引导你完成安装 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
- 更新软件包索引:
sudo apt-get update
- 安装必要的软件包,以便 APT 可以通过 HTTPS 使用存储库:
sudo apt-get install -y \
ca-certificates \
curl \
gnupg \
lsb-release
- 添加官方 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
- 设置 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
- 安装 Docker 引擎:
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
- 通过运行以下命令验证安装:
sudo docker run hello-world
安装 Docker Compose
在 Ubuntu 22.04 上,Docker Compose 作为 Docker 引擎安装过程的一部分进行安装。但是,如果你需要安装特定版本的 Docker Compose,可以按照以下步骤操作:
- 下载最新版本的 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
- 将可执行权限应用于 Docker Compose 二进制文件:
sudo chmod +x /usr/local/bin/docker-compose
- 通过运行以下命令验证安装:
docker-compose --version
现在你已经安装了 Docker 和 Docker Compose,就可以开始使用 Docker Compose 定义和部署你的多容器应用程序了。
在 Compose 文件中定义服务
Docker Compose 应用程序的核心是 Compose 文件,它采用 YAML 格式编写。在这个文件中,你要定义构成应用程序的不同服务及其配置。
服务定义
Compose 文件中的每个服务都被定义为一个顶级键,比如 web、db 或 redis。在每个服务下,你可以指定各种配置选项,例如要使用的 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:
在这个示例中,我们有三个服务:
web:运行最新版本的 Nginx 网络服务器,将主机上的端口 80 映射到容器中的端口 80,并将主机上的./app目录挂载到容器中的/usr/share/nginx/html目录。db:运行 MySQL 5.7 数据库,设置MYSQL_ROOT_PASSWORD环境变量,并挂载一个名为db-data的卷来存储数据库数据。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 的应用程序。
故障排除
- 检查日志:如果你在 Compose 应用程序中遇到问题,第一步是使用
docker-compose logs命令检查日志。这将帮助你识别服务中的任何错误或问题。 - 检查容器:你可以使用
docker-compose ps命令列出正在运行的容器及其状态。这可以帮助你识别任何未按预期运行的容器。 - 调试服务:如果特定服务的行为不符合预期,你可以使用
docker-compose exec命令访问容器并调试问题。例如,docker-compose exec web bash将在web服务容器内为你提供一个 shell。 - 验证配置:仔细检查你的 Compose 文件,以确保服务定义、网络配置和卷设置正确。你可以使用
docker-compose config命令验证 Compose 文件的语法和结构。
最佳实践
- 使用环境变量:利用环境变量来存储配置设置,例如数据库凭据或 API 密钥。这使得管理敏感信息并使你的应用程序适应不同环境变得更加容易。
- 分离关注点:考虑将你的应用程序拆分为更小、更易于管理的服务。这将使扩展、维护和测试应用程序的各个组件变得更加容易。
- 实施健康检查:为你的服务配置健康检查,以确保容器正常运行。这将帮助 Compose 监控应用程序的健康状况并采取适当的行动,例如重启不健康的容器。
- 对你的 Compose 文件进行版本控制:将你的 Compose 文件存储在版本控制系统中,如 Git。这将帮助你跟踪更改、与团队成员协作,并确保在不同环境中进行一致的部署。
- 明智地使用网络:利用自定义网络来隔离和控制服务之间的连接。这可以提高应用程序的安全性和性能。
- 利用 LabEx:考虑使用 LabEx,这是一个强大的平台,提供额外的功能和工具来增强你的 Docker Compose 体验。LabEx 可以帮助你简化基于 Compose 的应用程序的部署、监控和管理。
通过遵循这些故障排除步骤和最佳实践,你可以有效地管理和维护你的 Docker Compose 应用程序,确保它们在各种环境中平稳、可靠地运行。
总结
在本教程结束时,你将对如何安装和使用 Docker Compose 以简化应用程序部署和管理有扎实的理解。你将能够定义你的服务、部署和管理你的 Compose 应用程序,并对可能出现的任何问题进行故障排除。无论你是 Docker 的新手还是希望提高你的 Compose 技能,本指南都将为你提供入门所需的知识和工具。



