目录:
一. 编导出requirements.txt
二. 编写适配 LangChain + Celery 的 Dockerfile和docker-compose.yml
2.1 创建一个 Dockerfile:
2.2 编写 docker-compose.yml
2.3 修改代码连接redis的编码
2.4 关于工作目录
2.5 关于多容器架构
三. 构建与运行(需要先安装好Docker)
四. 运行容器
五. Frist. 安装Docker步骤(Windows 版,需要先装WSL)
5.1 安装WSL和Ubuntu,以及将ubuntu从C盘迁移到D盘。
5.2 安装Docker。
六. 运行容器时遇见的一些问题和解决方法

==========================================

在langchain-conda-env 环境(Conda)编码的项目,以下是具体的操作步骤:
第一步:从 Conda 环境中导出依赖
在你的 Windows 电脑上,激活你的 Conda 环境并生成依赖文件:

一. 导出requirements.txt

(1).激活你的 LangChain 环境
conda activate langchain-conda-env

(2). 将当前环境的所有包及精确版本号导出为 requirements.txt
输入(不推荐):
pip freeze > requirements.txt
或(推荐):
pip install pipreqs
pipreqs ./AI_RAG_Answer --force

注:强烈建议在导出的 requirements.txt 中锁定具体版本(例如 langchain==0.3.0),这能确保 Docker 里的环境与你的本地环境 100% 一致,避免隐式依赖冲突。
生成requeirement文件
然后去C:\Windows\System32 文件夹里面找到requirements文件,将其剪切到项目根目录里面,防止后续找不到。
在这里插入图片描述
在这里插入图片描述

二. 编写适配 LangChain + Celery 的 Dockerfile和docker-compose.yml

由于项目涉及 LangChain 和 Celery 多进程,我们可以直接使用官方的轻量级 Python 镜像作为基础。

2.1. 创建 Dockerfile

# 1. 使用 slim 版本的官方 Python 镜像(体积小且兼容性好,Python 版本保持 3.11)
FROM python:3.11-slim

# 2. 设置工作目录,相当于在容器内执行 `mkdir /app && cd /app`
WORKDIR /app

# 3. 复制依赖文件并安装(利用 Docker 分层缓存加速后续构建)
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# 4. 复制整个项目的代码到容器内
COPY . .

在这里插入图片描述
我的代码依赖 python-magic 这个 Python 库。需要确保在 Dockerfile 中安装了 Linux 系统依赖。 打开 Dockerfile,在 RUN pip install 那一步之前,加上安装系统库的命令:
# 先更新源并安装 libmagic(这是 python-magic 在 Linux 下需要的底层库) RUN apt-get update && apt-get install -y libmagic1 --no-install-recommends

2.2. 编写 docker-compose.yml

在你的项目根目录(和 Dockerfile 同级)新建一个文件叫 docker-compose.yml。这是整个方案的灵魂。

services:
 # --- 服务 1:Redis (作为消息中间件) ,6379是 Redis 的默认标准端口---
  redis:
    image: redis:alpine
    ports:
      - "6379:6379" # 左边是宿主机端口,右边是容器内部端口

  # --- 服务 2:Web 应用 (对外提供服务) ---
  web:
   build: .              # 使用当前目录的 Dockerfile 构建镜像
    command: python main.py --mode web --no-debug  # 【关键点】指定 Web 的启动命令
    ports:
      - "8000:5000"  
      # 容器内部端口(由你的代码决定)
      # Python 代码里写的是 app.run(port=5000) 或者启动命令是 --port 5000。那么,容器内部的端口必须是 5000。
      # 宿主机端口(由你决定,随便定)
      # 这是你浏览器访问时用的端口。你可以把它映射成 8000,也可以映射成 5000,甚至 9999.
      environment:
      # 关键在这里!告诉 Python 代码:Redis 的地址是 redis:6379
      - REDIS_URL=redis://redis:6379/0
    depends_on:
      - redis             # 等 redis 起来了再启动 web
    environment:
      - CELERY_BROKER_URL=redis://redis:6379/0 # 告诉代码去哪里找队列

  # --- 服务 3:Celery Worker (后台干活的) ---
  worker:
    build: .              # 【重点】使用完全相同的 Dockerfile 构建!
    command: celery -A celery_app.celery_app worker --loglevel=info # 【关键点】指定 Worker 的启动命令
    depends_on:
      - redis             # 必须依赖 redis
    environment:
      - CELERY_BROKER_URL=redis://redis:6379/0 # 连接同一个 redis

