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

相关推荐
qq_312920111 小时前
一款轻量级 Nginx 访问日志分析与可视化面板,支持实时统计、IP 归属地解析与客户端识别
运维·nginx
Chen放放8 小时前
【华三】VXLAN-三层集中式网关配置
运维·网络
碎梦归途8 小时前
思科网络设备配置命令大全,涵盖从交换机到路由器的核心配置命令
linux·运维·服务器·网络·网络协议·路由器·交换机
七维大脑虚拟机8 小时前
飞牛NAS公网IPv6+DDNS远程访问零延迟教程
运维·服务器·网络
AZ996ZA9 小时前
自学linux第十八天:【Linux运维实战】系统性能优化与安全加固精要
linux·运维·安全·性能优化
一体化运维管理平台10 小时前
DevOps落地利器:美信监控易如何打通开发与运维?
运维
宴之敖者、11 小时前
Linux——\r,\n和缓冲区
linux·运维·服务器
LuDvei11 小时前
LINUX错误提示函数
linux·运维·服务器
心理之旅11 小时前
高校文献检索系统
运维·服务器·容器
The Chosen One98511 小时前
【Linux】深入理解Linux进程(一):PCB结构、Fork创建与状态切换详解
linux·运维·服务器