2025最完整Docker零基础实战教程:从环境搭建到Django+PostgreSQL部署

2025最完整Docker零基础实战教程:从环境搭建到Django+PostgreSQL部署

【免费下载链接】docker-tutorial Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL 📝 【免费下载链接】docker-tutorial 项目地址: https://gitcode.com/gh_mirrors/do/docker-tutorial

开篇:你还在为环境配置抓狂吗?

作为开发者,你是否经历过这些场景:新同事花3天配置开发环境仍无法运行项目?本地调试正常的代码部署到服务器却频繁报错?Docker容器内无法连接本地数据库?本文将通过7大模块+32个实操案例,带你从Docker零基础成长为实战专家,最终部署一个完整的Django+PostgreSQL应用栈。读完本文你将掌握:

  • Docker核心概念与高效命令体系
  • 容器网络/数据卷/环境变量深度配置
  • Docker Compose多服务编排实战
  • 进阶技巧:健康检查/Entrypoint/Profiles
  • 监控与调试容器的5种方案
  • 企业级部署避坑指南

一、Docker核心原理:为什么它能解决环境一致性问题?

1.1 容器与虚拟机的本质区别

传统虚拟机(VM)需要模拟完整操作系统,而Docker容器共享宿主机内核,仅包含应用及其依赖,启动速度提升10倍以上:

mermaid

特性虚拟机(VM)Docker容器
启动时间分钟级秒级资源占用GB级MB级
隔离级别操作系统级进程级
镜像大小通常>10GB通常<500MB
性能损耗10-20%<2%

1.2 Docker核心组件

  • 镜像(Image):只读模板,包含运行应用所需的代码、运行时、库、环境变量和配置文件。例如postgres:14镜像包含PostgreSQL数据库的完整运行环境。

  • 容器(Container):镜像的运行实例,可被创建、启动、停止、删除。容器间相互隔离,通过网络接口通信。

  • Docker Compose:多容器编排工具,通过docker-compose.yml定义服务、网络和数据卷关系。

  • 数据卷(Volume):持久化存储容器数据的机制,独立于容器生命周期,支持多容器共享。

二、Docker环境搭建:3分钟搞定全平台安装

2.1 系统要求与兼容性检查

操作系统支持版本安装方式
Windows10 专业版/企业版(Hyper-V)Docker Desktop
macOS10.15+Docker Desktop
LinuxUbuntu 20.04+/CentOS 7+apt/yum包管理器

2.2 Ubuntu极速安装脚本

# 卸载旧版本
sudo apt-get remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt-get update && sudo apt-get install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

# 添加Docker官方GPG密钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 设置稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装Docker Engine
sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

# 验证安装
docker --version && docker compose version

# 配置非root用户权限
sudo usermod -aG docker $USER

⚠️ 执行完成后需注销并重新登录,使权限生效

2.3 国内镜像加速配置

创建或修改/etc/docker/daemon.json

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn",
    "https://hub-mirror.c.163.com",
    "https://reg-mirror.qiniu.com"
  ]
}

重启Docker服务:

sudo systemctl daemon-reload && sudo systemctl restart docker

三、Docker核心命令实战:从基础操作到高级技巧

3.1 镜像管理三板斧

# 搜索镜像(支持模糊匹配)
docker search postgres --filter=stars=5000

# 拉取指定版本镜像
docker pull postgres:14-alpine

# 查看本地镜像
docker images --format "{{.Repository}}:{{.Tag}} {{.Size}}"

# 删除镜像(强制删除使用-f)
docker rmi postgres:14-alpine

# 构建自定义镜像
docker build -t my-django-app:1.0 ./api

3.2 容器生命周期管理

# 创建并启动容器(后台运行)
docker run -d \
  --name postgres-db \
  -e POSTGRES_PASSWORD=password123 \
  -p 5432:5432 \
  -v pgdata:/var/lib/postgresql/data \
  --health-cmd "pg_isready -U postgres" \
  --health-interval 10s \
  --health-timeout 5s \
  --health-retries 5 \
  postgres:14-alpine

# 查看运行中容器
docker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}"

# 进入容器终端
docker exec -it postgres-db bash

# 查看容器日志(跟踪最新100行)
docker logs -f --tail 100 postgres-db

# 停止并删除容器
docker stop postgres-db && docker rm postgres-db

3.3 数据持久化方案对比

方案适用场景优点缺点
命名卷生产环境数据持久化生命周期独立,可命名,易管理需手动清理,跨主机迁移复杂
绑定挂载开发环境代码热更新直接映射宿主机目录,实时同步权限问题频发,依赖宿主机目录结构
tmpfs挂载临时缓存数据内存中存储,读写快,不持久化容器停止数据丢失
# 创建命名卷
docker volume create pgdata