在这里插入图片描述
我添加了挂载语句方便调试,以及根据项目结构修改了路径,如图上。

version = ‘3.8’ 这一行应该删除,否则有警告。

在这里插入图片描述
version = ‘3.8’ 这一行应该删除,否则有警告。
在这里插入图片描述
在这里插入图片描述

2.3. 修改代码连接redis的编码

第三步,如果你的 Python 代码里硬编码了 host=‘localhost’ 来连 Redis,在 Docker 里会报错!必须改成 host=‘redis’(即服务名),因为容器之间是通过服务名互相访问的,而不是 localhost。
修改celery.py文件如下:
在这里插入图片描述

在这里插入图片描述

==============================
. “工作目录”到底是什么?
在 Docker 的世界里,WORKDIR /app 并不是指电脑上的 E:\FileData\python_project\AI_RAG_Answer。
它指的是 Docker 容器内部(那个即将生成的 Linux 小系统)里的一个文件夹路径。
你的电脑(宿主机):文件在 E:…\AI_RAG_Answer
Docker 容器(目标环境):WORKDIR /app 相当于在容器里执行了 mkdir /app 然后 cd /app
所以,/app 是容器里的绝对路径,和你电脑上的盘符没有任何关系。

关于第二步多容器架构, 是迈向生产级部署的关键一步。这不仅是 Docker 的最佳实践,也是未来你如果想上 Kubernetes (K8s) 或者使用云服务的必经之路。
这种架构的核心思想叫做 “单一职责原则”:
Web 容器:只负责处理用户的 HTTP 请求(API 接口)。
Worker 容器:只负责在后台默默干活(跑异步任务、发邮件、处理数据)。
虽然它们是两个独立的进程,运行在两个独立的容器里,但神奇的是:它们共享同一份代码和同一个 Redis 消息队列。

为什么这样做多容器架构更好? 1. 独立伸缩(省钱/高性能):如果用户访问量很大,你可以启动 5 个 Web 容器;如果后台任务堆积了,你可以启动 10 个 Worker 容器。互不干扰。 2. 故障隔离:如果 Worker 因为处理一个超大数据把内存撑爆了,它只会重启自己,不会导致你的网站挂掉。 3. 日志清晰:看 Web 日志就是纯请求记录,看 Worker 日志就是纯任务执行记录,排查问题极其方便。

======================================

三. 构建与运行(需要先装docker,可查看第5点)

“构建”是指把你的代码打包成镜像,
“运行”是指把这个镜像启动为容器。

(1). WSL终端进入项目文件夹:
d /mnt/e/python_project/AI_RAG_Answer
查看子文件,确保需要的文件(上面创建的三个文件requirements.txt,Dockerfile, docker-compose.yml )都在。
dir
(2). 执行构建与启动命令:
docker compose up --build -d
在这里插入图片描述
报错。

报错原因:
你的 requirements.txt 文件里包含了一个指向你本地 Windows 电脑(C盘)的绝对路径,而 Docker 容器是一个全新的 Linux 环境,它根本找不到你的 C 盘,所以报错了。
解决方案:
vs code 打开requirements.txt文件。
删除或修改报错行 找到包含 file:///C: 或者 @ file:/// 的所有行。
在这里插入图片描述

重新执行构建与启动命令:
docker compose up --build -d

耗时: 几分钟到几十分钟不等(取决于网速和电脑性能)。
原因: 你现在看到的 Building 进度条,实际上是在做一件很重的事情:

  1. 下载基础系统: 比如 Python 的 Linux 镜像(几百 MB)。
  2. 下载所有依赖: 你的 requirements.txt 里如果有几十个包,Docker 需要把它们全部从网上下载下来并安装。
  3. 编译代码: 如果你的项目里有 C++ 扩展库(比如某些 AI 相关的库),还需要在容器里进行编译。

一旦第一次构建成功,Docker 会把结果保存成一个“镜像”。以后你每次运行项目,只需要执行:
docker compose up -d
耗时几秒,很快。
在这里插入图片描述

在这里插入图片描述

四. 运行容器

4.1 启动命令

不修改代码:
docker compose up -d
修改了代码,用上面那句也可以,下面这个更稳妥:
docker compose up -d --build

