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

通过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

相关文章:

通过Docker部署FastAPI应用程序

🌞欢迎来到PyTorch深度学习实战的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 📆首发时间:🌹2026年5月24日🌹 ✉️希望可以和大家…...

Win7专业版电脑重启后时间服务总停止?三步设置让它稳定运行(附命令详解)

Win7时间服务异常终极修复指南:从原理到实战每次重启Win7电脑后,右下角的时间总是停留在过去?这可能是Windows时间服务(w32time)在捣鬼。作为系统核心组件之一,时间服务不仅影响时钟显示,更会干…...

鸿蒙数理体系创作说明 (鸿蒙数学一阶完结后更新说明)

本套鸿蒙数学体系,并非凭空独创,而是站在华夏千年古数根基之上,融合西方近代数理实证体系,双向重构、文明合一所诞生的全新本源数理框架。一、本体系继承、吸纳的【华夏传统古数核心本源】整套体系的底层大道骨架、思维范式、宇宙…...

在CentOS7服务器上装Win10?手把手教你用Ventoy搞定双系统(附网卡驱动安装避坑指南)

在CentOS7服务器上实现Win10双系统:Ventoy实战与驱动避坑指南 当Linux服务器遇上Windows需求,双系统成为了一种优雅的解决方案。本文将带你深入探索在CentOS7生产环境中部署Win10双系统的完整流程,特别针对服务器硬件特性提供定制化指导。 …...

2026电工杯数学建模竞赛A题论文、代码、数据

2026年电工杯数学建模竞赛A题完整论文 摘要 随着” 双碳” 战略深入推进,新能源消纳难的问题日益凸显,绿电直连型电氢氨园区成为解决新能源就近消纳和化工行业深度脱碳的重要路径。本文针对绿电直连型电氢氨园区的优化运行问题,基于风电 40MW…...

文章三:Elasticsearch 集群恢复和索引分布

集群恢复网关与集群索引分布必要性了解在 Elasticsearch(简称 ES)集群运维中,集群重启恢复、残余索引处理、索引分片分布是保障集群稳定性、数据完整性、读写性能的三大核心基础能力。多数集群故障、数据丢失、分片异常、读写卡顿问题&#x…...

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移)

