前言
此次部署我会将
前端: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 构建镜像」这个步骤。