当前位置: 首页 > news >正文

Python 后端基础(十七):Docker 和 Docker Compose 怎么用,把项目一键跑起来

很多项目在自己电脑能跑,换一台电脑就跑不起来。

原因可能是 Python 版本不同、依赖没装、环境变量缺失、MySQL 和 Redis 没启动。Docker 解决的就是“环境一致性”问题。

【一、Docker 是什么】

Docker 可以把应用和运行环境打包成镜像,然后在不同机器上用容器运行。

简单理解:

镜像 image:应用的打包模板

容器 container:镜像运行起来后的实例

Dockerfile:描述怎么构建镜像

它不是虚拟机,但可以提供相对隔离的运行环境。

【二、为什么后端项目要用 Docker】

主要价值:

- 环境一致。

- 部署简单。

- 依赖清晰。

- 方便本地启动 MySQL、Redis。

- 适合 CI/CD。

- 简历项目看起来更工程化。

对秋招项目来说,有 Docker Compose 比只写“运行 python main.py”更有说服力。

【三、Dockerfile 示例】

FastAPI 项目 Dockerfile:

FROM python:3.11-slim

WORKDIR /app

COPY requirements.txt .

RUN pip install --no-cache-dir -r requirements.txt

COPY . .

EXPOSE 8000

CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

含义:

- 基于 Python 3.11 镜像。

- 设置工作目录 `/app`。

- 安装依赖。

- 复制项目代码。

- 暴露 8000 端口。

- 启动 FastAPI 服务。

【四、构建和运行】

构建镜像:

docker build -t my-fastapi-app .

运行容器:

docker run -p 8000:8000 my-fastapi-app

`-p 8000:8000` 表示把宿主机 8000 端口映射到容器 8000 端口。

【五、Docker Compose 是什么】

一个后端项目通常不只有一个服务,还可能有:

- API 服务

- MySQL

- Redis

- Celery Worker

- Nginx

Docker Compose 可以用一个文件把多个服务一起启动。

services:

api:

build: .

ports:

- "8000:8000"

depends_on:

- redis

redis:

image: redis:7

ports:

- "6379:6379"

启动:

docker compose up --build

停止:

docker compose down

【六、环境变量】

Compose 里可以传环境变量:

services:

api:

build: .

env_file:

- .env

`.env` 保存真实配置,不上传 GitHub。

`.env.example` 写示例:

DATABASE_URL=mysql://user:pass@mysql:3306/app

REDIS_URL=redis://redis:6379/0

JWT_SECRET=change_me

【七、数据卷】

数据库容器如果不挂载数据卷,容器删除后数据可能没了。

volumes:

mysql_data:

services:

mysql:

image: mysql:8

volumes:

- mysql_data:/var/lib/mysql

数据卷用于持久化数据。

【八、常见坑】

- 容器内访问 localhost,以为能访问宿主机服务。

- MySQL 容器没完全启动,API 就开始连接。

- 没有 `.dockerignore`,把 `.venv`、日志、输出文件都打进镜像。

- 数据库没挂 volume,重建容器后数据丢失。

- 生产环境把密钥写进 Dockerfile。

【九、面试常问】

1. Docker 镜像和容器有什么区别?

镜像是静态模板,包含应用和依赖;容器是镜像运行起来后的实例。一个镜像可以启动多个容器。

2. Docker Compose 有什么用?

Compose 用来编排多个容器服务,比如 API、MySQL、Redis、Worker,用一个 yaml 文件统一启动和管理。

3. Dockerfile 里为什么先复制 requirements.txt 再复制代码?

这样可以利用 Docker 构建缓存。依赖没变时,不用每次重新安装依赖,构建更快。

http://www.jsqmd.com/news/1132977/

相关文章:

  • B站视频下载终极方案:轻松获取4K高清与充电专属内容
  • 破解创意枷锁:Adobe-GenP如何重塑数字创作的经济学
  • 混合注意力(Channel+Spatial)替代SE模块:mAP涨2.3%但计算量只增5%的魔法
  • XGBoost 2.0.3 实战:Python 调参避坑 5 要点,AUC 提升 0.15
  • 毕业设计实战:基于OpenCV与CNN的人脸识别系统从零搭建【手把手教学】
  • 从零构建 AI 学术论文助手(一):架构设计与技术选型
  • 基于MCP与Playwright的Threads评论数据自动化抓取与分析实战
  • YOLOv10 vs YOLOv11 vs YOLOv12:Nature论文实测三代数模型在零售自助结账场景下的精度-速度权衡
  • 2026最新7款vibe coding编程工具学生党平替深度实测开篇实战:低成本小程序全AI开发真实经历
  • LD2410雷达传感器架构解析:企业级人体检测解决方案的最佳实践
  • LangGraph 工作流:换个角度,从方案设计到上线检查
  • switch语句
  • 富贵杯别只看名字,圆腹收住才耐看
  • AI Agent如何重构数据库运维:从智能诊断到安全自治的实践路径
  • 2026年最热门的8个SERP API(及价格清单)
  • DXVK:打破Windows游戏在Linux上的性能壁垒
  • 9大网盘直链下载神器:告别限速困扰,实现高速文件传输新体验
  • 数据库作业
  • 复杂监控场景多维步态分析平台 目标追踪布控 + 人员隐性心理态势识别白皮书
  • 空间智能重构:FancyZones如何重新定义Windows多任务工作流
  • IPXWrapper技术实现深度解析:Windows平台经典网络协议兼容性解决方案
  • Linux文件权限进阶:基于属性的加密(CP-ABE)实战技巧
  • Bilibili视频下载终极方案:免费解锁大会员4K和充电专属内容
  • 如何轻松下载B站大会员4K视频和充电专属内容?
  • 2026年苍蓝前线礼包码解析与海战资源快速提升战力体验
  • 基于libhv与JWT的HTTP认证中间件实战指南
  • 一篇讲透AI Agent 使用方法
  • YOLO26的DFL移除与NMS-Free双头设计:源码级解读端到端推理的底层实现
  • 微信小程序API安全实战:从鉴权缺失到注入漏洞的防御指南
  • 基于UIAutomation的Windows微信自动化:wxauto技术深度解析与实践指南