用 Docker 一键部署 Flask + Redis 微服务
🐳【新手实战】用 Docker 一键部署 Flask + Redis 微服务(详细教程 + 报错排查)
👋 作者:应届生一枚,最近在自学后端和部署相关技术。这篇文章记录了我在学习
Docker
和docker-compose
过程中,如何从 0 开始部署一个 Flask + Redis 微服务的全过程,以及踩过的坑和一些理解,希望能帮到你。
为什么要做这个实验?(背景与动机)
我最开始接触 Flask 的时候,只在本地跑 python app.py
,程序能跑起来,但每次都需要装依赖、配置环境,很容易“我这能跑你那不行”。
后来我接触到 Docker,发现它就像“打包好的开发环境 + 应用”,别人拿到镜像就能运行,特别适合部署。
但光有 Flask 还不够,大多数 Web 项目都要和数据库打交道。为了练习服务之间的通信,我就尝试在 Docker 里同时运行:
- 一个 Flask Web 服务
- 一个 Redis 数据库服务
两者通过 docker-compose
编排和通信,组成一个简单的微服务架构。
学完这个你能掌握什么?
- ✅ 会写一个能运行的 Flask + Redis 应用;
- ✅ 会写 Dockerfile 打包 Python 应用镜像;
- ✅ 会用
docker-compose
编排多容器服务; - ✅ 懂得容器间网络通信原理(服务名通信);
- ✅ 能排查常见的构建 / 网络 / 依赖错误。
实验目标
我们要用容器启动两个服务:
- Flask:提供 Web 接口,显示访问次数;
- Redis:记录每次访问的计数。
最终效果:
访问 http://localhost:5000,页面显示:
Hello! I have been seen 1 times.
每刷新一次,数字会加一。
项目目录结构
我们先把项目放到一个文件夹 pycode/
里:
pycode/
├── app.py # Flask 应用代码
├── server.txt # 依赖清单:flask + redis
├── Dockerfile # 构建 Flask 镜像
├── docker-compose.yaml # 编排 Flask + Redis 容器
app.py:核心代码
from flask import Flask
import redisapp = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)@app.route('/')
def hello():count = cache.incr('hits')return f'Hello! I have been seen {count} times.\n'if __name__ == '__main__':app.run(host='0.0.0.0', port=5000)
解释:
redis.Redis(host='redis')
:容器内通过服务名连接 Redis;cache.incr('hits')
:访问一次就给 Redis 中的hits
键加 1;0.0.0.0
:让容器内部 Flask 对外暴露端口。
server.txt:Python 依赖
flask
redis
Dockerfile:构建 Flask 镜像
FROM python:3.13-alpine
WORKDIR /code
COPY server.txt .
RUN pip wheel --no-cache-dir --no-deps --wheel-dir /code/wheels -r server.txt
COPY . .
RUN pip install --no-index --no-cache-dir --find-links=/code/wheels -r server.txt
CMD ["python", "app.py"]
解释:
- 使用
python:3.13-alpine
,轻量小巧; - 使用
pip wheel
先生成本地依赖包,加快安装; CMD
是程序入口,Flask 启动。
docker-compose.yaml:启动两个容器
version: '3'
services:web:build: .ports:- "5000:5000"depends_on:- redisredis:image: "redis:alpine"
说明:
build: .
表示当前目录的 Dockerfile;depends_on
保证 redis 服务先启动;- 默认 redis 监听 6379 端口。
启动服务并访问
在项目根目录下执行:
docker-compose up --build
构建完之后你会看到 Flask 启动了:
* Running on http://0.0.0.0:5000
此时访问:
http://localhost:5000
页面会显示访问次数。
报错排查指南(踩坑合集)
我同学有不少人部署失败,以下是我总结的几个高频错误:
❌ 1. Python 没装好?
很多人以为 Docker 要依赖本地 Python,其实不需要。
✅ Dockerfile 里已经用
FROM python:3.13-alpine
装好了 Python 环境,跟你本机有没有 Python 没关系。
❌ 2. 构建失败:镜像拉不下来
Error response from daemon: pull access denied...
📌 解决:
- 镜像名拼错了?正确的是:
python:3.13-alpine
,不是python3.13-alpine
- 没挂梯子?换国内源:
docker pull registry.docker-cn.com/python:3.13-alpine
❌ 3. pip 安装依赖失败
Could not fetch URL https://pypi.org/simple/... timed out
解决:
添加国内 pip 源,加快速度:
mkdir -p ~/.pip
cat > ~/.pip/pip.conf << EOF
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
EOF
❌ 4. Redis 连不上
ConnectionError: Error 111 connecting to redis:6379
检查:
host='redis'
是否写错;- redis 容器是否启动成功 (
docker ps
查看); - flask 容器里能否 ping 通 redis (
docker exec -it 容器 bash
进去 ping redis)
为什么这个实验有价值?
这不是“写完就扔”的练手项目,它是:
- 微服务架构最基本的雏形;
- 多容器通信的经典案例;
- 学习部署思维的切入点(开发 ≠ 运行);
- 为未来部署 Django、FastAPI、PostgreSQL、RabbitMQ 打基础。
后续可以拓展什么?
如果你搞定了这一版,推荐你往下探索:
- ✅ 给 Flask 加入模板引擎和静态资源;
- ✅ 使用 Nginx 反向代理,绑定域名;
- ✅ Redis 做持久化:挂载数据卷保存数据;
- ✅ Docker Compose 加入
.env
配置文件; - ✅ 用 GitHub Actions 实现自动构建和发布。
✅ 总结
Docker 是后端开发者的第二大脑,而
docker-compose
是你手里的魔术棒。
这次实验让我理解了什么叫“容器化部署”,也让我第一次体会到不用本机装 Python 就能跑程序的爽感。