使用Docker部署Python前后端项目

前言

此次部署我会将

前端:vue

后端:FastAPI

一起部署在docker中,因此我的目录构成为一个总目录

底下有三个部分:

①前端项目

②后端项目

③docker-compose.yaml

一、我的项目服务

  • FastAPI 后端
  • mysql:8.0
  • redis
  • Vue 前端

首先确定项目中要启动的服务,再确定dockerfile和docker-compose.yaml文件该怎么写

比如我有上面三个服务,有一个是自定义服务,还有两个是使用的成品服务。

那么我只需要写

  • 两个dockerfile文件
  • 一个dockercompose文件

dockerfile文件用来构建这个服务的镜像,用来单独构建这一个服务

docker-compose-yaml是用来一键启动所有服务,这样就不用每个服务一个一个启动,如果你想一个一个启动,那么不写也可以。

二、编写dockerfile文件

1.FastAPI的dockerfile文件

放在项目根目录

命名:dockerfile

ruby 复制代码
# 1. 基础镜像:选用 slim 版本,体积小,安全漏洞少
FROM python:3.12-slim

# 2. 设置工作目录
WORKDIR /app

# 3. 设置环境变量 (防止 Python 生成 pyc 文件,并在控制台实时输出日志)
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# 4. 安装系统依赖
# 某些 Python 库(如 mysqlclient 或 cryptography)需要 gcc 编译环境
# 安装完后立即清理 apt 缓存,减小镜像体积
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    libpq-dev \
    && rm -rf /var/lib/apt/lists/*

# 5. 依赖安装 (利用 Docker 缓存机制,先复制依赖文件)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 6. 复制项目代码
COPY . .

# 7. 暴露端口 (FastAPI 默认通常配合 Uvicorn 用 8000)
EXPOSE 8000

# 8. 启动命令
# 注意:生产环境使用 uvicorn 启动,host 必须是 0.0.0.0 才能被外部访问
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload", "--log-level", "debug"]

2.Vue的dockerfile文件

ruby 复制代码
# 第一步:构建Vue项目(用Node镜像打包)
FROM node:20-alpine AS build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
    # 打包生成dist目录(Vue的静态资源)

# 第二步:用Nginx部署静态资源(Nginx比Node更适合部署前端,性能高)
FROM nginx:alpine
COPY --from=build-stage /app/dist /usr/share/nginx/html
# 把打包好的dist复制到Nginx
COPY nginx.conf /etc/nginx/conf.d/default.conf
# 自定义Nginx配置(解决跨域)
EXPOSE 80
# Nginx默认端口
CMD ["nginx", "-g", "daemon off;"]
# 启动Nginx

nginx.conf文件

ruby 复制代码
server {
    listen 80;
    server_name localhost;

    # 前端静态资源
    location / {
        root /usr/share/nginx/html;
        index index.html index.htm;
        try_files $uri $uri/ /index.html;  # 解决Vue路由刷新404问题
    }

    # 反向代理后端接口(关键!前端请求/api开头的接口,会转发到后端服务)
    location /api {
        proxy_pass http://fastapi-app:8000;  # fastapi-app是docker-compose里的后端服务名
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

三、编写docker-compose文件

命名:docker-compose-yaml

ruby 复制代码
# 1. 基础镜像:选用 slim 版本,体积小,安全漏洞少
FROM python:3.12-slim

# 2. 设置工作目录
WORKDIR /app

# 3. 设置环境变量 (防止 Python 生成 pyc 文件,并在控制台实时输出日志)
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# 4. 安装系统依赖
# 某些 Python 库(如 mysqlclient 或 cryptography)需要 gcc 编译环境
# 安装完后立即清理 apt 缓存,减小镜像体积
RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc \
    libpq-dev \
    && rm -rf /var/lib/apt/lists/*

# 5. 依赖安装 (利用 Docker 缓存机制,先复制依赖文件)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 6. 复制项目代码
COPY . .

# 7. 暴露端口 (FastAPI 默认通常配合 Uvicorn 用 8000)
EXPOSE 8000

# 8. 启动命令
# 注意:生产环境使用 uvicorn 启动,host 必须是 0.0.0.0 才能被外部访问
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload", "--log-level", "debug"]

四、一键启动/更新/部署:

docker-compose up -d --build

  • docker-compose :调用 docker-compose 工具
  • up :核心动作 → 启动 / 创建 / 更新 所有服务 (容器 + 镜像 + 网络 + 数据卷)
  • -d :核心参数 → 后台运行 (全称 --detach),执行后命令行会释放出来,不会卡住不动,容器在后台默默运行。
  • --build:执行「Dockerfile 构建镜像」

docker-compose up -d

docker-compose up -d --build

docker-compose up -d

的区别

docker-compose up -d启动服务,【复用旧镜像】,不重新构建 (速度快)✅ docker-compose up -d --build启动服务,【强制重新构建镜像】,再启动(速度稍慢,但代码 100% 更新)

两个命令的最终目的一致 :启动 / 重启你的「前端 + 后端 + MySQL+Redis」所有服务,后台运行;唯一的、也是最关键的区别:是否会重新执行「Dockerfile 构建镜像」这个步骤

相关推荐
梦梦代码精13 小时前
2026年PHP开源商城系统实测对比:架构、多商户、商用授权,谁才是真·省心?
vue.js·docker·架构·开源·代码规范
AI智图坊13 小时前
多件装组合SKU图的批量生产效率分析:从PS手工到AI自动化的工作流改造
大数据·运维·人工智能·gpt·ai作画·自动化·aigc
鹤落晴春16 小时前
【K8s】Pod调度、configMaps
云原生·容器·kubernetes
极客先躯17 小时前
高级java每日一道面试题-2026年02月02日-实战篇[Docker]-如何实现容器的持久化存储?
docker·容器·面试宝典·持久化·存储·韵味·java高级面试题
云计算磊哥@17 小时前
运维开发宝典026-MySQL02数据库表操作
运维·数据库·运维开发
天天进步201518 小时前
Tunnelto 源码解析 #9:控制服务器设计:Warp、WebSocket、Ping/Pong 与连接保活
运维·服务器·websocket
My is 李豆18 小时前
CentOS 7 安装 Docker 完整教程(含 docker-compose 插件)
docker·eureka·centos
极客先躯18 小时前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
Java面试题总结19 小时前
Linux-Ubantu-贴士-apt的地盘
linux·运维·服务器
志栋智能19 小时前
超自动化巡检:提升MTTR,缩短业务影响时间
运维·自动化