什么时候才需要彻底重来(重新镜像)?
只有当你动了以下东西时,才需要漫长的等待:
(1)修改了 requirements.txt: 加了新库或改了版本号(Docker 需要重新跑 pip install)。
(2)修改了 Dockerfile 本身: 比如换了基础镜像,或者改了系统配置。
(3)执行了强制清理命令: 比如 docker compose build --no-cache(这会强制丢弃所有缓存,从头开始)。

注意:修改docker-compose.yml文件,不需要重新构建镜像(Build),但必须重启容器

4.2 如何重新镜像?

**(1)先清理旧环境:**

只想重建环境?
→ 用 docker compose down --rmi all(安全)。
想连数据一起销毁?
→ 用docker compose down --rmi all -v(危险!!,慎用)。

down:停止并删除所有正在运行的容器。
--rmi all:关键点! 删除该项目相关的所有镜像。这会让 Docker 忘掉之前的构建结果。“镜像层”.
-v:删除关联的数据卷(数据库数据等)。注意:这会清空你的数据库数据,请确保你不需要保留旧数据,或者已经备份。“数据卷”

安全做法:只删镜像,保留数据
除非你的数据脏了,或者你不想要数据了。

(2)然后再从零开始构建
docker compose up -d

docker compose up --build -d

在这里插入图片描述
🎉 恭喜!成功了!!!!
(1) 构建耗时: 整个过程花了约 3244秒(约54分钟)。这主要是在下载和安装 PyTorch 及其依赖库。虽然时间长,但这是一次性的投入,以后每次启动都只需要几秒钟。
(2) 网络策略生效: 注意看第8行日志:
RUN pip install … -i https://mirrors.aliyun.com/pypi/simple/ --extra-index-url https://download.pytorch.org/whl/cu128
这说明我们配置的“阿里云主源 + PyTorch官方副源”策略完全生效了,没有报错超时。
(3) 多服务启动:
Container ai_rag_answer-redis-1 Started:Redis 数据库启动了。
Container ai_rag_answer-worker-1 Started:后台任务处理者启动了。
Container ai_rag_answer-web-1 Started:Web 服务器启动了。

4.3 部署成功后必须掌握的“监控神器

(1)看状态(有没有活), 确认启动成功:
docker compose ps
只显示当前目录下正在运行的容器。
或:
docker compose ps -a
-a (all): 这个参数的意思是“显示所有容器”,包括那些已经挂掉(Exited)的。

(2)看内容(在干什么),观察运行细节:
docker compose logs -f

查看它们为什么“罢工:
docker compose logs web worker
或者实时的报错流:
docker compose logs -f web worker

重点关注日志里的最后几行,比如:
ModuleNotFoundError(缺包)
Connection refused(连不上 Redis,可能是 Redis 还没完全准备好 Web 就启动了)
Address already in use(端口被占用了)
[Errno 2] No such file or directory (在这个目录下找不到这个文件)
No module named ‘celery_app’ (找不到模块)

💡 进阶技巧(开发模式)
如果你正在频繁调试代码,甚至不想每次改完都运行 up -d,
你可以在 docker-compose.yml 里使用 挂载(Volumes)。
通过挂载,你本地电脑的文件和容器里的文件是实时同步的。你改完代码保存,容器里立马生效,连重启都不需要(取决于你的框架是否支持热重载,如 Flask/FastAPI/Uvicorn 的 debug 模式)。

五. 安装Docker步骤(Windows 版)

Docker 引擎和 Docker Compose 必须安装在 Windows 操作系统上,绝对不能安装在 Conda 环境里。
既然你用的是 Windows,最推荐的方式是直接安装 Docker Desktop。它是一个图形化软件,安装好后会自动帮你配置好 Docker Engine 和 Docker Compose。

***安装Docker前,需要先

5.1 安装WSL

,可参考以下两个链接:***

  1. WSL2 Windows分版本安装保姆级教程:别再瞎装msi内核包了!按系统对号入座100%成功
    https://blog.csdn.net/2602_94958286/article/details/159435017

  2. 保姆级 WSL 安装 + 排错手册!Windows 装 Linux 从此不踩坑
    https://zhuanlan.zhihu.com/p/81566812063

我的操作截图如下,我的windows 很新 不需要msi:
在这里插入图片描述
下载wsl特别久!!!很慢,要一两个小时。
下载wsl特别久!!!很慢,要一两个小时。。。可以先下载,再干别的
在这里插入图片描述
在这里插入图片描述

