Docker Compose 入门指南:轻松管理多容器应用

本文详细介绍了如何使用Docker Compose管理多容器应用,包括Docker Compose的基本概念、YAML配置文件编写、服务依赖关系设置,并通过一个包含Flask应用和Redis的实战示例展示其使用方法。

Docker Compose 入门指南

如果你刚接触 Docker,可能已经发现了使用 docker run 命令可以轻松运行单个容器。但是,如果你的应用需要数据库怎么办?需要缓存怎么办?很快你就会陷入终端标签页的噩梦:

  • 标签页 1 有一个冗长的 docker run 命令来启动你的数据库
  • 标签页 2 也有一个 docker run 命令来启动你的缓存
  • 在第三个标签页中,有一个巨大的 docker run 命令用于你的 Web 应用,你正试图将其与其他两个连接起来

这种情况只会变得越来越难以控制。这种设置容易忘记、容易出错,并且难以传达给新队友。这就是 Docker Compose 的用武之地。只需一个命令,它就能让你定义和运行整个多容器应用。

什么是 Docker Compose?

将 Docker Compose 想象成一道菜的烹饪食谱。

这个配置/食谱写在名为 docker-compose.yml 的单个文件中。(YAML 是一种配置文件格式。)

食谱提到了应用程序运行所需的成分列表。在 Docker 术语中,这些被称为"服务"。服务只是一个运行中的容器。例如:

  • mywebapp:你的 Python、Node.js 或 Java 应用程序
  • db:Postgres 或 MySQL 数据库
  • cache:Redis 缓存

通过在一个关键文件中定义所有服务/配置,你具有以下优势:

  • 单一命令:你只需输入 docker-compose up 就能按正确顺序创建和启动每个应用程序及其依赖项。停止也很简单,只需输入 docker-compose down
  • 自动网络管理:Docker Compose 将所有必要的服务放在一个私有虚拟网络中。这意味着你的 mywebapp 服务可以通过使用名称 “db” 轻松与你的 db 服务通信

简单演示

让我们从经典的"Hello World"示例开始。每次刷新网页时,其计数器应该增加。这个应用程序有两个简单的服务:

  • mywebapp:一个简单的基于 Flask 的应用程序,显示查看次数
  • redis:一个实际存储计数器的 Redis 数据库

项目结构:

1
2
3
4
5
/hello-docker
    |-- app.py
    |-- requirements.txt
    |-- Dockerfile
    |-- docker-compose.yml

步骤 1:Python 应用 (app.py)

这是一个小型 Web 应用。注意 host='redis' 是我们与 Redis 通信的方式。这是我们在 Docker Compose 文件中定义的服务名称。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
# app.py

from flask import Flask
from redis import Redis
import os

# 一个普通的 Flask 应用
app = Flask(__name__)

# 我们连接到名为 'redis' 的服务
redis = Redis(host='redis', port=6379)

@app.route('/')
def hello():
    # 'redis.incr' 将数字增加 1
    count = redis.incr('hits')
    return f'Hello from Docker-Compose! The total count is {count}.'

if __name__ == "__main__":
    # 在端口 5000 上运行应用。这可以是系统中任何开放的端口
    app.run(host="0.0.0.0", port=5000)

requirements.txt

1
2
flask
redis

步骤 2:Dockerfile

这是我们构建自己的 Web 服务的"说明书"。它只是一个标准的 Python Dockerfile。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Dockerfile
FROM python:3.10-slim

WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .

# 容器启动时运行应用
CMD ["python", "app.py"]

步骤 3:Docker 通过 docker-compose.yml 施展魔法

这是经典的配方文件。这是所有魔法实际发生的地方。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# docker-compose.yml
version: '3.9'  # 指定 docker-compose 版本

services:
  # 我们的第一个服务:Web 应用
  mywebapp:
    build: .
    ports:
      - "5000:5000"
    depends_on:
      - redis

  # Redis 数据库
  redis:
    image: "redis:alpine"

让我们逐行分析:

  • services::定义我们将在应用中交互的顶级服务
  • mywebapp::我们给第一个服务的名称
    • build: .:“从本地当前目录构建此服务”
    • ports: ["5000:5000"]:“这行告诉将本地计算机的端口 5000 连接到容器的端口 5000(Flask 应用运行的地方)”
    • depends_on: [redis]:“这告诉在 Redis 应用启动并运行之前不要启动应用程序”
  • redis::我们给 Redis 数据库服务的名称
    • image: "redis:alpine":“使用 docker-hub 中最新的 redis:alpine 镜像”

步骤 4:运行它!

现在是最精彩的部分。确保你在项目目录(/hello-docker)中。

启动应用程序:

1
docker-compose up

添加 -d 在后台运行:docker-compose up -d

Docker 将构建你的 Web 镜像,拉取 Redis 镜像,并启动两个容器。打开浏览器,访问 http://localhost:5000 — 你应该看到"Hello from Docker-Compose! The total count is {}"。刷新页面,计数将上升!你的 Web 容器正在成功与 Redis 容器通信。

停止应用程序。完成后,在终端中按 Ctrl+C。如果你在后台运行,输入:

1
docker-compose down

此命令停止并移除所有容器及其创建的网络。

结论

这些是 Docker Compose 的基础知识。只需一个文件和一条命令,我们就可以轻松维护和管理多容器设置。只需一个命令,我们就有效地消除了运行多个 docker-run 的需要,有助于提高本地开发设置的生产力。

任何复杂的软件都可以通过 Docker Compose 的帮助进行容器化。添加缓存、数据库或任何其他服务只需添加几行 YAML 代码即可完成。

祝你在接下来的编码旅程中 Docker Compose 愉快!

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计