Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它通过 YAML 文件配置应用程序的服务,使用一条命令即可创建并启动所有服务。
1. 环境准备与项目初始化
在开始之前,确保已安装 Docker Engine 和 Docker Compose 插件。
创建 一个名为 docker-compose-demo 的项目目录,并进入该目录。
mkdir docker-compose-demo
cd docker-compose-demo
在这个示例中,我们将构建一个简单的 Web 应用,包含两个容器:
- Web 服务:一个 Python Flask 应用。
- Redis 服务:用于为 Web 应用提供缓存和计数功能。
以下是两个容器之间的关系示意图:
2. 创建 Web 应用代码
我们需要为 Web 服务准备代码文件。
新建一个名为 app.py 的文件,并写入以下代码:
import time
import redis
from flask import Flask
app = Flask(__name__)
# 通过服务名 'redis' 连接数据库
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
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():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
if __name__ == "__main__":
app.run(host="0.0.0.0", debug=True)
这段代码的功能是连接到 Redis 服务,并在每次访问页面时增加计数器。
新建一个名为 requirements.txt 的文件,用于声明 Python 依赖包:
flask
redis
3. 编写 Web 服务的 Dockerfile
为了让 Docker 能够构建 Web 服务的镜像,我们需要定义 Dockerfile。
创建一个名为 Dockerfile 的文件(注意文件名首字母大写且无后缀),并粘贴以下内容:
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["flask", "run"]
这个文件的作用是:基于 Python 3.7 镜像,安装依赖,并将当前目录下的代码复制到容器中,最后启动 Flask 应用。
4. 编写 docker-compose.yml 编排文件
这是整个编排过程的核心。docker-compose.yml 文件将定义 Web 服务和 Redis 服务如何协同工作。
创建一个名为 docker-compose.yml 的文件,并写入以下内容:
version: "3.9"
services:
web:
build: .
ports:
- "8000:5000"
redis:
image: "redis:alpine"
代码解析:
version: 指定 Compose 文件的版本格式。services: 定义了两个服务:web和redis。web:build: .: 告诉 Docker 使用当前目录下的Dockerfile来构建镜像。ports: 将主机的8000端口映射到容器的5000端口。
redis:image: 直接使用 Docker Hub 上的官方redis:alpine镜像,无需构建。
此时,你的项目目录结构应包含以下文件:
| 文件名 | 描述 |
|---|---|
app.py |
Python 应用主程序 |
requirements.txt |
Python 依赖列表 |
Dockerfile |
Web 镜像构建文件 |
docker-compose.yml |
多容器编排配置文件 |
5. 启动多容器应用
配置完成后,使用 Docker Compose 命令来启动整个系统。
执行以下命令来构建并启动服务:
docker compose up
注意:如果 Docker Compose 版本较旧,可能需要使用 docker-compose(带连字符)。
当你看到终端输出包含 Hello World! I have been seen 1 times. 或者类似的启动成功日志时,说明服务已经运行。
打开浏览器,访问 http://localhost:8000。
刷新页面几次,你会发现页面上的数字在不断递增。这证明 Flask 应用成功连接到了 Redis 容器,并共享了计数状态。
6. 后台运行与日志管理
在前台运行(当前模式)时,关闭终端或按下 Ctrl + C 会停止所有服务。为了在后台运行服务,请遵循以下步骤:
按下 Ctrl + C 停止当前运行的服务。
执行以下命令以“分离模式”启动服务(即在后台运行):
docker compose up -d
此时终端会返回容器 ID,但不会占据控制台。如果需要查看服务输出,运行:
docker compose logs
如果只想查看特定服务的日志(例如 Web 服务),运行:
docker compose logs web
实时跟踪日志输出(类似 tail -f),添加 -f 参数:
docker compose logs -f
7. 停止与清理
当实验结束或需要重新部署时,必须清理资源。
停止正在运行的服务(保留容器文件系统):
docker compose stop
停止并删除所有容器、网络,以及默认创建的匿名卷:
docker compose down
如果希望彻底清理,包括删除 Redis 产生的数据卷(即重置计数器),请添加 -v 参数:
docker compose down -v
暂无评论,快来抢沙发吧!