# 查看卷详情
docker volume inspect pgdata

# 清理未使用卷
docker volume prune -f

四、Docker Compose编排实战:Django+PostgreSQL完整部署

4.1 项目结构与配置文件

docker-tutorial/
├── api/                  # Django应用目录
│   ├── Dockerfile        # 应用构建文件
│   ├── requirements.txt  # Python依赖
│   └── docker-entrypoint.sh # 启动脚本
├── docker-compose.yml    # 主编排文件
└── .env                  # 环境变量配置

4.2 核心配置文件详解

Dockerfile(api/Dockerfile):

FROM python:3.9-slim
LABEL maintainer="Docker Tutorial"
ENV PYTHONUNBUFFERED=1 \
    PIP_NO_CACHE_DIR=off \
    PIP_DISABLE_PIP_VERSION_CHECK=on

WORKDIR /app
COPY requirements.txt .
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
COPY . .

docker-compose.yml

version: '3.8'

services:
  db:
    image: postgres:14-alpine
    container_name: django-db
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD:-password123}
    ports:
      - "5432:5432"
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 10s
      timeout: 5s
      retries: 5
    networks:
      - app-network
    logging:
      driver: "json-file"
      options:
        max-file: "3"
        max-size: "100m"

  web:
    build: ./api
    container_name: django-web
    entrypoint: /app/docker-entrypoint.sh
    command: python manage.py runserver 0.0.0.0:8000
    restart: always
    environment:
      - DJANGO_SETTINGS_MODULE=core.settings
      - DATABASE_URL=postgres://postgres:${DB_PASSWORD:-password123}@db:5432/postgres
      - DJANGO_SUPERUSER_USERNAME=admin
      - DJANGO_SUPERUSER_PASSWORD=admin1234
    volumes:
      - ./api:/app
      - static_volume:/app/staticfiles
    ports:
      - "8000:8000"
    depends_on:
      db:
        condition: service_healthy
    networks:
      - app-network

volumes:
  pgdata:
  static_volume:

networks:
  app-network:
    driver: bridge

启动脚本(docker-entrypoint.sh):

#!/bin/sh
set -e

# 等待数据库就绪(增强版依赖检查)
until pg_isready -h db -U postgres -p 5432; do
  echo "Waiting for postgres database connection..."
  sleep 2
done

# 数据库迁移
python manage.py makemigrations
python manage.py migrate

# 创建超级用户(已存在则跳过)
python manage.py createsuperuser --noinput || true

# 收集静态文件
python manage.py collectstatic --noinput

# 执行传入的命令(如CMD指定的命令)
exec "$@"

4.3 一键部署与运维命令

# 克隆项目代码
git clone https://gitcode.com/gh_mirrors/do/docker-tutorial.git
cd docker-tutorial

# 创建环境变量文件
cat > .env << EOF
DB_PASSWORD=password123
DJANGO_DEBUG=False
EOF

# 构建并启动服务
docker compose up -d --build

# 查看服务状态
docker compose ps

# 查看应用日志
docker compose logs -f web

# 数据库备份
docker compose exec db pg_dump -U postgres postgres > backup.sql

# 扩展服务实例(需配置负载均衡)
docker compose up -d --scale web=3

# 优雅关闭服务
docker compose down -v --remove-orphans

五、进阶技巧:让Docker部署更稳定、更高效

5.1 健康检查与自动恢复

在docker-compose.yml中配置健康检查:

services:
  web:
    # ...其他配置
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000/health/"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 60s  # 启动宽限期
    restart: on-failure:3  # 失败3次后停止重启

5.2 环境变量与配置管理

多环境配置方案

docker-compose.yml        # 基础配置
docker-compose.dev.yml    # 开发环境覆盖配置
docker-compose.prod.yml   # 生产环境覆盖配置

开发环境启动:

docker compose -f docker-compose.yml -f docker-compose.dev.yml up -d

环境变量优先级(从高到低):

  1. 命令行传入 -e VAR=value
  2. docker-compose.yml中environment字段
  3. .env文件定义
  4. Dockerfile中ENV指令

5.3 容器网络高级配置

服务发现与通信

networks:
  frontend:
    driver: bridge
  backend:
    driver: overlay  # 跨主机网络

services:
  web:
    networks:
      - frontend
      - backend
  db:
    networks:
      - backend  # 仅后端网络可见,增强安全性

容器互联示例:

# 从web容器访问db容器
docker compose exec web curl -s db:5432

