LV050-Compose
一、Compose 简介
1. 概述
在前面的课程中,我们学习了如何使用 Docker 容器来运行单个服务。 通过 docker run 命令,我们可以快速启动一个数据库、一个 Web 服务器或者一个缓存服务。 这种方式在开发简单应用时非常有效。然而,随着应用架构的演进,微服务的理念逐渐流行,一个应用可能由多个相互依赖的服务组成。 如果继续使用单容器管理方式,我们需要手动管理容器间的网络连接、存储卷映射、环境变量配置等,这不仅增加了运维的复杂度,还容易因手动操作而出错。
这就是为什么我们需要一个更高层次的工具来管理多容器应用。 Docker Compose 应运而生,它通过一个声明式的 YAML 配置文件,帮助我们定义和管理多容器应用。 通过 Docker Compose,我们可以用一个命令就完成整个应用的部署,而不需要手动管理每个容器。
2. 什么是 Compose?
Docker Compose 是用于定义和运行多容器应用程序的工具。 它是解锁简化和高效的开发和部署体验的关键。
它的官方仓库在这里:docker/compose,这里面是它实现的源码。
相关文档:
3. 为什么要使用它
使用 Docker Compose 具有多项优势,可以简化容器化应用程序的开发、部署和管理:
- 简化控制:Docker Compose 允许您在单个 YAML 文件中定义和管理多容器应用程序。这简化了编排和协调各种服务的复杂任务,从而更轻松地管理和复制您的应用程序环境。
- 高效协作:Docker Compose 配置文件易于共享,促进了开发人员、运营团队和其他利益相关者之间的协作。这种协作方法可实现更顺畅的工作流程、更快的问题解决速度并提高整体效率。
- 快速应用程序开发:Compose 会缓存用于创建容器的配置。当您重新启动未更改的服务时,Compose 会重新使用现有容器。重复使用容器意味着您可以非常快速地更改环境。
- 跨环境的可移植性:Compose 支持 Compose 文件中的变量。您可以使用这些变量为不同的环境或不同的用户自定义合成。
- 广泛的社区和支持:Docker Compose 受益于一个充满活力和活跃的社区,这意味着丰富的资源、教程和支持。这个社区驱动的生态系统有助于 Docker Compose 的持续改进,并帮助用户有效地解决问题。
4. 安装Compose
之前老的版本docker可能不支持Compose相关命令,需要安装,但是后来新版本已经内置了,我们就不需要单独再去安装了。
二、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
# 从 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
"""
文件: 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 配置
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
flask
redis2. 测试效果
docker compose up -d # 放在后台启动然后我们可以在port这里添加5000端口:

然后访问这个地址:

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