下载Ubuntu

很快,2分钟左右。然后输入·用户名和密码就好了。

在这里插入图片描述
新打开窗口,执行wsl --list – verbose ,查看版本即可。

随后在安装wsl系统的窗口执行:在这里插入图片描述
在这里插入图片描述
我计划

将ubuntu从C盘迁移到D盘

,如果没有此计划的,可忽略以下步骤不看:

  1. 在D盘新建文件夹,WSL及其两个子文件:
    在这里插入图片描述

  2. 关闭小蓝企鹅和下载wsl的窗口,新开一个powershell(管理员方式):
    (1). 关闭所有 WSL 实例
    wsl --shutdown
    在这里插入图片描述

    (2). 导出当前系统到 D 盘
    wsl --export Ubuntu-24.04 D:\WSL\Backup\ubuntu-24.04.tar
    在这里插入图片描述
    (3). 注销原系统(删除 C 盘数据)
    wsl --unregister Ubuntu-24.04
    (4). 把备份文件恢复到 D 盘,并指定为 WSL2 版本
    wsl --import Ubuntu-24.04 D:\WSL\Ubuntu D:\WSL\Backup\ubuntu-24.04.tar --version 2
    在这里插入图片描述
    (5).重新设置以下用户密码
    wsl -d Ubuntu-24.04 -u root
    passwd ruofu
    进入WSL终端:
    wsl -d Ubuntu-24.04 -u ruofu
    在这里插入图片描述
    (6).验证是否成功将ubuntu迁移到D盘,打开文件夹:
    在这里插入图片描述
    存在上面这两个即可。

5.2 安装docker步骤如下:

(1) 更新系统并安装依赖,(迁移前更新过了 可敲可不敲 很快)
sudo apt update && sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg lsb-release
在这里插入图片描述
(2) 添加 Docker 官方 GPG 密钥和仓库:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

不稳定则换成国内的阿里云镜像源来安装:
阿里云的 GPG 密钥:
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

阿里云的软件仓库地址:
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
在这里插入图片描述
sudo apt update

(3) 安装 Docker Engine
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
在这里插入图片描述
在这里插入图片描述

(4). 配置免 sudo 使用 Docker
sudo usermod -aG docker $USER
newgrp docker
在这里插入图片描述
可以直接用 docker 命令,无需加 sudo。

(5) 验证是否安装成功:
创建或编辑 Docker 配置文件:
sudo mkdir -p /etc/docker
采用稳定可用的公共镜像源:

sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.nju.edu.cn",
    "https://docker.mirrors.sjtug.sjtu.edu.cn",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}
EOF

重启 Docker 使配置生效:
sudo systemctl daemon-reload
sudo systemctl restart docker
验证配置是否成功
docker run hello-world
在这里插入图片描述在这里插入图片描述
Docker 引擎(Engine)和客户端(Client)都能正常工作。

⚠️ 为什么阿里云地址失效了?
政策调整:阿里云自 2025 年起逐步关闭个人版镜像加速器对 docker.io 公共仓库的代理服务,仅保留对自身 ACR 仓库的加速。
技术限制:个人版实例不支持 OpenAPI 和跨地域同步,无法承担大规模公共镜像缓存压力。 商业导向:引导用户迁移至企业版 ACR 或使用其他公有云/自建方案。

💡 长期建议 个人学习/开发:使用上述公共加速源即可满足需求。 团队协作/生产环境:建议搭建私有 Harbor 仓库,或直接购买阿里云企业版 ACR。 监控可用性:公共镜像源可能因流量过大临时不可用,可定期测试并轮换使用。

(6). 开启 Systemd 支持(让 Docker 自动启动)
依旧是WSL终端:
sudo nano /etc/wsl.conf

[boot]
systemd=true

如果本来就有上面那段话,就无需操作,如果没有需要手动添加,然后在 新开的PowerShell 中执行:
wsl --shutdown
下次启动 WSL 时,Docker 服务会自动运行。

WSL终端输入:
systemctl status docker
看到绿色的 active (running),那就彻底大功告成了!
在这里插入图片描述


六. 运行容器时遇见的一些问题和解决方法

6.1 OSError: [Errno 2] No such file or directory:

**现象:**报错 OSError: [Errno 2] No such file or directory: ‘/C:/miniconda3/conda-bld/annotated-doc_…’ 是一个非常典型的环境迁移“后遗症”在这里插入图片描述

