2025最完整Docker零基础实战教程:从环境搭建到Django+PostgreSQL部署
开篇:你还在为环境配置抓狂吗?
作为开发者,你是否经历过这些场景:新同事花3天配置开发环境仍无法运行项目?本地调试正常的代码部署到服务器却频繁报错?Docker容器内无法连接本地数据库?本文将通过7大模块+32个实操案例,带你从Docker零基础成长为实战专家,最终部署一个完整的Django+PostgreSQL应用栈。读完本文你将掌握:
- Docker核心概念与高效命令体系
- 容器网络/数据卷/环境变量深度配置
- Docker Compose多服务编排实战
- 进阶技巧:健康检查/Entrypoint/Profiles
- 监控与调试容器的5种方案
- 企业级部署避坑指南
一、Docker核心原理:为什么它能解决环境一致性问题?
1.1 容器与虚拟机的本质区别
传统虚拟机(VM)需要模拟完整操作系统,而Docker容器共享宿主机内核,仅包含应用及其依赖,启动速度提升10倍以上:
| 特性 | 虚拟机(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 系统要求与兼容性检查
| 操作系统 | 支持版本 | 安装方式 |
|---|---|---|
| Windows | 10 专业版/企业版(Hyper-V) | Docker Desktop |
| macOS | 10.15+ | Docker Desktop |
| Linux | Ubuntu 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
环境变量优先级(从高到低):
- 命令行传入
-e VAR=value - docker-compose.yml中
environment字段 - .env文件定义
- 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 安全加固措施
- 使用非root用户运行容器:
RUN addgroup --system app && adduser --system --group app
USER app
- 限制容器 capabilities:
services:
web:
cap_drop:
- ALL # 移除所有 capabilities
cap_add:
- NET_BIND_SERVICE # 仅添加必要能力
- 镜像安全扫描:
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 常见误区与避坑指南
-
依赖depends_on保证服务就绪: ❌ 错误:认为depends_on会等待服务"就绪" ✅ 正确:使用健康检查+启动脚本双重保障
-
忽视镜像体积优化: ❌ 错误:直接使用ubuntu基础镜像 ✅ 正确:使用alpine版本+多阶段构建减小体积
-
生产环境使用latest标签: ❌ 错误:image: postgres:latest ✅ 正确:指定具体版本号image: postgres:14.10-alpine
-
容器内存储持久数据: ❌ 错误:依赖容器文件系统存储重要数据 ✅ 正确:使用命名卷或外部存储服务
八、总结与进阶学习路径
通过本文学习,你已掌握Docker从基础到实战的核心技能,能够独立部署Django+PostgreSQL应用栈。建议继续深入以下方向:
- 容器编排进阶:Kubernetes基础与应用迁移
- 镜像仓库管理:Harbor私有仓库搭建与权限控制
- 微服务架构:使用Docker Compose构建多服务应用
- CI/CD流水线:实现从代码提交到自动部署的全流程
实用资源推荐:
- 官方文档:https://docs.docker.com/compose/compose-file/
- 国内镜像站:https://mirrors.aliyun.com/docker-ce/linux/
- 社区论坛:https://forums.docker.com/
最后,欢迎点赞收藏本文,关注作者获取更多Docker进阶教程!如有问题,可在项目仓库提交issue交流。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



