Skip to content

LV050-Compose

一、Compose 简介

1. 概述

在前面的课程中,我们学习了如何使用 Docker 容器来运行单个服务。 通过 docker run 命令,我们可以快速启动一个数据库、一个 Web 服务器或者一个缓存服务。 这种方式在开发简单应用时非常有效。然而,随着应用架构的演进,微服务的理念逐渐流行,一个应用可能由多个相互依赖的服务组成。 如果继续使用单容器管理方式,我们需要手动管理容器间的网络连接、存储卷映射、环境变量配置等,这不仅增加了运维的复杂度,还容易因手动操作而出错。

这就是为什么我们需要一个更高层次的工具来管理多容器应用。 Docker Compose 应运而生,它通过一个声明式的 YAML 配置文件,帮助我们定义和管理多容器应用。 通过 Docker Compose,我们可以用一个命令就完成整个应用的部署,而不需要手动管理每个容器。

2. 什么是 Compose?

Docker Compose 是用于定义和运行多容器应用程序的工具。 它是解锁简化和高效的开发和部署体验的关键。

它的官方仓库在这里:docker/compose,这里面是它实现的源码。

相关文档:

Docker Compose | Docker Docs

Docker Compose | Docker 中文文档(Docker 官方文档,Docker 官方教程)

3. 为什么要使用它

使用 Docker Compose 具有多项优势,可以简化容器化应用程序的开发、部署和管理:

  • 简化控制:Docker Compose 允许您在单个 YAML 文件中定义和管理多容器应用程序。这简化了编排和协调各种服务的复杂任务,从而更轻松地管理和复制您的应用程序环境。
  • 高效协作:Docker Compose 配置文件易于共享,促进了开发人员、运营团队和其他利益相关者之间的协作。这种协作方法可实现更顺畅的工作流程、更快的问题解决速度并提高整体效率。
  • 快速应用程序开发:Compose 会缓存用于创建容器的配置。当您重新启动未更改的服务时,Compose 会重新使用现有容器。重复使用容器意味着您可以非常快速地更改环境。
  • 跨环境的可移植性:Compose 支持 Compose 文件中的变量。您可以使用这些变量为不同的环境或不同的用户自定义合成。
  • 广泛的社区和支持:Docker Compose 受益于一个充满活力和活跃的社区,这意味着丰富的资源、教程和支持。这个社区驱动的生态系统有助于 Docker Compose 的持续改进,并帮助用户有效地解决问题。

4. 安装Compose

之前老的版本docker可能不支持Compose相关命令,需要安装,但是后来新版本已经内置了,我们就不需要单独再去安装了。

安装 Docker Compose 概述 | Docker中文文档(Docker官方文档,Docker官方教程)

二、Docker Compose 核心概念

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。使用 Compose,你可以通过一个 YAML 文件来配置应用程序的所有服务,然后使用一个命令来创建和启动所有服务。

1. 主要概念

  • 服务 (Services): 容器的定义,包括使用哪个镜像、端口映射、环境变量等
  • 网络 (Networks): 定义容器之间如何通信
  • 卷 (Volumes): 定义数据的持久化存储
  • 依赖关系 (Dependencies): 定义服务之间的启动顺序
  • 环境变量 (Environment Variables): 管理不同环境的配置

2. 核心命令

  • docker compose up: 创建和启动所有服务,这样会在前台启动,我们加上 -d 选项就会放到后台了。
  • docker compose down: 停止和删除所有服务
  • docker compose ps: 查看服务状态
  • docker compose logs: 查看服务日志

三、配置文件语法

这里主要就看官方文档中的配置文件说明:编写文件参考 | Docker中文文档(Docker官方文档,Docker官方教程)

四、使用示例

1. 相关文件

1.1 Dockerfile

dockerfile
# 从 Python 3.7 映像开始构建镜像。
FROM python:3.7-alpine

# 将工作目录设置为 /code
WORKDIR /code

# 设置 flask 命令使用的环境变量
ENV FLASK_APP app.py
ENV FLASK_RUN_HOST 0.0.0.0

# 安装 gcc,以便诸如 MarkupSafe 和 SQLAlchemy 之类的 Python 包可以编译加速
RUN apk add --no-cache gcc musl-dev linux-headers

# 复制 requirements.txt 并安装 Python 依赖项
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

# 将 . 项目中的当前目录复制到 . 镜像中的工作目录
COPY . .

# 器提供默认的执行命令为:flask run
CMD ["flask", "run"]

1.2 app.py

python
"""
文件: app.py
描述: 基于 Flask 和 Redis 的简单 Web 应用,用于统计访问次数并返回结果
作者: [你的名字]
日期: 2025-11-02
"""

import time

import redis
from flask import Flask

# 初始化 Flask 应用
app = Flask(__name__)
# 初始化 Redis 连接
cache = redis.Redis(host='redis', port=6379)


def get_hit_count():
    """
    获取 Redis 中的访问计数
    :return: 当前访问次数
    """
    retries = 5
    while True:
        try:
            return cache.incr('hits')  # 增加计数并返回
        except redis.exceptions.ConnectionError as exc:
            if retries == 0:
                raise exc
            retries -= 1
            time.sleep(0.5)  # 等待后重试


@app.route('/')
def hello():
    """
    处理根路径的请求,返回访问次数
    :return: 包含访问次数的欢迎消息
    """
    count = get_hit_count()
    return 'Hello World! I have been seen {} times.\n'.format(count)

1.3 docker-compose.yml

yaml
# yaml 配置
version: '3'
services:
  web:
    build: . # 该 web 服务使用从 Dockerfile 当前目录中构建的镜像
    ports:   # 将容器和主机绑定到暴露的端口 5000
      - "5000:5000"
    volumes:
      - "data-vol:/app/data"
  redis:     # 该 redis 服务使用 Docker Hub 的公共 Redis 映像
    image: "redis:alpine"
    volumes:
      - "data-vol:/app/data"

# 定义持久化存储卷
volumes:
  data-vol:

1.4 requirements.txt

markdown
flask
redis

2. 测试效果

shell
docker compose up -d # 放在后台启动

然后我们可以在port这里添加5000端口:

image-20251103000750751

然后访问这个地址:

image-20251103000830442

参考资料:

史上最全docker-compose.yaml语法规则版本(version) 含义:指定 Compose 文件的版本。 - 掘金

(9 封私信) docker compose 配置文件 .yml 全面指南 - 知乎

莫道桑榆晚 为霞尚满天.