【Django一站式教程 · 第35章】Docker 部署与 Kubernetes 初体验

【第35章】Docker 部署与 Kubernetes 初体验


目录

  1. 章节简介
  2. 为什么使用容器化技术
  3. Docker 基础概念
  4. Docker 安装与环境配置
  5. 编写 Dockerfile 构建 Django 镜像
  6. 使用 Docker Compose 管理多容器应用
  7. Django 项目容器化部署实例
  8. Kubernetes 基础介绍
  9. Kubernetes 部署 Django 项目流程
  10. 配置 ConfigMap、Secret 和持久化存储
  11. 服务发现与负载均衡
  12. 正面示例:Docker + Kubernetes 完整部署实战
  13. 错误示例:容器资源限制与故障排查
  14. 调试技巧:Docker 容器与 Kubernetes 日志分析
  15. 高级技巧:CI/CD 与容器自动化部署
  16. 实际项目实战:博客系统容器化部署与管理
  17. 相关概念与背后原理拓展
  18. 小结
  19. 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️⃣ 部署步骤总结

  1. 本地开发:python manage.py runserver

  2. Docker 构建:docker-compose up --build

  3. DockerHub 推送镜像:

    docker build -t your-dockerhub-user/blog:latest .
    docker push your-dockerhub-user/blog:latest
    
  4. Kubernetes 部署:

    kubectl apply -f k8s/deployment.yaml
    kubectl apply -f k8s/service.yaml
    kubectl apply -f k8s/ingress.yaml
    
  5. 配置 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 辅助生成,并经人工整理与验证,仅供参考学习,欢迎指出错误与不足之处。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值