Docker 已经成为现代软件开发和部署的标准工具。它通过容器化技术,让应用程序的部署变得简单、可靠和可移植。
## Docker 基础概念
### 镜像(Image)
Docker 镜像是一个只读的模板,用于创建 Docker 容器。它包含了运行应用程序所需的所有内容:代码、运行时、库、环境变量和配置文件。
### 容器(Container)
容器是镜像的运行实例。它可以被启动、停止、删除,每个容器都是相互隔离的。
### 仓库(Repository)
Docker 仓库是存储和分发镜像的地方,最著名的是 Docker Hub。
## Dockerfile 编写
创建一个优化的 Dockerfile:
```dockerfile
# 使用官方 Python 基础镜像
FROM python:3.11-slim
# 设置工作目录
WORKDIR /app
# 设置环境变量
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
# 安装系统依赖
RUN apt-get update && apt-get install -y --no-install-recommends postgresql-client build-essential && rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY requirements.txt .
# 安装 Python 依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制项目代码
COPY . .
# 创建非 root 用户
RUN adduser --disabled-password --gecos '' appuser
USER appuser
# 暴露端口
EXPOSE 8000
# 启动命令
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "myproject.wsgi:application"]
```
## Docker Compose
使用 Docker Compose 管理多容器应用:
```yaml
version: '3.8'
services:
web:
build: .
ports:
- "8000:8000"
environment:
- DEBUG=False
- DATABASE_URL=postgresql://user:password@db:5432/mydb
depends_on:
- db
volumes:
- static_volume:/app/staticfiles
db:
image: postgres:15
environment:
- POSTGRES_DB=mydb
- POSTGRES_USER=user
- POSTGRES_PASSWORD=password
volumes:
- postgres_data:/var/lib/postgresql/data
redis:
image: redis:7-alpine
ports:
- "6379:6379"
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf
- static_volume:/app/staticfiles
depends_on:
- web
volumes:
postgres_data:
static_volume:
```
## 最佳实践
### 1. 镜像优化
- 使用多阶段构建减少镜像大小
- 选择合适的基础镜像
- 清理不必要的包和缓存
### 2. 安全考虑
- 使用非 root 用户运行容器
- 定期更新基础镜像
- 扫描镜像漏洞
### 3. 性能优化
- 合理设置资源限制
- 使用健康检查
- 优化应用启动时间
## 生产环境部署
### 1. 环境变量管理
```bash
# 使用 .env 文件
DEBUG=False
SECRET_KEY=your-secret-key
DATABASE_URL=postgresql://user:password@db:5432/mydb
```
### 2. 日志管理
```yaml
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
```
### 3. 监控和备份
- 使用 Prometheus 和 Grafana 监控
- 定期备份数据库
- 设置告警规则
Docker 容器化不仅简化了部署流程,还提高了开发效率和系统可靠性。掌握 Docker 技术对于现代开发者来说是必不可少的技能。