一份「从入门到实战」的完整通关笔记,涵盖核心基础命令、镜像构建、多容器编排、数据持久化、容器网络等核心技能。一条命令就能跑通的小实验贯穿始终,复制即可复现。
👉 关联文章|从传统Linux部署到容器化:实践对比与工程化指南(涵盖 Docker 安装与镜像加速配置)
文章目录
-
- [1. 环境准备](#1. 环境准备)
- [2. 核心概念速览](#2. 核心概念速览)
- [3. 基础命令实战](#3. 基础命令实战)
- [4. 镜像构建:Dockerfile 实战](#4. 镜像构建:Dockerfile 实战)
- [5. 多容器编排:Docker Compose](#5. 多容器编排:Docker Compose)
-
- 架构图
- [docker-compose.yml 配置](#docker-compose.yml 配置)
- [Compose 常用命令](#Compose 常用命令)
- [6. 数据持久化策略](#6. 数据持久化策略)
- [7. 网络配置详解](#7. 网络配置详解)
- [8. 安全最佳实践](#8. 安全最佳实践)
- [9. 故障排查指南](#9. 故障排查指南)
- [10. 生产环境部署](#10. 生产环境部署)
- 总结
- 推荐阅读
- 参考资料

1. 环境准备
安装方式选择
┌─────────────────┬─────────────────┬─────────────────┐
│ Linux │ Windows/Mac │ 云服务器 │
├─────────────────┼─────────────────┼─────────────────┤
│ 一键脚本安装 │ Docker Desktop │ 预装Docker │
│ 轻量级,性能好 │ 图形界面友好 │ 开箱即用 │
└─────────────────┴─────────────────┴─────────────────┘
bash
# Linux 一键安装
curl -fsSL https://get.docker.com | sh
# 验证安装
docker version && docker-compose version
💡 为什么推荐使用官方安装脚本?
官方脚本会自动检测系统版本,选择最适合的安装方式,并配置好必要的系统服务。相比手动安装,成功率更高,且会自动处理依赖关系。
2. 核心概念速览
Docker 三大核心组件
┌─────────────────────────────────────────────────────┐
│ │
│ 📦 镜像(Image) 🏃 容器(Container) 🏪 仓库 │
│ ┌─────────────┐ ┌─────────────────┐ (Registry) │
│ │ 只读模板 │──▶│ 运行实例 │ │
│ │ 文件系统 │ │ 隔离环境 │ Docker Hub │
│ │ 应用配置 │ │ 可读写层 │ 私有仓库 │
│ └─────────────┘ └─────────────────┘ │
│ │
└─────────────────────────────────────────────────────┘
3. 基础命令实战
核心命令速查表
操作类型 | 命令模板 | 实战示例 |
---|---|---|
镜像管理 | docker pull [镜像名] |
docker pull nginx:alpine |
容器运行 | docker run [选项] [镜像] |
docker run -d --name web -p 8080:80 nginx:alpine |
容器管理 | docker ps -a |
查看所有容器状态 |
日志查看 | docker logs -f [容器名] |
docker logs -f --tail 100 web |
进入容器 | docker exec -it [容器] sh |
docker exec -it web sh |
资源清理 | docker system prune -af |
清理所有未使用资源 |
一键实验:启动你的第一个容器
bash
# 拉取并运行 Nginx 容器
docker run -d --name my-nginx -p 8080:80 nginx:alpine
# 查看运行状态
docker ps
# 访问测试
curl http://localhost:8080
💡 命令参数详解
-d
: 后台运行(detached mode)--name
: 指定容器名称,便于管理-p 8080:80
: 端口映射,将主机8080端口映射到容器80端口nginx:alpine
: 使用轻量级的Alpine Linux版本
4. 镜像构建:Dockerfile 实战
项目结构
demo/
├── app.py # Flask 应用
├── requirements.txt # Python 依赖
├── Dockerfile # 镜像构建文件
└── .dockerignore # 忽略文件配置
Flask 应用代码
python
from flask import Flask
import os
app = Flask(__name__)
@app.route('/')
def hello():
return f"Hello Docker! Host: {os.uname().nodename}"
@app.route('/health')
def health():
return {"status": "healthy", "version": "1.0"}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
多阶段构建 Dockerfile
dockerfile
# ==========================================
# 阶段 1: 构建阶段 (Builder Stage)
# ==========================================
FROM python:3.11-slim as builder
WORKDIR /app
# 复制依赖文件
COPY requirements.txt .
# 安装依赖到用户目录
RUN pip install --no-cache-dir --user -r requirements.txt
# ==========================================
# 阶段 2: 运行阶段 (Runtime Stage)
# ==========================================
FROM python:3.11-slim
# 创建非root用户
RUN useradd --create-home --shell /bin/bash app
WORKDIR /app
# 从构建阶段复制依赖
COPY --from=builder /root/.local /home/app/.local
# 设置环境变量
ENV PATH=/home/app/.local/bin:$PATH
ENV PYTHONPATH=/app
# 复制应用代码
COPY --chown=app:app app.py .
# 切换到非root用户
USER app
# 健康检查
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost:5000/health || exit 1
EXPOSE 5000
CMD ["python", "app.py"]
构建和运行
bash
# 构建镜像
docker build -t flask-demo:1.0 .
# 运行容器
docker run -d --name flask-app -p 5000:5000 flask-demo:1.0
# 测试应用
curl http://localhost:5000
5. 多容器编排:Docker Compose
架构图
┌─────────────────────────────────────────────────────┐
│ Nginx (反向代理) │
│ :80 │
└─────────────────┬───────────────────────────────────┘
│
┌─────────────▼─────────────┐
│ Flask 应用 │
│ :5000 │
└─────────────┬─────────────┘
│
┌─────────────▼─────────────┐
│ Redis 缓存 │
│ :6379 │
└───────────────────────────┘
docker-compose.yml 配置
yaml
version: "3.9"
services:
# Flask 应用服务
flask:
build: .
image: flask-demo:1.0
container_name: flask-app
networks:
- backend
volumes:
- ./logs:/app/logs
environment:
- FLASK_ENV=production
- REDIS_URL=redis://redis:6379
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
restart: unless-stopped
# Redis 缓存服务
redis:
image: redis:7-alpine
container_name: redis-cache
networks:
- backend
volumes:
- redis_data:/data
command: redis-server --appendonly yes
restart: unless-stopped
# Nginx 反向代理
nginx:
image: nginx:alpine
container_name: nginx-proxy
ports:
- "80:80"
networks:
- backend
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
depends_on:
flask:
condition: service_healthy
restart: unless-stopped
networks:
backend:
driver: bridge
volumes:
redis_data:
driver: local
Compose 常用命令
bash
# 启动所有服务
docker-compose up -d
# 查看服务状态
docker-compose ps
# 查看日志
docker-compose logs -f
# 扩容服务
docker-compose up -d --scale flask=3
# 停止并清理
docker-compose down -v
6. 数据持久化策略
存储方式对比
┌─────────────────┬─────────────────┬─────────────────┐
│ 绑定挂载 │ 数据卷 │ 临时文件系统 │
│ (Bind Mount) │ (Volume) │ (tmpfs) │
├─────────────────┼─────────────────┼─────────────────┤
│ 主机路径直接挂载 │ Docker统一管理 │ 内存中存储 │
│ 开发环境推荐 │ 生产环境推荐 │ 临时数据推荐 │
│ 性能好,易调试 │ 安全性高,可备份 │ 速度快,重启丢失│
└─────────────────┴─────────────────┴─────────────────┘
实战示例
bash
# 创建命名卷
docker volume create mysql-data
# 使用绑定挂载(开发环境)
docker run -d -v $(pwd)/logs:/app/logs nginx:alpine
# 使用数据卷(生产环境)
docker run -d -v mysql-data:/var/lib/mysql mysql:8.0
# 只读挂载配置文件
docker run -d -v $(pwd)/nginx.conf:/etc/nginx/nginx.conf:ro nginx:alpine
# 备份数据卷
docker run --rm -v mysql-data:/data -v $(pwd):/backup alpine \
tar czf /backup/mysql-backup.tar.gz -C /data .
7. 网络配置详解
网络类型图解
Host Network 容器直接使用主机网络 Bridge Network 默认隔离网络 Overlay Network 跨主机容器通信 None Network 完全网络隔离
网络管理命令
bash
# 查看网络列表
docker network ls
# 创建自定义网络
docker network create --driver bridge my-network
# 容器连接到网络
docker network connect my-network container-name
# 查看网络详情
docker network inspect my-network
# 容器间通信测试
docker exec -it container1 ping container2
8. 安全最佳实践
安全检查清单
🔒 Docker 安全检查清单
┌─────────────────────────────────────────────────────┐
│ ✅ 使用官方或可信镜像源 │
│ ✅ 定期更新基础镜像 │
│ ✅ 使用非root用户运行容器 │
│ ✅ 限制容器资源使用 │
│ ✅ 扫描镜像安全漏洞 │
│ ✅ 使用secrets管理敏感信息 │
│ ✅ 启用Docker Content Trust │
│ ✅ 配置适当的网络策略 │
└─────────────────────────────────────────────────────┘
安全配置示例
bash
# 限制容器资源
docker run -d --memory="512m" --cpus="1.0" nginx:alpine
# 只读文件系统
docker run -d --read-only --tmpfs /tmp nginx:alpine
# 删除危险权限
docker run -d --cap-drop=ALL --cap-add=NET_BIND_SERVICE nginx:alpine
# 扫描镜像漏洞
docker scan nginx:alpine
# 使用非root用户
docker run -d --user 1000:1000 nginx:alpine
9. 故障排查指南
常见问题诊断流程
否 是 是 否 否 是 容器启动失败 检查镜像是否存在 拉取正确镜像 检查端口是否冲突 更换端口或停止冲突服务 检查资源是否充足 释放系统资源 查看详细错误日志
调试命令工具箱
bash
# 查看容器详细信息
docker inspect container-name
# 实时监控资源使用
docker stats
# 查看容器进程
docker top container-name
# 查看端口映射
docker port container-name
# 进入容器调试
docker exec -it container-name /bin/bash
# 查看镜像构建历史
docker history image-name
10. 生产环境部署
部署检查清单
📋 生产环境部署清单
- 配置健康检查
- 设置资源限制
- 配置日志收集
- 设置重启策略
- 配置监控告警
- 准备回滚方案
- 配置负载均衡
- 设置数据备份
一键部署脚本
🚀 复制部署脚本
bash
#!/bin/bash
# 生产环境一键部署脚本
echo "🚀 开始部署 Docker 应用..."
# 拉取最新代码
git pull origin main
# 构建新镜像
docker build -t myapp:$(git rev-parse --short HEAD) .
# 停止旧容器
docker-compose down
# 启动新服务
docker-compose up -d
# 等待服务启动
sleep 10
# 健康检查
if curl -f http://localhost/health; then
echo "✅ 部署成功!"
else
echo "❌ 部署失败,正在回滚..."
docker-compose down
docker-compose up -d
fi
总结
本文从 Docker 基础概念到生产环境部署,提供了完整的学习路径。通过实战示例和可复制的命令,帮助你快速掌握容器化技术的核心技能。
🎯 学习成果检验
完成本教程后,你应该能够:
- 熟练使用 Docker 基础命令
- 编写高质量的 Dockerfile
- 使用 docker-compose 编排多容器应用
- 配置数据持久化和网络
- 应用安全最佳实践
- 排查常见问题
- 部署生产环境应用
推荐阅读
参考资料
🎉 恭喜完成 Docker 学习之旅!