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

相关推荐
济6172 小时前
linux(第十六期)--按键输入实验-- Ubuntu20.04
linux·运维·服务器
nbsaas-boot2 小时前
Linux 服务(systemd)最完整使用文档
linux·运维·服务器
宇钶宇夕2 小时前
CoDeSys入门实战一起学习(五):CoDeSys V3 车库门控制编程全解析系列(手册基础第五篇)
运维·自动化
C_心欲无痕2 小时前
Docker 本地部署 SSR 前端项目实战指南
前端·docker·容器
robch2 小时前
k8s service deployment pod 的 label
云原生·容器·kubernetes
海鸥812 小时前
k8s中items.key的解析和实例
java·docker·kubernetes
三花猫咪2 小时前
UBUNTU串口打印终端,X86主机变开发板
linux·运维·嵌入式硬件·ubuntu
HalvmånEver2 小时前
Linux:深入剖析 System V IPC上(进程间通信八)
linux·运维·数据库·c++·system v·管道pipe
EndingCoder2 小时前
泛型类和高级用法
linux·运维·前端·ubuntu·typescript