Codex入门19-数据库操作(解放双手:用自然语言写SQL、建表和数据迁移) 📌 文章简介:写 SQL 是后端开发的日常,但复杂的 JOIN、子查询、窗口函数总让人头疼。本文教你用 Codex CLI 实现:自然语言直接生成 CREATE TABLE、复杂 SQL 查询、数据库迁移脚本(Prisma/Knex/Alem…...

Codex入门18-批量文件操作(效率神器:一句话批量重命名、格式化、清理几百个文件)

Codex入门18-批量文件操作(效率神器:一句话批量重命名、格式化、清理几百个文件) 📌 文章简介:手动改100个文件名?逐个格式化代码?一个个加版权声明?这些重复劳动该结束了。本文带你用 Codex CLI 一句话搞定批量重命名、批量格式化、批量添加文件头注释、批量清理垃圾…...

Codex入门17-上下文管理(高手秘技:如何让AI精准理解你的百万行大型项目)

Codex入门17-上下文管理(高手秘技:如何让AI精准理解你的百万行大型项目) 📌 文章简介:上下文窗口是 AI 编程的"生命线"——它决定了 AI 能"看到"多少代码、"理解"多少架构。本文深入解析上下文窗口的本质,详解 Codex 如何自动收集项目信息…...

从0开始打造自己的压缩软件(仅文字适配)上——文本的压缩

一、理清步骤 首先作为一个程序,我们必然是要一个输入的,可能是个文本,也可能是其他的内容。那么这个输入输出不能是像过去一样在终端中输入,所以这里要引入我们的io流——即为我们的输入和输出的具体办法。 然后,我们…...

if语句

含义if就是判断条件,满足就执行,不满足就跳过,相当于“如果……就……”代码基础格式:if 条件:满足条件才运行的代码(打完冒号之后要按回车键自动缩进,直接顶格写会报错,手动缩进不符…...

2026最好用的图片处理工具推荐:去水印 / 抠图 / 高清化实测对比

2026最好用的图片处理工具推荐:去水印 / 抠图 / 高清化实测对比 前言:一张图片毁掉一个项目?别让烂工具耽误你 2026年,AI图片处理技术早已不是三年前的水平。发丝级抠图、去水印无痕、超分辨率重建……这些功能听起来很美好&…...

Claude Code 接入 DeepSeek

安装 Claude Code DeepSeek 文档: 使用如下命令安装 Claude Code: npm install -g anthropic-ai/claude-code安装完成后,可以输入下面的命令检查是否安装成功。 claude --version购买 DeepSeek API 创建 Api Key 点击如下链接创建 DeepSeek API Ke…...

P15895 [TOPC 2025] One-Way Abyss 题解

P15895 [TOPC 2025] One-Way Abyss Link: https://www.luogu.com.cn/problem/P15895 题目描述 米蒂是一位勇敢的冒险家,正在探索一个名为“深渊”的神秘地下洞穴系统。深渊由 nnn 条垂直的竖井和 mmm 条水平的隧道组成。每条隧道恰好连接同一深度上的两条竖井。所…...

一文讲清楚规则、Skill、MCP

想象一下,你要开一家餐厅,并招聘了一位AI员工。这三样东西,就是你管理这位新员工的完整装备。1. 规则 —— 餐厅的“企业文化手册”• 这是什么:这是你给AI员工的第一份文件,一本总纲领、总章程。它不教具体怎么做菜&a…...

别再手动下载DLL了!用Windows自带工具SFC/SCANNOW一键修复kernel32.dll错误

别再手动下载DLL了!用Windows自带工具SFC/SCANNOW一键修复kernel32.dll错误当电脑屏幕上突然弹出"无法定位程序输入点kernel32.dll"的红色警告框时,大多数人的第一反应是打开浏览器搜索"如何下载kernel32.dll"。这个看似合理的操作背…...

告别.bash_profile:在macOS Ventura/Sonoma上为Maven配置环境变量的几种新方法(含Zsh教程)

macOS Ventura/Sonoma时代:Maven环境变量配置的现代实践指南如果你最近升级到了macOS Ventura或Sonoma,可能会发现那些教你修改.bash_profile来配置Maven环境变量的教程突然不灵了。这不是你的问题——而是macOS的Shell环境已经悄然进化。作为长期在macO…...

企业官网后台的工程化设计:内容建模、所见即所得与源码自主可控

企业官网后台的工程化设计:内容建模、所见即所得与源码自主可控 “网站做完我们自己能改吗?要不要技术?”——这个业务问题,在工程层面其实是问:这套 CMS 的内容模型、编辑体验、权限和可维护性设计得怎么样。 后台&qu…...

Win10桌面右键新建菜单丢了记事本?别慌,手把手教你用注册表找回来(附权限设置详解)

Win10右键新建菜单丢失记事本?三步精准修复与权限管理指南刚泡好的咖啡还在冒热气,你像往常一样在桌面右键点击"新建",却发现那个最常用的"文本文档"选项凭空消失了。这不是个例——微软官方社区数据显示,每月…...

Bi-LSTM vs CNN-BiLSTM:实战对比哪个模型更适合你的时间序列预测任务?

Bi-LSTM与CNN-BiLSTM实战抉择:时间序列预测的黄金选择法则当面对时间序列预测任务时,选择正确的模型架构往往能决定项目的成败。Bi-LSTM和CNN-BiLSTM作为两种主流的深度学习模型,各自在特定场景下展现出独特优势。本文将带您深入剖析这两种模…...

别再为立体匹配发愁了!手把手教你用Fusiello法搞定双目相机极线校正(附Python代码)

双目视觉实战:Fusiello极线校正算法详解与Python实现在计算机视觉领域,立体匹配是获取三维场景信息的关键步骤。但原始双目图像由于相机位置差异,导致匹配搜索空间复杂,计算效率低下。本文将深入解析Fusiello极线校正算法的数学原…...

避坑指南:在openEuler 22.03上配置vsftpd虚拟用户,解决gdbmtool替代db_load的认证问题

深度解析:在openEuler 22.03上配置vsftpd虚拟用户的最佳实践 最近在openEuler 22.03上配置vsftpd虚拟用户时,我发现了一个让不少从CentOS/RHEL迁移过来的管理员头疼的问题:传统的 db_load 方法在这里行不通了。经过一番探索和踩坑&#xff…...

MacBook新手福音:用Final Cut Pro 10.6.5搞定你的第一门视频课(附保姆级设置与导出指南)

MacBook新手福音:Final Cut Pro 10.6.5视频课制作全流程精解第一次打开Final Cut Pro时,那个布满陌生术语的界面是否让你望而却步?作为Mac用户专属的视频剪辑利器,它其实远比想象中友好。本文将带你用最直接的方式,从零…...

别再让Ubuntu卡成PPT!手把手教你用swapfile把交换空间从1G扩容到64G(附权限修复)

Ubuntu系统Swap空间扩容实战:从1G到64G的完整解决方案当你在Ubuntu上运行内存密集型任务时,是否遇到过系统突然变得异常缓慢,甚至完全卡死的情况?很多拥有大内存(如32GB或更高)的用户可能会惊讶地发现&…...

别再只认ldd了!盘点5种查看Linux程序动态库依赖的方法(含静态/交叉编译场景)

超越ldd:Linux二进制依赖分析的5种专业方法解析在Linux系统管理和开发中,遇到"不是动态可执行文件"的错误提示时,很多工程师的第一反应是困惑——明明是可执行文件,为什么ldd无法识别?这个问题背后隐藏着Lin…...

【程序源代码】答题微信小程序(含源码)

关键字:答题,小程序,OCR, 题目识别,题库,练习,错题集,微信小程序,Vue项目名称:答题微信小程序答题小程序是面向学生群体打造的轻量化在线答题学习平台,基于微…...

交通顶刊TR Part C 2026年6月论文导读(下)

一期刊简介Transportation Research Part C (TR-C): Emerging Technologies 是交通领域顶刊,由 Elsevier 出版,中科院与 JCR 均为 1 区,近年影响因子约8–9.6。该期刊以交通系统为核心,聚焦 AI、大数据、运筹学等新兴技术对交通规…...

AI应用开发岗面经

1、请先做一下自我介绍。2、你的毕设作品,从产品需求设计到后续开发全流程,都是你一个人独立完成的吗?3、你为什么会选择做这个毕设项目?4、你在做这个项目的过程中,遇到的比较大的挑战是什么?5、你为什么会…...

选型必看!国产RT-Thread才是商用量产最优解

做嵌入式项目选型,很多工程师总会纠结:Zephyr、FreeRTOS、uC/OS、RT-Thread到底怎么选?不少测评一味堆砌极限跑分数据,盲目吹捧海外系统的参数优势,却忽略了国内企业最看重的国产化合规、开发效率、落地量产、售后保障…...

Titanic数据集分析避坑指南:新手常犯的3个错误及如何修正

Titanic数据集分析避坑指南:新手常犯的3个错误及如何修正泰坦尼克号数据集是机器学习领域的"Hello World",但看似简单的数据背后藏着无数陷阱。许多初学者在Kaggle等平台提交分析时,常常陷入三个典型误区:用均值粗暴填充…...