Docker 从入门到精通:完整通关笔记

一份「从入门到实战」的完整通关笔记,涵盖核心基础命令、镜像构建、多容器编排、数据持久化、容器网络等核心技能。一条命令就能跑通的小实验贯穿始终,复制即可复现。

👉 关联文章|从传统Linux部署到容器化:实践对比与工程化指南(涵盖 Docker 安装与镜像加速配置)

文章目录

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 学习之旅!

相关推荐
jiajixi4 小时前
go-swagger学习笔记
笔记·学习·golang
聪明的笨猪猪4 小时前
Java Spring “AOP” 面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
❀͜͡傀儡师5 小时前
使用docker 安装dragonfly带配置文件(x86和arm)版本
运维·docker·容器
程序员东岸6 小时前
学完顺序表后,用 C 语言写了一个通讯录
数据结构·笔记·学习
东方芷兰7 小时前
LLM 笔记 —— 08 Embeddings(One-hot、Word、Word2Vec、Glove、FastText)
人工智能·笔记·神经网络·语言模型·自然语言处理·word·word2vec
li星野8 小时前
打工人日报#20251010
笔记·程序人生·fpga开发·学习方法
聪明的笨猪猪8 小时前
Java Redis “Sentinel(哨兵)与集群”面试清单(含超通俗生活案例与深度理解)
java·经验分享·笔记·面试
_BugMan8 小时前
【k8s】基础概念+下载安装教程
容器·rpc·kubernetes
Mr. Cao code8 小时前
Dockerfile 指令详解与实战指南
linux·运维·ubuntu·docker·容器