Docker 通過容器化實現「構建一次、到處運行」,配合 Docker Compose 編排多容器應用,能快速搭建包含 Django、PostgreSQL、Redis、Nginx、數據卷的完整開發環境。本文基於 dockerizing-django 專案結構,詳細演示從本地設置到容器啟動的全過程。

| 容器 | 職責 | 關鍵技術 |
|---|---|---|
| Web / Django | 運行 Django 應用(Gunicorn/uWSGI) | Python 3、依賴隔離、熱重載 |
| Nginx | 反向代理、靜態文件服務、SSL 終結 | nginx.conf、upstream、卷掛載靜態文件 |
| PostgreSQL | 關係型數據庫持久化 | 官方镜像、環境變量初始化、數據卷 |
| Redis | 緩存、會話存儲、Celery Broker | 官方镜像、持久化配置 |
| Data Volume | 共享靜態文件、媒體文件、數據庫文件 | Docker Volume、bind mount |
# 安裝 Docker Engine(參考官方文檔)
# 安裝 Docker Compose
sudo curl -L "https://github.com/docker/compose/releases/download/v2.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
# 驗證版本
docker --version # 20.10+
docker-compose --version # 2.x
.
├── docker-compose.yml # 開發環境編排
├── production.yml # 生產環境覆蓋配置
├── nginx/
│ ├── Dockerfile
│ └── sites-enabled/
│ └── django_project # Nginx 站點配置
└── web/
├── Dockerfile # Django 構建文件
├── docker_django/ # Django 專案代碼
│ ├── apps/
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── manage.py
├── requirements.txt
└── static/
version: '3.8'
services:
postgres:
image: postgres:15-alpine
environment:
POSTGRES_DB: django_db
POSTGRES_USER: django_user
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U django_user -d django_db"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
volumes:
- redis_data:/data
command: redis-server --appendonly yes
web:
build: ./web
command: python manage.py runserver 0.0.0.0:8000
volumes:
- ./web:/app
- static_volume:/app/static
- media_volume:/app/media
ports:
- "8000:8000"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_started
environment:
- DEBUG=1
- DATABASE_URL=postgres://django_user:secret@postgres:5432/django_db
- REDIS_URL=redis://redis:6379/0
nginx:
build: ./nginx
ports:
- "80:80"
- "443:443"
volumes:
- static_volume:/var/www/static
- media_volume:/var/www/media
depends_on:
- web
volumes:
postgres_data:
redis_data:
static_volume:
media_volume:
FROM python:3.11-slim
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PIP_NO_CACHE_DIR=1
WORKDIR /app
# 安裝系統依賴(psycopg2、pillow 等需要)
RUN apt-get update && apt-get install -y --no-install-recommends \
libpq-dev gcc libc-dev && \
rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8000
# 開發環境用 runserver,生產換 gunicorn
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
upstream django {
server web:8000;
}
server {
listen 80;
server_name localhost;
location /static/ {
alias /var/www/static/;
expires 30d;
}
location /media/ {
alias /var/www/media/;
expires 30d;
}
location / {
proxy_pass https://django;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
# 構建並後台啟動所有服務
docker-compose up -d --build
# 查看日志
docker-compose logs -f web
docker-compose logs -f nginx
# 進入 Web 容器執行管理命令
docker-compose exec web python manage.py migrate
docker-compose exec web python manage.py createsuperuser
docker-compose exec web python manage.py collectstatic --noinput
# 停止並移除容器、網絡(保留卷數據)
docker-compose down
# 完全清理(含卷數據,慎用)
docker-compose down -v
volumes: - ./web:/app 將本地代碼掛載進容器,runserver 自動檢測文件變更重啟。requirements.txt 單獨 COPY 並 RUN pip install,利用 Docker 層緩存加速構建。postgres_data 卷,容器重建不丟失數據。settings.py 配置 DEBUG=True,IDE 遠程調試連接容器 8000 端口。production.yml 覆蓋:關閉 DEBUG、Gunicorn 多進程、Nginx 啟用 SSL、靜態文件由 Nginx 直接服務。docker-compose -f docker-compose.yml -f production.yml up -d 疊加部署。pg_dump 到對象存儲)。掌握 Docker Compose 編排 Django 全棧應用,能讓團隊擁有一致、可復現、易擴展的開發環境,大幅減少「在我機器上能跑」的問題,加速從代碼到上線的交付流程。