报错原因:
你的 requirements.txt 文件里包含了一个指向你本地 Windows 电脑(C盘)的绝对路径,而 Docker 容器是一个全新的 Linux 环境,它根本找不到你的 C 盘,所以报错了。
在生成 requirements.txt 时,使用了类似 pip install -e .(本地开发模式)或者安装过本地的某个包。导致生成的文件中出现了一行类似这样的内容:
annotated-doc @ file:///C:/miniconda3/conda-bld/annotated-doc_1763372674942/work
Docker 在构建镜像时,会忠实地执行这行命令,试图去读取那个不存在的 Windows 路径,从而失败。
解决方案:
vs code 打开requirements.txt文件。
删除或修改报错行 找到包含 file:///C: 或者 @ file:/// 的所有行。
在这里插入图片描述

6.2. could not find a version that 。。。

现象: could not find a version that satisfies the requirement en_core_web_sm == 3.8.0 (from version:none)

在这里插入图片描述
原因: 因为 en_core_web_sm 并不是一个标准的 Python 包,而是 spaCy 的语言模型数据。它通常不托管在 PyPI 上,所以直接用 pip install en_core_web_sm==3.8.0 是找不到的。
解决方案
打开AI_RAG_Answer/requirements.txt 文件,找到 en_core_web_sm==3.8.0 这一行(或者类似的写法),将其替换为以下这行代码:
https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-3.8.0/en_core_web_sm-3.8.0-py3-none-any.whl

6.3. Python 依赖与系统环境的冲突

现象: 安装 python-magic 报错,或者代码运行时报错提示找不到库文件。
原因: Windows 下常用的 python-magic-bin 是专门为 Windows 打包的二进制包,Linux(Docker)里不兼容。Linux 下的 Python 库往往依赖底层的 C/C++ 系统库。
解决方案:
清理依赖: 在 requirements.txt 中删除/注释掉 python-magic-bin,只保留通用的 python-magic。
补充系统库: 在 Dockerfile 中使用 apt-get install -y libmagic1 安装 Linux 底层的支持库。
在这里插入图片描述
在这里插入图片描述

6.4. PyTorch 版本号的“后缀陷阱”

现象: 报错 No matching distribution found for torch2.11.0+cu128。
原因: 带有 +cu128 这种后缀的版本号,通常是 PyTorch 官方为特定平台编译的,不存在于标准的 PyPI 仓库中。Docker 默认去标准仓库找,自然找不到。
解决方案
修改版本号: 将 requirements.txt 中的版本号改为纯净版(如 torch
2.11.0),去掉 +cu128 后缀。
指定下载源: 告诉 pip 去哪里找这些特殊包。
改成下图所示:
在这里插入图片描述

原因: 国内镜像站对 PyTorch 的特殊版本(CUDA 版)同步不及时或不全。
解决方案
组合拳策略: 采用 “主源 + 副源” 模式。
主源 (-i):用阿里云加速普通包下载。
副源 (–extra-index-url):加上 https://download.pytorch.org/whl/cu128,确保 pip 在需要时能去 PyTorch 官网拉取带 GPU 支持的专用包。


在 Dockerfile 中安装时,通过指定 PyTorch 官方源来确保安装的是 GPU 版本:
在这里插入图片描述

6.5 ubuntu所在盘爆盘

(1)现象: D盘爆满,空间都被Ubuntu吃掉了。
(2)预防方案:
你之前遇到的 111GB 膨胀问题,根源在于 Docker 构建时产生的大量中间层和缓存。为了避免重蹈覆辙,建议:
定期清理构建缓存:在每次大型构建后,运行
docker builder prune -f
docker system prune -a -f
(注意:后者会删除所有未使用的镜像和容器)。
使用 .dockerignore 文件:在你的项目根目录创建此文件,排除不必要的文件(如 node_modules, .git, *.log),可以大幅减少构建上下文大小。 考虑限制 WSL2 内存和磁盘:在 Windows 用户目录下创建或编辑 %UserProfile%.wslconfig 文件,添加: ini 编辑

[wsl2]
memory=8GB
swap=0
localhostForwarding=true 

这可以防止 WSL2 无限制地占用资源。
(3)解决方案:
先注销旧的 Ubuntu 实例,从备份包导入新系统(重装Ubuntu)
在这里插入图片描述
然后再重装docker。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