Docker容器化部署AI应用从入门到实战

在AI应用开发中,一个常见痛点就是"在我电脑上能跑"——环境不一致导致的部署灾难。Docker容器化技术正是解决这一问题的利器。它通过将应用及其所有依赖打包成轻量级、可移植的容器,确保开发、测试、生产环境完全一致。本文将从零开始,带你完整走一遍Docker部署AI应用的实战流程,最终将一个Streamlit AI Web应用部署到容器中。

一、Docker基础与安装

Docker是一个开源的容器化平台,核心概念包括镜像(Image)、容器(Container)、仓库(Repository)。镜像是一个只读模板,包含运行应用所需的文件系统;容器是镜像的运行实例;仓库用来存储和分发镜像。与传统虚拟机相比,Docker共享宿主机内核,启动时间秒级,资源开销极小。

在Ubuntu 22.04/24.04上安装Docker非常简单,执行以下命令即可完成安装并配置当前用户权限:

Shell安装 Docker
# 更新包索引并安装依赖
sudo apt update && sudo apt install -y \
    ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥和仓库
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
    sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg

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

# 安装 Docker 引擎
sudo apt update && sudo apt install -y docker-ce docker-ce-cli containerd.io

# 验证安装
sudo docker run hello-world

安装完成后,运行 docker --version 确认版本。建议将当前用户加入 docker 组,避免每次使用 sudosudo usermod -aG docker $USER,然后重新登录即可。

💡 提示:在云服务器上部署时,建议安装 Docker Compose V2(随 Docker 引擎自动安装),使用 docker compose version 确认。Compose 是多容器编排的必备工具。

二、编写 Dockerfile

Dockerfile 是一个文本文件,包含一系列指令,Docker 会按照这些指令逐层构建镜像。对于 AI 应用,典型的 Dockerfile 需要:选择基础镜像(官方 Python 镜像)、安装系统依赖(如 gcc、ffmpeg)、复制项目文件、安装 Python 依赖、暴露端口、设置启动命令。

下面以部署一个 Streamlit AI 应用为例,我们创建一个 app.py(一个简单的图像分类演示应用),然后编写 Dockerfile。项目结构如下:

Text项目目录结构
ai-streamlit-app/
├── app.py          # Streamlit 应用主文件
├── requirements.txt # Python 依赖
├── Dockerfile      # Docker 构建文件
└── docker-compose.yml # 编排文件(后续用到)

先看 app.py——这是一个轻量级的 AI 图片分类器,使用 Hugging Face 的 transformers 库:

Pythonapp.py — Streamlit AI 应用
import streamlit as st
from transformers import pipeline
from PIL import Image

st.set_page_config(page_title="AI 图像分类器", layout="centered")
st.title("🤖 AI 图像分类演示")
st.markdown("上传一张图片,AI 模型将自动识别内容类别。")

# 加载预训练模型(仅首次加载,之后缓存)
@st.cache_resource
def load_model():
    return pipeline("image-classification",
                      model="google/vit-base-patch16-224")

classifier = load_model()
uploaded = st.file_uploader("选择图片", type=["jpg", "png", "jpeg"])

if uploaded is not None:
    image = Image.open(uploaded)
    st.image(image, caption="上传的图片", use_container_width=True)
    with st.spinner("AI 正在分析..."):
        results = classifier(image)
    for r in results[:3]:
        st.write(f"**{r['label']}**: {r['score']:.2%}")

接下来是 requirements.txt

Textrequirements.txt
streamlit==1.38.0
transformers==4.46.0
torch==2.4.0
Pillow==10.4.0

现在,核心的 Dockerfile 来了。我们采用多阶段构建思想:第一阶段安装依赖,第二阶段运行——这样最终镜像更小、更安全。

Dockerfile多阶段构建的 Dockerfile
# ===== Stage 1: 依赖安装 =====
FROM python:3.11-slim AS builder

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

# ===== Stage 2: 运行镜像 =====
FROM python:3.11-slim

# 设置环境变量:Python 不输出缓冲,Streamlit 无浏览器模式
ENV PYTHONUNBUFFERED=1 \
    STREAMLIT_SERVER_HEADLESS="true"

WORKDIR /app

# 从 builder 阶段复制已安装的 Python 包
COPY --from=builder /usr/local/lib/python3.11/site-packages \
    /usr/local/lib/python3.11/site-packages

# 复制应用代码
COPY app.py .

# 暴露 Streamlit 默认端口
EXPOSE 8501

# 启动命令
CMD ["streamlit", "run", "app.py", \
      "--server.port=8501", "--server.address=0.0.0.0"]
🔑 关键点解读:
• FROM python:3.11-slim — 基于官方最小化 Python 3.11 镜像,体积约 120MB。
• 多阶段构建 — 第一阶段安装所有依赖,第二阶段只复制产物,避免 build 工具留在最终镜像中。
• EXPOSE 8501 — 文档性声明,实际端口映射在 docker run -p 中指定。
• CMD — 设置 --server.address=0.0.0.0 让容器外部可以访问。

三、构建镜像与运行容器

Dockerfile 写好后,一条命令即可构建镜像。进入项目目录,执行以下命令:

Shell构建镜像 & 运行容器
# 构建镜像(-t 指定标签,. 表示构建上下文)
docker build -t ai-streamlit-app:latest .

# 查看镜像列表
docker images

# 运行容器(前台模式,测试用)
docker run -p 8501:8501 ai-streamlit-app:latest

# 后台运行(-d 后台,--name 指定容器名)
docker run -d --name my-ai-app -p 8501:8501 \
    --restart unless-stopped ai-streamlit-app:latest

