前后端加缓存一把梭:用 Docker Compose 把全家桶拉起来
有个小项目:Vue 写的前端、Flask 写的后端、Redis 做缓存。以前每次本地跑都要开三个终端、记三套启动命令,谁先起、端口对不对全靠脑子。后来用 docker-compose.yml 把这三个服务编排成一个整体,一条 docker compose up -d 全起来。这篇博客把这版编排拆开讲讲,重点是服务间怎么互通、缓存怎么接。
一、为什么用 Compose 编排
单容器 Docker 适合"一个应用一个镜像",但真实项目天然是多服务的:前端静态资源、后端 API、缓存/数据库。Compose 的价值就是用一个文件描述它们的关系,统一启动、统一网络、统一停掉。不用记 docker run 一长串参数。
我们的拓扑:浏览器 → Nginx(托管前端 + 反代 API)→ Flask → Redis。
二、docker-compose.yml 长什么样
services:
nginx:
image: nginx:alpine
ports:
- "8080:80"
volumes:
- ./frontend/dist:/usr/share/nginx/html:ro
- ./nginx.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- backend
backend:
build: ./backend
environment:
- REDIS_URL=redis://redis:6379
expose:
- "5000"
depends_on:
- redis
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
volumes:
redis-data:
注意 depends_on 只保证启动顺序,不保证"后端已经能连 Redis"——应用里要做重试,别假设依赖已就绪。
三、Nginx 托管前端 + 反代
前端用 npm run build 打成静态文件,挂进 Nginx。反代把 /api 转给 backend:
server {
listen 80;
root /usr/share/nginx/html;
location / { try_files $uri /index.html; }
location /api/ {
proxy_pass http://backend:5000/;
}
}
关键点:Nginx 里写 http://backend:5000,backend 是 Compose 的服务名,Docker 内部 DNS 会自动解析——别写 localhost,容器里 localhost 是它自己。
四、Flask 接 Redis 做缓存
后端查数据前先问 Redis,命中就直接返回,没命中查库再写回:
import redis, json
from flask import Flask
app = Flask(__name__)
r = redis.Redis.from_url("redis://redis:6379", decode_responses=True)
@app.get("/api/stats")
def stats():
cache = r.get("stats")
if cache:
return json.loads(cache) # 命中缓存
data = compute_expensive_stats() # 贵的操作
r.setex("stats", 60, json.dumps(data)) # 缓存 60 秒
return data
redis://redis:6379 同样用服务名,和 compose 里一致。缓存让重复请求不再打穿到计算逻辑,小项目体感提升明显。
五、常用命令
docker compose up -d # 后台启动全部
docker compose logs -f backend # 看某个服务日志
docker compose down # 停掉并删容器(数据卷保留)
docker compose down -v # 连数据卷一起删(慎用)
docker compose build # 改了 Dockerfile 后重新构建
六、几个注意点
- 容器名当主机名:前端/后端/Nginx 互相访问必须用服务名(
backend、redis),写localhost必连不上。 - Redis 数据丢了:没挂 volume,容器一删映射清空。上面
redis-data卷就是为持久化。 - 端口冲突:宿主机 8080 已被占用就起不来,改
ports映射的左边("9090:80")即可,右边容器端口别动。 - depends_on 不是银弹:backend 启动瞬间 Redis 可能还没听端口,应用层加重试比依赖顺序更可靠。
| 服务 | 角色 | 互通方式 |
|---|---|---|
| nginx | 静态托管 + 反代 | 暴露 8080,反代到 backend |
| backend | API + 缓存读写 | 通过服务名连 redis |
| redis | 缓存 | 仅内部 expose,不暴露公网 |

小结
把一个"前端 + 后端 + 缓存"的小项目用 Docker Compose 收拢成一个文件,最大的收益不是少敲几条命令,而是环境一致性——别人 git clone 下来一条命令就能跑,不存在"我机器上是好的"。记住三件事就不会踩坑:服务间用服务名互访、Redis 挂卷持久化、依赖就绪靠应用重试而非 depends_on。这套编排套路,换个数据库、加个队列,都是同一个流程了。
- 点赞
- 收藏
- 关注作者
评论(0)