使用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 构建镜像」这个步骤

相关推荐
Dream of maid24 分钟前
Linux(下)
linux·运维·服务器
齐鲁大虾26 分钟前
统信系统UOS常用命令集
linux·运维·服务器
Benszen1 小时前
Docker容器化技术实战指南
运维·docker·容器
ZzzZZzzzZZZzzzz…1 小时前
Nginx 平滑升级:从 1.26.3 到 1.28.0,用户无感知
linux·运维·nginx·平滑升级·nginx1.26.3·nginx1.28.0
Hommy881 小时前
【开源剪映小助手】Docker 部署
docker·容器·开源·github·aigc
一叶知秋yyds2 小时前
Ubuntu 虚拟机安装 OpenClaw 完整流程
linux·运维·ubuntu·openclaw
斯普信云原生组3 小时前
Prometheus 环境监控虚机 Redis 方案(生产实操版)
运维·docker·容器
喵了几个咪3 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
工具罗某人3 小时前
docker compose部署kafka集群搭建
docker·容器·kafka
safestar20124 小时前
ES批量写入性能调优:BulkProcessor 参数详解与实战案例
java·大数据·运维·jenkins