# 查看网络详情
docker network inspect docker-tutorial_backend

5.4 资源限制与性能优化

services:
  web:
    # ...其他配置
    deploy:
      resources:
        limits:
          cpus: '1'        # 最多使用1核CPU
          memory: 512M     # 最多使用512MB内存
        reservations:
          cpus: '0.5'      # 至少保证0.5核CPU
          memory: 256M     # 至少保证256MB内存
    pids_limit: 50         # 限制进程数,防止fork炸弹

六、监控与调试:容器问题排查指南

6.1 容器资源监控工具

Cadvisor容器监控

services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:v0.47.0
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker/:/var/lib/docker:ro
    ports:
      - "8080:8080"
    restart: always

访问http://localhost:8080查看容器CPU、内存、磁盘IO等实时数据。

6.2 常见问题排查流程

容器无法启动

# 1. 查看启动日志(最关键)
docker compose logs --no-log-prefix web

# 2. 检查配置文件
docker compose config

# 3. 手动运行容器排查
docker run --rm -it --entrypoint bash my-django-app:1.0

# 4. 检查端口占用
netstat -tulpn | grep 8000

数据库连接失败

# 1. 检查网络连通性
docker compose exec web ping db -c 3

# 2. 验证数据库凭证
docker compose exec web env | grep DATABASE_URL

# 3. 手动测试连接
docker compose exec web psql -h db -U postgres -d postgres

6.3 日志管理最佳实践

集中式日志配置

services:
  web:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"    # 单个日志文件大小
        max-file: "3"     # 最多保留3个文件
        tag: "{{.Name}}/{{.ID}}"  # 日志标签格式

高效日志查询

# 按级别过滤日志
docker compose logs web | grep -i error

# 查看指定时间段日志
docker compose logs --since 2025-01-01T08:00:00 web

# 导出日志到文件
docker compose logs --tail=1000 web > web-logs.txt

七、企业级最佳实践与注意事项

7.1 安全加固措施

  1. 使用非root用户运行容器
RUN addgroup --system app && adduser --system --group app
USER app
  1. 限制容器 capabilities
services:
  web:
    cap_drop:
      - ALL  # 移除所有 capabilities
    cap_add:
      - NET_BIND_SERVICE  # 仅添加必要能力
  1. 镜像安全扫描
docker scan my-django-app:1.0 --severity threshold=high

7.2 CI/CD集成建议

GitHub Actions自动部署

name: Docker Build & Deploy
on: [push]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
      
      - name: Build and push
        uses: docker/build-push-action@v5
        with:
          context: ./api
          push: false
          tags: my-django-app:latest
      
      - name: Deploy to server
        uses: appleboy/ssh-action@master
        with:
          host: ${{ secrets.HOST }}
          username: ${{ secrets.USERNAME }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /path/to/project
            git pull
            docker compose up -d --build

7.3 常见误区与避坑指南

  1. 依赖depends_on保证服务就绪: ❌ 错误:认为depends_on会等待服务"就绪" ✅ 正确:使用健康检查+启动脚本双重保障

  2. 忽视镜像体积优化: ❌ 错误:直接使用ubuntu基础镜像 ✅ 正确:使用alpine版本+多阶段构建减小体积

  3. 生产环境使用latest标签: ❌ 错误:image: postgres:latest ✅ 正确:指定具体版本号image: postgres:14.10-alpine

  4. 容器内存储持久数据: ❌ 错误:依赖容器文件系统存储重要数据 ✅ 正确:使用命名卷或外部存储服务

八、总结与进阶学习路径

通过本文学习,你已掌握Docker从基础到实战的核心技能,能够独立部署Django+PostgreSQL应用栈。建议继续深入以下方向:

  1. 容器编排进阶:Kubernetes基础与应用迁移
  2. 镜像仓库管理:Harbor私有仓库搭建与权限控制
  3. 微服务架构:使用Docker Compose构建多服务应用
  4. CI/CD流水线:实现从代码提交到自动部署的全流程

实用资源推荐

  • 官方文档:https://docs.docker.com/compose/compose-file/
  • 国内镜像站:https://mirrors.aliyun.com/docker-ce/linux/
  • 社区论坛:https://forums.docker.com/

最后,欢迎点赞收藏本文,关注作者获取更多Docker进阶教程!如有问题,可在项目仓库提交issue交流。

【免费下载链接】docker-tutorial Docker 基本教學 - 從無到有 Docker-Beginners-Guide 教你用 Docker 建立 Django + PostgreSQL 📝 【免费下载链接】docker-tutorial 项目地址: https://gitcode.com/gh_mirrors/do/docker-tutorial

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值