通过Docker部署FastAPI应用程序 欢迎来到PyTorch深度学习实战的世界博客主页卿云阁欢迎关注点赞收藏⭐️留言首发时间2026年5月24日✉️希望可以和大家一起完成进阶之路作者水平很有限如果发现错误请留言轰炸哦万分感谢目录Docker 是什么安装 Docker Desktop准备文件​用 Xftp 连接服务器Step 1先确认你本地的项目文件Step 2在项目目录新增 3 个文件Step 3检查项目最终结构Step 4把文件传到服务器Step 5在服务器上验证文件Step 6在服务器上安装 DockerStep 7构建 Docker 镜像Step 8启动容器Step 9在服务器内部测试Step 10配置阿里云防火墙让外部能访问Step 11从本地电脑测试外部访问常用 Docker 命令清单组 1容器生命周期组 2查看状态组 3调试和诊断组 4清理资源模型/代码更新流程Docker 是什么一个真实场景假设你这个曝气预测 API 训练好了要部署到污水厂的服务器上。没有 Docker 时你会面临什么你电脑上 厂里服务器上 ───────── ───────────── Windows 11 CentOS 7 Python 3.10 Python 3.6 PyTorch 2.1 未安装 你的代码 什么都没有 模型文件 什么都没有你需要做的事远程连服务器装 Python 3.10系统自带 3.6 不能用但又不能卸载可能依赖系统装 pip装 PyTorch可能因为网络问题失败下载 800MB装其他依赖上传你的代码上传模型文件试着跑 → 各种找不到 xxx的报错修 bug调环境终于跑起来了 → 重启服务器后又挂了因为没配开机自启...一个流程下来 2~3 天而且换一台服务器还得重来一遍。Docker 怎么解决这个问题Docker 的核心思想把代码 运行环境 依赖打包成一个完整的盒子搬到任何机器上都能直接跑。你电脑上 厂里服务器上 ───────── ───────────── [Docker 镜像] ───复制/推送── [Docker 镜像] ├─ Python 3.10 ↓ ├─ PyTorch 2.1 docker run ├─ 你的代码 ↓ ├─ 模型文件 [运行中的容器] └─ 所有配置 服务正常运行 ✅整个部署过程从2~3 天变成5 分钟。没 Docker 时: 你做了顿菜想给朋友吃 → 跑到朋友家 → 借他的厨具 → 用他的食材 → 现场做菜 → 朋友家没烤箱 → 凉了 有 Docker 时: 你做好菜装进保温饭盒 → 拎到朋友家 → 朋友直接吃 → 不管朋友家有没有厨房, 菜的味道都一样Docker 镜像 保温饭盒里面装好了菜代码 餐具运行环境 调料依赖 Docker 容器 端上桌的那份饭从饭盒拿出来的可吃的状态三个必须懂的核心概念┌─────────────────────────────────────────────────────┐ │ │ │ Dockerfile ──build── Image ──run── Container│ │ (菜谱) (饭盒) (上桌的饭)│ │ │ └─────────────────────────────────────────────────────┘概念通俗解释例子Dockerfile写明怎么打包的菜谱文件先装 Python再装 PyTorch再放代码Image (镜像)打包好的文件包不可变aeration-api:v1Container (容器)镜像运行起来的活跃实例一个正在跑的 API 服务比喻Dockerfile 是类的定义Image 是类的代码编译后的Container 是类的实例new 出来的对象重要关系一个 Dockerfile 可以构建出一个镜像一个镜像可以启动出多个容器就像一个类可以实例化多个对象安装 Docker DesktopDocker Desktop是什么Docker Desktop 是给个人电脑Mac/Windows用的 Docker 图形化软件它把Docker 引擎 命令行工具 图形界面 一些常用功能打包成了一个安装包。系统下载链接注意事项Mac (Intel)https://www.docker.com/products/docker-desktop/选 Mac with Intel chipMac (M1/M2/M3)同上选 Mac with Apple chipWindows 10/11同上需要先启用 WSL 2 (下面讲)Linuxhttps://docs.docker.com/engine/install/装 Docker Engine 即可Windows 用户特别注意Windows 装 Docker 要先启用WSL 2Windows Subsystem for Linux# 用管理员权限打开 PowerShell wsl --install # 重启电脑装完后验证打开终端Mac/Linux或 PowerShellWindows运行docker run hello-world这会下载一个超小的测试镜像并运行预期输出Hello from Docker! This message shows that your installation appears to be working correctly. ...但是它的内存占用还是很大的为了方便我们从阿里租一台服务器项目大小Docker Desktop 软件本身约1.5~2 GB自带的 Linux 虚拟机约2~4 GB拉一个 Python 基础镜像约150 MB拉一个 PyTorch 镜像约2~6 GB这是大头构建你的镜像含 PyTorch约1~3 GB会复用基础镜像层准备文件本地操作: 1. 准备文件 (Dockerfile, requirements.txt, .dockerignore) 2. 把所有文件上传到服务器 ↓ 服务器操作: 3. 安装 Docker (如果还没装) 4. 构建镜像 5. 启动容器 6. 测试 API ↓ 对外开放: 7. 配置阿里云防火墙 (放行 8000 端口) 8. 外部测试​用 Xftp 连接服务器第一次连接打开 Xftp文件菜单 → 新建会话或按 Ctrl N填写连接信息 名称: Aeration Server (随便起) 协议: SFTP 主机: 你的服务器公网 IP (比如 47.123.45.67) 端口号: 22 用户名: root 密码: 你设置的服务器密码点 连接第一次会弹SSH 主机密钥提示点 接受并保存Step 1先确认你本地的项目文件你本地应该有这些文件全部需要上传到服务器你的项目目录/ ├── app.py ✅ FastAPI 服务 (你已经有) ├── predictor.py ✅ 预测器 (你已经有) └── deploy_t1h/ ✅ 模型文件夹 ├── model.pt └── scaler.pklStep 2在项目目录新增 3 个文件2.1 创建requirements.txt新建文件requirements.txt--extra-index-url https://download.pytorch.org/whl/cpu torch2.1.0cpu numpy1.26.4 scikit-learn1.4.2 joblib1.3.2 fastapi0.110.0 uvicorn[standard]0.29.0 pydantic2.6.4 EOF可以使用下面这个命令只会安装本项目需要的包# 1. 在你本地电脑的项目目录 cd D:\vscode-water\D_LSTM\aeration # 2. 装 pipreqs pip install pipreqs # 3. 生成 requirements.txt pipreqs . --force # 4. 看一下 cat requirements.txt # 或在 Windows: type requirements.txt2.2 创建Dockerfile新建文件Dockerfile没有后缀# 基础镜像: Python 3.10 精简版 (比完整版小 600MB) FROM python:3.10-slim # 设置工作目录 (容器内的路径) WORKDIR /app # 先复制依赖文件 (利用 Docker 缓存层, 后续改代码不用重装依赖) COPY requirements.txt . # 安装依赖 # -i 用清华镜像源 (国内构建快 10 倍) RUN pip install --no-cache-dir -r requirements.txt \ -i https://pypi.tuna.tsinghua.edu.cn/simple # 复制代码和模型文件 COPY app.py predictor.py ./ COPY deploy_t1h ./deploy_t1h # 声明端口 (仅做说明, 实际靠 docker run 的 -p 参数映射) EXPOSE 8000 # 启动命令 CMD [uvicorn, app:app, --host, 0.0.0.0, --port, 8000]逐行解释行作用FROM python:3.10-slim用官方精简 Python 镜像作为起点WORKDIR /app容器内进入/app目录工作COPY requirements.txt .先单独复制依赖文件RUN pip install ...装依赖这一步会被缓存下次改代码很快COPY app.py predictor.py ./复制 Python 代码COPY deploy_t1h ./deploy_t1h复制模型文件夹EXPOSE 8000文档性质说明容器用 8000 端口CMD [...]容器启动时执行的命令重要点--host 0.0.0.0不能省容器内默认监听127.0.0.1是只能内部访问必须用0.0.0.0才能从外部访问。2.3 创建.dockerignore新建文件.dockerignore__pycache__ *.pyc *.pyo .git .gitignore .vscode .idea *.ipynb *.csv data/ notebooks/ features/ *.png *.pdf README.md .DS_Store .env venv/ .pytest_cache作用构建镜像时跳过这些不必要的文件让镜像更小、构建更快。Step 3检查项目最终结构应该是这样的你的项目目录/ ├── app.py ├── predictor.py ├── deploy_t1h/ │ ├── model.pt │ └── scaler.pkl ├── requirements.txt ⭐ 新增 ├── Dockerfile ⭐ 新增 (注意: 没有后缀名!) └── .dockerignore ⭐ 新增Step 4把文件传到服务器​Step 5在服务器上验证文件通过 SSH 连接到服务器后cd /root/aeration ls -la应该看到-rw-r--r-- app.py -rw-r--r-- predictor.py -rw-r--r-- Dockerfile -rw-r--r-- requirements.txt -rw-r--r-- .dockerignore drwxr-xr-x deploy_t1h/Step 6在服务器上安装 Docker如果还没装 Docker# 一键安装 (用阿里云镜像源, 国内快) curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun # 启动 systemctl start docker systemctl enable docker # 验证 docker --version docker run hello-world如果报这个错误网络连不上 Docker 官网被防火墙挡住了所以安装失败。进行下面的操作解决方案用 apt 直接装最稳按下面顺序执行一行一行来每行执行完看看有没有报错Step 1更新包索引apt updateStep 2装必要的工具apt install -y ca-certificates curl gnupg lsb-releaseStep 3用阿里云的 Docker 源关键# 创建 keyring 目录 install -m 0755 -d /etc/apt/keyrings # 下载阿里云的 Docker GPG key curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg # 设置权限 chmod ar /etc/apt/keyrings/docker.gpg # 添加阿里云的 Docker 软件源 echo deb [arch$(dpkg --print-architecture) signed-by/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(. /etc/os-release echo $VERSION_CODENAME) stable | tee /etc/apt/sources.list.d/docker.list /dev/nullStep 4再更新一次加载新源apt updateStep 5装 Dockerapt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin这一步会下载几百 MB等几分钟。出现这个页面之后直接选 OK 就行操作方式不需要勾选任何一项不影响你装 Docker按 Tab 键 或 方向键 移动到 Ok按 回车 确认弹窗会消失继续之前的命令。这个提示是什么意思选项是什么要不要重启dbus.service系统消息总线不用会影响登录gettytty1.service终端登录服务不用可能踢掉你networkd-dispatcher网络配置不能选可能让你 SSH 断开systemd-logind登录管理不用unattended-upgrades自动更新不用全部不勾选最安全避免远程连接断掉。这些服务等服务器下次重启时自然就用新库了。安装成功了这是 Docker 安装完成后的正常输出。输出解释✅Running kernel seems to be up-to-date— 内核是最新的✅Service restarts being deferred— 服务重启被推迟这正是你选Ok不勾选服务的结果正确操作✅No containers need to be restarted— 没有正在运行的容器需要重启✅No user sessions are running outdated binaries— 没有用户会话用着旧的二进制✅No VM guests are running outdated hypervisor binaries— 没有虚拟机受影响Step 6启动并验证systemctl start docker systemctl enable docker docker --version应该看到Docker version 24.x.x, build xxxxxStep 7验证能运行容器docker run hello-world第一次会下载 hello-world 镜像看到Hello from Docker! This message shows that your installation appears to be working correctly.就说明 Docker 装好了 ✅如果出现这个问题进行下面的操作Step 1获取你的专属加速地址浏览器打开https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors如果是第一次访问会让你**开通服务**——免费点开通进去后左侧菜单点 镜像加速器你会看到属于你的专属加速地址格式类似https://xxxxxxxx.mirror.aliyuncs.com复制这个地址每个账号不一样。Step 2在服务器上配置重要把下面命令中的你的专属地址替换成 Step 1 复制的地址。mkdir -p /etc/docker cat /etc/docker/daemon.json EOF { registry-mirrors: [ https://你的专属地址.mirror.aliyuncs.com, https://docker.m.daocloud.io, https://hub-mirror.c.163.com, https://mirror.baidubce.com ] } EOF注意我多加了几个备用镜像源DaoCloud、网易、百度万一阿里云的加速器某天慢了会自动尝试其他源。Step 3让配置生效systemctl daemon-reload systemctl restart dockerStep 4验证配置已加载docker info | grep -A 5 Registry Mirrors应该看到Registry Mirrors: https://xxxxxxxx.mirror.aliyuncs.com/ https://docker.m.daocloud.io/ https://hub-mirror.c.163.com/ https://mirror.baidubce.com/Step 5再试 hello-worldbashdocker run hello-world这次应该秒级下载并运行Unable to find image hello-world:latest locally latest: Pulling from library/hello-world e6590344b1a5: Pull complete Digest: sha256:xxxx Status: Downloaded newer image for hello-world:latest Hello from Docker! This message shows that your installation appears to be working correctly. ...成功Step 7构建 Docker 镜像确认你在~/aeration目录下cd ~/aeration pwd # 应该显示 /root/aeration ls # 应该看到 Dockerfile 等文件构建镜像docker build -t aeration-api:v1 .注意最后那个.—— 它表示用当前目录作为构建上下文。不要漏掉。你会看到这样的输出[] Building 0.2s (2/2) FINISHED [internal] load build definition from Dockerfile transferring dockerfile: 533B [internal] load .dockerignore Step 1/7 : FROM python:3.10-slim 3.10-slim: Pulling from library/python ... Step 2/7 : WORKDIR /app ... Step 3/7 : COPY requirements.txt . ... Step 4/7 : RUN pip install --no-cache-dir -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple Collecting torch2.1.0 Downloading https://pypi.tuna.tsinghua.edu.cn/.../torch-2.1.0-cp310-cp310-...whl (200 MB) ...这一步会比较慢5~10 分钟因为要下载 PyTorch。耐心等看到Successfully taggedaeration-api:v1就成功了。构建成功后验证docker images应该看到REPOSITORY TAG IMAGE ID CREATED SIZE aeration-api v1 abc123def456 2 minutes ago 1.2GB python 3.10-slim ... ... 125MBStep 8启动容器docker run -d \ --name aeration \ -p 8000:8000 \ --restartalways \ aeration-api:v1参数含义-d后台运行detach--name aeration给容器起个名字方便后续操作-p 8000:8000把容器内的 8000 端口映射到服务器的 8000 端口--restartalways重要服务器重启或容器崩溃后自动重启aeration-api:v1用哪个镜像启动验证容器在跑docker psCONTAINER ID IMAGE COMMAND ... PORTS NAMES abc123... aeration-api:v1 uvicorn... ... 0.0.0.0:8000-8000/tcp aerationSTATUS显示Up xxx seconds就说明在跑。查看日志确认服务正常启动docker logs aeration应该看到INFO: Started server process [1] INFO: Waiting for application startup. INFO: Application startup complete. INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRLC to quit)Step 9在服务器内部测试# 测试根路径 curl http://localhost:8000/ # 测试预测接口 curl -X POST http://localhost:8000/predict \ -H Content-Type: application/json \ -d {history: [520.1, 525.3, 530.0, 528.4, 535.2, 540.1, 545.6, 550.0, 548.3, 552.1, 555.7, 560.0]}应该看到{message:Aeration API is running. Visit /docs for documentation.} {prediction:554.88}如果走到这里都成功了你的 API 已经在云服务器上跑起来了 Step 10配置阿里云防火墙让外部能访问服务器内部能访问不够外部要能访问还需要开放端口。登录阿里云控制台进入轻量应用服务器点你的实例左侧菜单 → 防火墙点 添加规则应用类型: 自定义 协议: TCP 端口: 8000 备注: Aeration API6.保存Step 11从本地电脑测试外部访问在本地电脑不是服务器打开浏览器http://你的服务器公网IP:8000/docs应该看到 FastAPI 自动生成的文档页面和你本地跑的时候一样。或者用 Python 测试import requests response requests.post( http://你的服务器公网IP:8000/predict, json{history: [520.1, 525.3, 530.0, 528.4, 535.2, 540.1, 545.6, 550.0, 548.3, 552.1, 555.7, 560.0]} ) print(response.json()) # {prediction: 554.88}java测试import java.io.OutputStream; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class Main { public static void main(String[] args) throws Exception { String json {\history\:[520.1,525.3,530.0,528.4,535.2,540.1, 545.6,550.0,548.3,552.1,555.7,560.0]}; // 建立连接 URL url new URL(http://139.224.165.33:8000/predict); HttpURLConnection conn (HttpURLConnection) url.openConnection(); conn.setRequestMethod(POST); conn.setRequestProperty(Content-Type, application/json); conn.setDoOutput(true); // 发送请求体 try (OutputStream os conn.getOutputStream()) { os.write(json.getBytes(UTF-8)); } // 读响应 try (BufferedReader br new BufferedReader( new InputStreamReader(conn.getInputStream(), UTF-8))) { StringBuilder sb new StringBuilder(); String line; while ((line br.readLine()) ! null) sb.append(line); System.out.println(sb.toString()); // 输出: {prediction:554.88} } } }常用 Docker 命令清单# 查看运行中的容器 docker ps # 查看所有容器(含已停止) docker ps -a # 查看日志 docker logs aeration # 实时查看日志(像 tail -f) docker logs -f aeration # 进入容器内部(调试用) docker exec -it aeration bash # 停止容器 docker stop aeration # 启动已停止的容器 docker start aeration # 重启容器 docker restart aeration # 删除容器(必须先停止) docker stop aeration docker rm aeration # 查看镜像 docker images # 删除镜像 docker rmi aeration-api:v1 # 查看资源占用 docker stats aeration┌─────────────────────────────────────────────────┐ │ 组 1: 容器生命周期 (最常用) │ │ - 启动 / 停止 / 重启 / 删除 │ ├─────────────────────────────────────────────────┤ │ 组 2: 查看状态 │ │ - ps / images / stats │ ├─────────────────────────────────────────────────┤ │ 组 3: 调试和诊断 │ │ - logs / exec │ ├─────────────────────────────────────────────────┤ │ 组 4: 清理资源 │ │ - rm / rmi │ └─────────────────────────────────────────────────┘组 1容器生命周期容器有 4 个状态命令负责状态切换┌──── docker stop ────┐ ▼ │ [运行中] [已停止] ▲ │ │ ▼ docker start docker rm │ ▼ [删除]命令 作用 通俗类比 重要说明 docker stop aeration 停止容器优雅退出 正常点 “关机” 给程序 10 秒保存数据安全推荐 docker stop -t 30 aeration 延长优雅退出时间 给程序多留点时间保存 自定义等待 30 秒再强制关闭 docker kill aeration 强制立即杀死容器 直接拔电源 不推荐可能造成数据丢失 docker start aeration 启动已停止的容器 开机 只重启旧容器不创建新容器 docker restart aeration 重启容器 重启电脑 stop start快速重启 docker rm aeration 删除容器 彻底删掉这台电脑 只能删已停止的容器 docker stop aeration docker rm aeration 停止并删除容器 关机后彻底删除 最标准、最安全的删除方式 docker rm -f aeration 强制删除运行中容器 强行粉碎电脑 不推荐风险高组 2查看状态看运行中的容器docker psrootiZuf65n4utc5xziyru8dowZ:~/aeration# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7280984d5a9 aeration-api:v2 uvicorn app:app --h… 2 hours ago Up 2 hours 0.0.0.0:8000-8000/tcp, [::]:8000-8000/tcp aeration列名你看到的内容中文含义CONTAINER IDc7280984d5a9容器唯一 ID相当于身份证号IMAGEaeration-api:v2容器用的镜像软件包COMMANDuvicorn app:app --h…容器启动时运行的命令CREATED2 hours ago容器创建时间2 小时前STATUSUp 2 hours运行状态已运行 2 小时PORTS0.0.0.0:8000-8000/tcp端口映射服务器 8000 端口 → 容器 8000 端口NAMESaeration容器名字你自己起的查看所有容器docker ps -arootiZuf65n4utc5xziyru8dowZ:~/aeration# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c7280984d5a9 aeration-api:v2 uvicorn app:app --h… 2 hours ago Up 2 hours 0.0.0.0:8000-8000/tcp, [::]:8000-8000/tcp aeration ef3e71dc643f hello-world /hello 12 hours ago Exited (0) 12 hours ago列名含义第一行你的项目第二行测试容器CONTAINER ID容器唯一 ID身份证c7280984d5a9ef3e71dc643fIMAGE镜像软件包aeration-api:v2你的项目hello-world测试用COMMAND启动命令后台 API 服务测试运行命令CREATED创建时间2 小时前12 小时前STATUS运行状态Up 2 hours正在运行Exited (0) 12 小时前已退出 / 停止PORTS端口映射8000 端口开放可访问无端口NAMES容器名字aeration你命名的brave_booth系统随机命名看所有镜像字段名含义你的项目镜像测试镜像IMAGE镜像名称软件包名aeration-api:v2你的项目hello-world:latest测试用ID镜像唯一 IDb5e484b9505e2498fce14358DISK USAGE磁盘占用大小8.21GB25kBCONTENT SIZE镜像实际内容大小2.87GB4.47kBEXTRA状态U 正在使用U正在用U用过实时资源占用docker stats aeration列名你的容器数据中文含义说明CONTAINER IDc7280984d5a9容器唯一 ID容器的 “身份证号”全局唯一NAMEaeration容器名称你给容器起的名字更易识别CPU %0.11%CPU 使用率容器占用宿主机 CPU 的比例。0.11% 表示负载极低完全不卡MEM USAGE / LIMIT318.4MiB / 1.571GiB内存使用 / 限制当前用了 318.4MB最大可用 1.571GBMEM %19.79%内存使用率占用了可用内存的 19.79%还有大量富余NET I/O10.4kB / 8.44kB网络入 / 出流量容器接收了 10.4kB发送了 8.44kB 数据说明网络通信正常BLOCK I/O1.12GB / 8.09MB磁盘读写流量容器从磁盘读了 1.12GB写了 8.09MB 数据PIDS9进程数容器内当前运行的进程总数状态健康组 3调试和诊断命令作用通俗解释使用场景docker logs aeration查看容器历史日志翻一翻容器过去输出了什么查报错、看启动是否成功docker logs -f aeration实时跟踪日志像看直播一样持续刷新最新日志调试接口、看实时运行状态docker exec -it aeration bash进入容器内部像 “远程登录” 进容器里操作看文件、测试环境、手动执行命令组 4清理资源镜像 (Image) 安装包 → docker rmi 删除 容器 (Container) 运行的程序 → docker rm 删除镜像 vs 容器到底是什么┌──────────────────────────────────────────────────┐ │ │ │ 软件世界 Docker 世界 │ │ ──────── ──────── │ │ │ │ 软件安装包 ←→ 镜像 (Image) │ │ (.exe, .dmg) aeration-api:v2 │ │ │ │ 安装运行的程序 ←→ 容器 (Container) │ │ (任务管理器里跑着的) aeration │ │ │ └──────────────────────────────────────────────────┘镜像Image是个静态文件不动放在磁盘上占空间可以从这一个镜像启动多个容器就像同一个安装包能装到多台电脑容器Container是运行的实例活的占内存和 CPU一个容器只能从一个镜像启动实物对应到你的服务器跑docker images你看到的是镜像REPOSITORY TAG SIZE aeration-api v2 8.21GB ← 一个镜像 (静态文件) python 3.10-slim 140MB ← 另一个镜像跑docker ps你看到的是容器NAMES IMAGE STATUS aeration aeration-api:v2 Up 5 hours ← 一个容器 (基于上面的镜像启动)关系图┌─────────────────────────────────┐ │ 镜像: aeration-api:v2 │ (磁盘上, 8.21GB) └────────────┬────────────────────┘ │ docker run 一次 ▼ ┌─────────────────────────────────┐ │ 容器: aeration │ (运行中, 占内存) │ 正在响应 API 请求 │ └─────────────────────────────────┘实际操作演示删除容器docker rm# 容器必须先停止才能删除 docker stop aeration # 1. 停止容器 docker rm aeration # 2. 删除容器 # 或者一行搞定 docker stop aeration docker rm aeration # 强制删除 (跳过停止, 不推荐) docker rm -f aeration直接删运行中的容器会报错docker rm aeration # Error response from daemon: cannot remove a running container # 必须先 stop, 或加 -f删除镜像docker rmi# 删除指定版本的镜像 docker rmi aeration-api:v1 # 删多个镜像 docker rmi aeration-api:v1 hello-world # 强制删除 (即使有容器关联) docker rmi -f aeration-api:v1有容器在用这个镜像时删除会报错docker rmi aeration-api:v2 # Error response from daemon: conflict: unable to remove repository reference # aeration-api:v2 - container c7280984d5a9 is using its referenced image正确做法# 1. 先停掉用这个镜像的容器 docker stop aeration docker rm aeration # 2. 现在能删镜像了 docker rmi aeration-api:v2两者的依赖关系容器依赖镜像镜像可以独立存在┌─────────────────────────────────────────────┐ │ 镜像 v1 ──────► 容器 A (运行中) │ │ └────► 容器 B (运行中) │ │ │ │ 镜像 v2 ──────► 容器 C (运行中) │ │ │ │ 镜像 v3 (无容器使用) ← 这是孤立的镜像 │ └─────────────────────────────────────────────┘操作规则想做限制删容器容器必须先停止或用-f删镜像没有容器在用它运行中或停止的都算┌──────────────────────────────────────────────────────┐ │ │ │ docker build │ │ ────────────► ┌──────────────────────────┐ │ │ 从 Dockerfile │ 镜像 (Image) │ │ │ 构建 │ ───────────── │ │ │ │ - 磁盘上的静态文件 │ │ │ │ - 可以创建多个容器 │ │ │ │ - 删除用 docker rmi │ │ │ └────────────┬─────────────┘ │ │ │ │ │ │ docker run │ │ │ (创建并启动容器) │ │ ▼ │ │ ┌──────────────────────────┐ │ │ │ 容器 (Container) │ │ │ │ ───────────── │ │ │ │ - 运行中的实例 │ │ │ │ - 占用内存和 CPU │ │ │ │ - 删除用 docker rm │ │ │ │ (需先 stop) │ │ │ └──────────────────────────┘ │ │ │ └──────────────────────────────────────────────────────┘模型/代码更新流程以后你重新训练了模型或者改了代码怎么更新部署# 1. 进入项目目录 cd ~/aeration # 2. 在本地改完代码后, 上传新文件 (覆盖旧的) # 3. 构建新版本镜像 docker build -t aeration-api:v3 . # 4. 停掉旧容器 docker stop aeration docker rm aeration # 5. 启动新容器 (用新镜像) docker run -d --name aeration -p 8000:8000 --restartalways aeration-api:v3 # 6. 验证服务正常 sleep 5 docker logs aeration --tail 10 curl http://localhost:8000/ # 7. 确认新版本没问题后, 删除旧镜像 !!!关键步骤!!! docker rmi aeration-api:v2