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

本文详细介绍了如何使用Docker Compose管理多容器应用,包含完整的Flask+Redis示例项目,从项目结构到配置详解,帮助开发者摆脱繁琐的多终端docker run命令。

Docker Compose 入门指南

多容器管理的挑战

如果你刚接触Docker,可能已经发现了使用docker run命令运行单个容器很方便。但当你的应用需要数据库、缓存时,情况就变得复杂了:

  • 标签页1:运行长长的docker run命令启动数据库
  • 标签页2:另一个docker run命令启动缓存
  • 标签页3:庞大的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将所有必要服务放在私有虚拟网络中

实战演示:Hello World计数器应用

让我们从经典的"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 Compose魔法(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
    • 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代码即可完成。

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