Docker教程完整版:从容器化基础到AI应用部署
在当今快速迭代的软件开发与部署环境中,Docker 已成为一项革命性的技术。它通过容器化技术,将应用程序及其所有依赖项打包在一个标准化的单元中,从而实现了“一次构建,处处运行”的梦想。无论你是进行传统的网站开发,编写Python脚本,还是构建前沿的AI应用,Docker都能提供一致的运行环境,极大简化了开发、测试和部署的流程。本教程将带你从零开始,全面掌握Docker的核心概念、基本操作以及如何将其应用于实际项目。
一、 Docker核心概念与安装
在深入实践之前,理解几个核心概念至关重要:
- 镜像(Image):一个只读的模板,包含了运行应用所需的代码、运行时、库、环境变量和配置文件。例如,一个
python:3.9-slim镜像就提供了一个轻量级的Python 3.9运行环境。 - 容器(Container):镜像的运行实例。你可以创建、启动、停止、移动或删除容器。容器是独立且安全的,彼此隔离。
- 仓库(Registry):存放镜像的地方。最著名的是Docker Hub,你可以从中拉取(pull)公共镜像,也可以推送(push)自己的私有镜像。
安装Docker非常简单。以Ubuntu系统为例,可以通过官方脚本快速安装:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
安装完成后,运行sudo docker run hello-world来验证安装是否成功。这个命令会从Docker Hub拉取一个测试镜像并运行一个容器,如果看到欢迎信息,说明Docker已经准备就绪。
二、 Docker基础操作:镜像与容器管理
掌握对镜像和容器的基本操作是使用Docker的第一步。
1. 镜像操作
- 搜索镜像:
docker search nginx - 拉取镜像:
docker pull python:3.9 - 列出本地镜像:
docker images - 删除镜像:
docker rmi <image_id>
2. 容器操作
- 运行容器(以交互模式运行一个Python容器):
docker run -it --name my_python python:3.9 bash - 列出运行中的容器:
docker ps - 列出所有容器(包括已停止的):
docker ps -a - 停止容器:
docker stop <container_id> - 启动已停止的容器:
docker start <container_id> - 进入运行中的容器:
docker exec -it <container_id> bash - 删除容器:
docker rm <container_id>
一个关键参数是-v,它用于挂载宿主机目录到容器内,实现数据持久化和实时代码同步,这对开发极为有用:
docker run -it -v /home/user/myapp:/app python:3.9 bash
三、 使用Dockerfile构建自定义镜像
从基础镜像创建自定义镜像是Docker的核心应用场景。这通过编写一个名为Dockerfile的文本文件来实现。
假设我们有一个简单的Python Flask网站应用,项目结构如下:
my_flask_app/
├── app.py
├── requirements.txt
└── Dockerfile
其中app.py是一个简单的Flask应用,requirements.txt列出了依赖(如flask)。Dockerfile内容如下:
# 使用官方Python轻量级镜像作为基础
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 将依赖文件复制到工作目录
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 将应用代码复制到容器内
COPY . .
# 声明容器运行时监听的端口
EXPOSE 5000
# 定义容器启动时执行的命令
CMD ["python", "app.py"]
在Dockerfile所在目录,执行构建命令:
docker build -t my-flask-app:latest .
之后,即可用docker run -p 5000:5000 my-flask-app运行你的容器化网站应用。
四、 Docker Compose:编排多容器应用
现代应用,尤其是微服务或AI应用,往往由多个服务组成(例如:Web应用、数据库、Redis缓存)。Docker Compose允许你使用一个YAML文件来定义和运行多个容器。
一个典型的docker-compose.yml示例如下,它定义了一个Python Web应用和一个PostgreSQL数据库:
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
volumes:
- .:/code
depends_on:
- db
environment:
- DATABASE_URL=postgresql://user:password@db/mydb
db:
image: postgres:13
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: mydb
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
使用命令docker-compose up -d即可一键启动所有定义的服务。docker-compose down则停止并移除所有容器。
五、 Docker在AI应用开发中的实战
AI开发严重依赖特定的库版本(如TensorFlow、PyTorch)和系统环境。Docker是解决“在我机器上能运行”这一问题的终极方案。
场景:部署一个基于PyTorch的图像分类模型API。
Dockerfile示例:
FROM pytorch/pytorch:1.9.0-cuda11.1-cudnn8-runtime
WORKDIR /app
# 复制依赖文件并安装
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 可能包含 fastapi, uvicorn, pillow 等
# 复制模型文件和应用代码
COPY model.pth .
COPY app.py .
# 暴露API端口
EXPOSE 8080
# 启动FastAPI服务器
CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8080"]
这个镜像确保了从研究到生产的环境完全一致。你可以在本地训练模型,用相同的Docker镜像在云服务器或Kubernetes集群上进行大规模部署,无需担心CUDA版本、Python包冲突等问题。
更进一步,你可以使用Docker Compose将AI模型服务、前端界面和后端数据库组合起来,形成一个完整的AI应用栈。
总结
Docker不仅仅是一个工具,它代表了一种现代化的应用交付哲学。通过本教程,你掌握了从核心概念、基础命令、自定义镜像构建(Dockerfile)到多服务编排(Docker Compose)的全流程。无论你是进行网站开发,需要统一团队环境;还是从事Python数据分析,希望封装复杂的依赖;或是投身于AI应用开发,追求模型的可复现性和可部署性,Docker都是你技术栈中不可或缺的一环。从今天开始,尝试将你的下一个项目容器化,亲身体验它带来的开发效率与部署便捷性的飞跃。



