【第35章】Docker 部署与 Kubernetes 初体验
目录
- 章节简介
- 为什么使用容器化技术
- Docker 基础概念
- Docker 安装与环境配置
- 编写 Dockerfile 构建 Django 镜像
- 使用 Docker Compose 管理多容器应用
- Django 项目容器化部署实例
- Kubernetes 基础介绍
- Kubernetes 部署 Django 项目流程
- 配置 ConfigMap、Secret 和持久化存储
- 服务发现与负载均衡
- 正面示例:Docker + Kubernetes 完整部署实战
- 错误示例:容器资源限制与故障排查
- 调试技巧:Docker 容器与 Kubernetes 日志分析
- 高级技巧:CI/CD 与容器自动化部署
- 实际项目实战:博客系统容器化部署与管理
- 相关概念与背后原理拓展
- 小结
- AI创作声明
1. 章节简介
容器化技术改变了传统应用部署模式,提高了环境一致性与扩展性。本章系统讲解 Docker 和 Kubernetes 的基本知识与操作,指导你将 Django 项目容器化部署,助力项目实现云原生转型。
2. 为什么使用容器化技术
- 环境一致性,避免“环境不一致”导致的问题。
- 快速部署与扩展,支持微服务架构。
- 资源隔离,提高安全性。
- 方便持续集成与持续部署。
3. Docker 基础概念
- 镜像(Image)、容器(Container)、仓库(Registry)。
- Docker 引擎、Docker CLI。
- 容器生命周期管理。
4. Docker 安装与环境配置
- 官方下载安装教程。
- 配置 Docker 环境变量。
- 常用命令介绍。
5. 编写 Dockerfile 构建 Django 镜像
示例 Dockerfile:
FROM python:3.10-slim
ENV PYTHONUNBUFFERED 1
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
CMD ["gunicorn", "project_name.wsgi:application", "--bind", "0.0.0.0:8000"]
- 镜像层优化技巧。
- 多阶段构建简介。
6. 使用 Docker Compose 管理多容器应用
- 编写
docker-compose.yml
文件管理 Django、数据库、缓存容器。
示例:
version: '3'
services:
web:
build: .
command: gunicorn project_name.wsgi:application --bind 0.0.0.0:8000
ports:
- "8000:8000"
volumes:
- .:/app
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_DB: mydb
POSTGRES_USER: user
POSTGRES_PASSWORD: password
7. Django 项目容器化部署实例
- 构建镜像,启动容器。
- 数据库迁移与静态文件收集。
- 日志管理与性能调优。
8. Kubernetes 基础介绍
- Kubernetes 组成:Pod、Deployment、Service、Ingress。
- Kubernetes API 与资源对象。
- 与 Docker 的关系。
9. Kubernetes 部署 Django 项目流程
- 编写 Deployment、Service YAML。
- 创建 ConfigMap、Secret 传递配置。
- 持久化存储配置示例。
10. 配置 ConfigMap、Secret 和持久化存储
- 配置环境变量与敏感信息管理。
- PVC 与 PV 介绍及使用。
- 数据持久化和备份策略。
11. 服务发现与负载均衡
- Kubernetes Service 类型详解。
- Ingress 控制器配置。
- 负载均衡实现与健康检查。
12. 正面示例:Django 个人博客示例项目(含 Docker & Kubernetes 部署)
1️⃣ 项目目录结构
blog_project/
├── manage.py
├── requirements.txt
├── Dockerfile
├── docker-compose.yml
├── blog_project/
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ ├── asgi.py
│ └── wsgi.py
├── blog/
│ ├── __init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── views.py
│ ├── urls.py
│ └── templates/
│ └── blog/
│ ├── index.html
│ └── post_detail.html
├── k8s/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── ingress.yaml
└── README.md
2️⃣ 创建项目与应用
# 创建虚拟环境
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
# 安装依赖
pip install django gunicorn psycopg2-binary
# 创建 Django 项目
django-admin startproject blog_project .
# 创建应用
python manage.py startapp blog
# 创建模板目录
mkdir -p blog/templates/blog
3️⃣ 核心文件内容
requirements.txt
Django>=4.2,<5.0
gunicorn>=20.1
psycopg2-binary>=2.9
blog/models.py
from django.db import models
class Post(models.Model):
title = models.CharField(max_length=200)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return self.title
blog/views.py
from django.shortcuts import render, get_object_or_404
from .models import Post
def index(request):
posts = Post.objects.order_by('-created_at')
return render(request, 'blog/index.html', {'posts': posts})
def post_detail(request, post_id):
post = get_object_or_404(Post, pk=post_id)
return render(request, 'blog/post_detail.html', {'post': post})
blog/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='index'),
path('post/<int:post_id>/', views.post_detail, name='post_detail'),
]
blog_project/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('blog.urls')),
]
blog/templates/blog/index.html
<!DOCTYPE html>
<html>
<head>
<title>个人博客</title>
</head>
<body>
<h1>我的博客</h1>
<ul>
{% for post in posts %}
<li><a href="{% url 'post_detail' post.id %}">{{ post.title }}</a> ({{ post.created_at }})</li>
{% empty %}
<li>暂无文章</li>
{% endfor %}
</ul>
</body>
</html>
blog/templates/blog/post_detail.html
<!DOCTYPE html>
<html>
<head>
<title>{{ post.title }}</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<p>{{ post.content }}</p>
<a href="{% url 'index' %}">返回首页</a>
</body>
</html>
blog/admin.py
from django.contrib import admin
from .models import Post
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ('title', 'created_at')
blog_project/settings.py(数据库配置 PostgreSQL 示例)
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'blogdb',
'USER': 'bloguser',
'PASSWORD': 'blogpass',
'HOST': 'db',
'PORT': '5432',
}
}
4️⃣ Docker 配置
Dockerfile
# 基础镜像
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
ENV PYTHONUNBUFFERED=1
# 迁移数据库 + 收集静态文件
RUN python manage.py migrate
RUN python manage.py collectstatic --noinput
# 启动 Gunicorn
CMD ["gunicorn", "blog_project.wsgi:application", "--bind", "0.0.0.0:8000"]
docker-compose.yml
version: '3.9'
services:
db:
image: postgres:15
environment:
POSTGRES_DB: blogdb
POSTGRES_USER: bloguser
POSTGRES_PASSWORD: blogpass
volumes:
- postgres_data:/var/lib/postgresql/data
web:
build: .
command: gunicorn blog_project.wsgi:application --bind 0.0.0.0:8000
volumes:
- .:/app
ports:
- "8000:8000"
depends_on:
- db
volumes:
postgres_data:
运行:
docker-compose up --build
访问:http://localhost:8000
5️⃣ Kubernetes 部署示例
k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: blog-deployment
spec:
replicas: 2
selector:
matchLabels:
app: blog
template:
metadata:
labels:
app: blog
spec:
containers:
- name: blog
image: your-dockerhub-user/blog:latest
ports:
- containerPort: 8000
env:
- name: DATABASE_HOST
value: db-service
- name: DATABASE_NAME
value: blogdb
- name: DATABASE_USER
value: bloguser
- name: DATABASE_PASSWORD
value: blogpass
k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
name: blog-service
spec:
selector:
app: blog
ports:
- protocol: TCP
port: 80
targetPort: 8000
type: ClusterIP
k8s/ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: blog-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: blog.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: blog-service
port:
number: 80
6️⃣ 部署步骤总结
-
本地开发:
python manage.py runserver
-
Docker 构建:
docker-compose up --build
-
DockerHub 推送镜像:
docker build -t your-dockerhub-user/blog:latest . docker push your-dockerhub-user/blog:latest
-
Kubernetes 部署:
kubectl apply -f k8s/deployment.yaml kubectl apply -f k8s/service.yaml kubectl apply -f k8s/ingress.yaml
-
配置 DNS 或 /etc/hosts 指向 Ingress Controller 的外部 IP。
13. 错误示例:容器资源限制与故障排查
- CPU、内存限制设置错误导致容器重启。
- 容器网络配置错误导致访问失败。
- 持久化存储挂载失败分析。
14. 调试技巧:Docker 容器与 Kubernetes 日志分析
- 使用
docker logs
命令查看日志。 - Kubernetes Pod 日志查看与追踪。
- 使用 kubectl exec 进入容器调试。
15. 高级技巧:CI/CD 与容器自动化部署
- 结合 GitHub Actions 实现镜像自动构建。
- 配合 Helm 管理 Kubernetes 应用发布。
- 滚动更新与回滚策略。
16. 实际项目实战:博客系统容器化部署与管理
- Docker 化博客系统代码。
- Kubernetes 部署和服务配置。
- 持续集成自动部署流水线搭建。
17. 相关概念与背后原理拓展
- 容器虚拟化技术原理。
- Kubernetes 调度算法。
- 网络插件与容器网络模型。
- 持续集成与持续部署概念。
18. 小结
掌握 Docker 和 Kubernetes 技能,是现代 Django 开发者迈向云原生的重要一步。容器化部署带来灵活、高效和可扩展的项目管理方式。
19. AI创作声明
本文部分内容由 AI 辅助生成,并经人工整理与验证,仅供参考学习,欢迎指出错误与不足之处。