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

相关推荐
江畔何人初9 分钟前
Docker、containerd、CRI、shim 之间的关系
运维·docker·云原生·容器·kubernetes
杨浦老苏43 分钟前
在线视频播放器YT-DLP Web Player
docker·工具·群晖·下载·多媒体
ALex_zry1 小时前
Docker Compose 配置文件完全指南:从基础到生产级安全实践
服务器·安全·docker
idolao2 小时前
CentOS 7 安装 nginx-1.3.15.tar.gz 详细步骤(从源码编译到启动配置)
linux·运维·数据库
CDN3602 小时前
低成本游戏防护:360 SDK 游戏盾使用总结
运维·游戏·网络安全
万象.2 小时前
docker镜像仓库
运维·docker·容器
rosmis2 小时前
自动化文献检索与下载工作流:基于 Playwright 的 RPA 实践方案
运维·自动化·rpa
亚林瓜子2 小时前
linux账号强制密码过期导致私钥文件登录异常问题——(current) UNIX password:
linux·运维·服务器·ssh·aws·ec2·chage
姚不倒2 小时前
Docker 核心原理与运维实战:从入门到生产级理解
运维·docker·架构
LXY_BUAA2 小时前
《嵌入式操作系统》_驱动框架_20260318
linux·运维·服务器