# 查看运行中的容器
docker ps

# 查看日志
docker logs -f my-ai-app

镜像构建完成后,通过 docker run -p 8501:8501 将宿主机的 8501 端口映射到容器的 8501 端口。现在打开浏览器访问 http://<服务器IP>:8501,即可看到 Streamlit AI 应用界面。

⚠️ 常见问题:如果访问不到,检查云服务器的安全组/防火墙是否放行了 8501 端口。也可以先用 curl http://localhost:8501 在服务器上测试。

四、docker-compose 多服务编排

当你的 AI 应用需要依赖数据库(如 PostgreSQL)、缓存(如 Redis)或者多个微服务时,手动管理每个容器就变得非常繁琐。docker-compose 让你用一份 YAML 配置文件定义和运行多容器应用。

假设我们的架构是:Streamlit 前端 → Redis 缓存 → AI 推理服务。用 docker-compose 可以这样定义:

YAMLdocker-compose.yml
version: "3.9"

services:
  # AI Web 前端
  web:
    build: .
    container_name: ai-web
    ports:
      - "8501:8501"
    environment:
      - REDIS_HOST=redis
      - REDIS_PORT=6379
    depends_on:
      - redis
    restart: unless-stopped

  # Redis 缓存(加速推理结果)
  redis:
    image: redis:7-alpine
    container_name: ai-cache
    ports:
      - "6379:6379"
    volumes:
      - redis_data:/data
    restart: unless-stopped

  # AI 推理 API(FastAPI 服务)
  inference:
    image: ai-inference:latest
    container_name: ai-inference
    ports:
      - "8000:8000"
    environment:
      - MODEL_NAME=google/vit-base-patch16-224
      - DEVICE=cpu
    deploy:
      resources:
        limits:
          memory: 2g
    restart: unless-stopped

volumes:
  redis_data:

使用 docker-compose 管理整个生命周期:

Shelldocker-compose 常用命令
# 启动所有服务(构建 + 创建 + 启动)
docker compose up -d

# 查看服务状态
docker compose ps

# 查看实时日志
docker compose logs -f

# 重新构建并启动(修改 Dockerfile 后)
docker compose up -d --build

# 停止并移除所有服务
docker compose down

# 缩小到特定服务
docker compose up -d web redis

docker-compose 的 depends_on 确保服务启动顺序;volumes 持久化数据(如 Redis 缓存);deploy.resources.limits 限制 AI 推理服务的内存占用,防止 OOM。使用 docker compose up -d 一条命令即可启动整个 AI 应用栈。

五、生产环境最佳实践

把 AI 应用部署到生产环境,还有一些关键实践值得注意:

5.1 镜像优化

使用 docker images 查看镜像大小。对于 AI 应用,模型文件可能很大。建议将模型文件放在容器外的共享卷中,或使用 Hugging Face 的缓存机制。此外,尽量使用 --no-cache-dir 安装 pip 依赖,并使用 .dockerignore 排除不必要的文件(如 .git__pycache__)。

Text.dockerignore
.git/
__pycache__/
*.pyc
.env
*.md
.gitignore

5.2 健康检查与自动重启

在生产环境中,为容器添加健康检查可以让 Docker 自动检测并重启异常容器:

Dockerfile健康检查配置
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s \
    --retries=3 CMD curl --fail http://localhost:8501/_stcore/health || exit 1

5.3 日志与监控

Docker 自带的 docker logs 在容器重启后会丢失日志。推荐使用 --log-driver=json-file 加上日志轮转,或接入 ELK / Loki 等集中式日志平台。利用 docker stats 实时监控容器资源使用:

Shell监控与日志
# 实时查看容器资源占用
docker stats

# 限制日志大小,防止磁盘写满
docker run -d --log-opt max-size=10m --log-opt max-file=3 \
    --name my-ai-app -p 8501:8501 ai-streamlit-app:latest

5.4 GPU 支持

如果 AI 模型需要 GPU 加速,Docker 通过 NVIDIA Container Toolkit 支持:

ShellDocker GPU 支持
# 安装 NVIDIA Container Toolkit
sudo apt install -y nvidia-container-toolkit
sudo systemctl restart docker

# 运行容器时添加 --gpus 参数
docker run -d --gpus all --name ai-gpu-app \
    -p 8501:8501 ai-streamlit-app:latest

# docker-compose 中配置
# deploy:
#   resources:
#     reservations:
#       devices:
#         - driver: nvidia
#           count: 1
#           capabilities: [gpu]

六、结语与延伸

至此,你已经掌握了 Docker 容器化部署 AI 应用的完整技能链:从环境安装、Dockerfile 编写、镜像构建与容器运行,到 docker-compose 多服务编排,再到生产环境的优化实践。这套方法不仅适用于 Streamlit,同样适用于 FastAPI、Gradio、Flask 等任何 AI Web 框架。

Docker 的魅力在于"一次构建,到处运行"。将你的 AI 应用容器化后,可以毫无顾虑地部署到任何 Linux 服务器、云主机甚至边缘设备上。随着 Kubernetes 等编排工具的深入使用,容器化更是迈向云原生 AI 架构的第一步。

希望本文能帮助你在 AI 工程化道路上少踩一些坑。如果你在实践过程中遇到问题,欢迎在评论区留言讨论。

📚 推荐延伸阅读:
Docker 官方文档 — 最权威的参考
Streamlit 官方文档 — 快速搭建 AI 演示应用
Kubernetes 官方文档 — 生产级容器编排