前后端加缓存一把梭:用 Docker Compose 把全家桶拉起来

举报
海是岛思念的泪 发表于 2026/09/14 09:49:28 2026/09/14
【摘要】 一个 Vue 前端 + Flask 后端 + Redis 缓存的小项目,每次手动起三个服务又烦又易错。这篇用 docker-compose.yml 把三者编排成一个整体,讲清 nginx 托管前端、Flask 查缓存、服务间网络互通和常见坑。

有个小项目: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,不暴露公网

image.png

小结

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

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。