Docker 动手教程重装上阵!
Docker 动手教程
从零开始掌握 Docker 容器技术的完整实战指南
• 地址: https://github.com/ForceInjection/Docker-hands-on-course• Web PPT: https://github.com/ForceInjection/Docker-hands-on-course/blob/master/PPT/Docker%20%E5%8A%A8%E6%89%8B%E6%95%99%E7%A8%8B/index.html

1. 教程概述
本教程将带您从 Docker 基础概念开始,逐步掌握容器技术的核心技能。通过理论学习与实践操作相结合的方式,帮助您快速成为 Docker 技术专家。
1.1 学习目标
• ✅ 深入理解 Docker 核心概念和架构 • ✅ 熟练掌握 Docker 环境安装和配置 • ✅ 学会镜像拉取、运行和管理 • ✅ 掌握自定义镜像构建和发布 • ✅ 精通 Docker 常用命令和最佳实践 • ✅ 具备容器化应用的开发和部署能力
1.2 学习路径
1.3 预计学习时间
• 总学习时间:6-8 小时 • 理论学习:2-3 小时 • 实践操作:4-5 小时 • 建议学习周期:1-2 周
2. Docker 基础概念
📂 详细内容:01-Docker-Introduction
2.1 🏗️ 传统基础设施面临的挑战
2.1.1 环境一致性问题
• "在我机器上能运行"综合症:开发、测试、生产环境差异导致的部署问题 • 依赖管理复杂:不同应用需要不同版本的运行时、库和系统配置 • 环境配置漂移:手动配置导致的环境不一致性 • 版本冲突:多个应用共享系统资源时的依赖版本冲突
2.1.2 资源利用率低
• 虚拟机开销大:每个 VM 需要完整的操作系统,资源消耗高 • 硬件资源浪费:静态资源分配导致的资源闲置 • 启动时间长:虚拟机启动需要几分钟时间 • 管理复杂:需要维护多个完整的操作系统
2.1.3 部署和扩展困难
• 部署流程复杂:需要手动配置服务器环境 • 扩展性差:难以快速响应负载变化 • 回滚困难:版本回退复杂且风险高 • 环境重现困难:生产问题难以在开发环境中重现
2.2 🚀 为什么选择 Docker?
2.2.1 解决核心痛点
1. 环境标准化:"Build once, run anywhere" - 一次构建,到处运行 2. 轻量级虚拟化:共享主机内核,资源消耗极低 3. 快速部署:秒级启动,支持快速扩缩容 4. 版本控制:镜像分层存储,支持版本管理和回滚
2.2.2 Docker 技术优势对比
2.2.3 Docker 的核心优势
🔄 一致性保证:
• 开发环境一致性:消除"在我机器上能运行"的问题 • 部署环境标准化:确保开发、测试、生产环境完全一致 • 依赖管理简化:将应用及其依赖打包在一起
⚡ 高效资源利用:
• 轻量级:容器共享主机内核,开销极小 • 快速启动:秒级启动时间,支持快速扩缩容 • 高密度部署:单台主机可运行更多应用实例
🚀 敏捷开发部署:
• CI/CD 友好:完美集成持续集成和持续部署流程 • 微服务架构:天然支持微服务的独立部署和扩展 • 版本控制:镜像版本化管理,支持快速回滚
🌐 跨平台兼容:
• 平台无关:支持 Linux、Windows、macOS • 云原生:完美适配各大云平台 • 混合云部署:支持本地和云端的无缝迁移
2.3 🏛️ Docker 架构深度解析
2.3.1 核心组件架构图
2.3.2 🔧 Docker Daemon (守护进程)
功能职责:
• 监听 Docker API 请求 • 管理 Docker 对象(镜像、容器、网络、数据卷) • 与其他 Docker 守护进程通信 • 处理镜像构建和容器运行
运行模式:
• 作为系统服务在后台运行 • 通过 Unix socket 或网络接口提供 API • 支持集群模式(Docker Swarm)
2.3.3 💻 Docker Client (客户端)
主要特点:
• 用户与 Docker 交互的主要方式 • 通过 REST API 与 Docker Daemon 通信 • 支持本地和远程 Docker 主机连接
常用客户端:
• dockerCLI 命令行工具• Docker Desktop 图形界面 • 第三方管理工具(Portainer、Rancher 等)
2.3.4 📦 Docker Images (镜像)
核心概念:
• 只读模板:用于创建 Docker 容器 • 分层存储:采用 Union FS 技术,支持增量更新 • 版本管理:通过标签(tag)管理不同版本
镜像分层结构:
┌─────────────────┐ ← 应用层 (可写)
├─────────────────┤ ← 应用代码层
├─────────────────┤ ← 依赖库层
├─────────────────┤ ← 运行时层
└─────────────────┘ ← 基础系统层镜像命名规范:
[registry]/[namespace]/[repository]:[tag]
示例:
- nginx:latest # 官方镜像
- mysql:8.0 # 官方镜像带版本
- stacksimplify/app:1.0.0 # 用户镜像
- registry.example.com/app:v1.0 # 私有仓库镜像2.3.5 🏃 Docker Containers (容器)
定义:
• 镜像的运行实例 • 包含应用程序及其所有依赖 • 提供隔离的运行环境
容器生命周期:
1. Created - 已创建但未启动 2. Running - 正在运行 3. Paused - 已暂停 4. Stopped - 已停止 5. Deleted - 已删除
容器特性:
• 进程级隔离:每个容器运行在独立的进程空间 • 资源限制:可以限制 CPU、内存、网络等资源使用 • 文件系统隔离:容器有自己的文件系统视图 • 网络隔离:容器可以有独立的网络配置
2.3.6 🏪 Docker Registry (镜像仓库)
Docker Hub(官方仓库):
• 全球最大的容器镜像仓库 • 提供官方和社区镜像 • 支持公有和私有仓库 • 地址:https://hub.docker.com/
私有仓库选项:
• Docker Registry(开源) • Harbor(企业级) • AWS ECR、Azure ACR、Google GCR • 阿里云、腾讯云等国内云服务商
2.3.7 🔗 Docker Networks (网络)
网络类型:
• bridge:默认网络模式,容器间可通信 • host:容器使用主机网络 • none:容器无网络连接 • overlay:跨主机容器通信(Swarm 模式)
2.3.8 💾 Docker Volumes (数据卷)
数据持久化方案:
• Volumes:Docker 管理的数据卷 • Bind mounts:绑定主机目录 • tmpfs mounts:内存文件系统(临时)
2.4 📋 核心概念总结
• Docker Images (镜像):只读模板,采用分层存储,用于创建容器 • Docker Containers (容器):镜像的运行实例,提供隔离的应用运行环境 • Dockerfile:构建镜像的指令文件,定义镜像构建步骤 • Docker Registry:镜像仓库,存储和分发 Docker 镜像 • Docker Daemon:Docker 守护进程,管理所有 Docker 对象 • Docker Client:用户与 Docker 交互的客户端工具
2.2 💡 实践建议
1. 理解容器 vs 虚拟机:重点掌握两者的区别和适用场景 2. 熟悉架构组件:了解各组件的职责和交互方式 3. 掌握核心术语:为后续学习打好基础
3. 环境安装配置
📂 详细内容:02-Docker-Installation
3.1 🎯 核心学习点
3.1.1 系统要求检查
macOS 要求:
• macOS 11.0+ (Big Sur 或更高版本) • 4GB+ RAM (推荐 8GB+) • 4GB+ 磁盘空间
Windows 要求:
• Windows 10 64-bit Pro/Enterprise/Education (版本 1903+) 或 Windows 11 • 启用 Hyper-V 和 WSL 2 • 4GB+ RAM (推荐 8GB+)
Linux 要求:
• 内核版本 3.10+ (推荐 4.0+) • 支持 overlay2 存储驱动 • 64位架构 (x86_64/amd64)
3.1.2 快速安装指南
macOS 安装(推荐):
# 方法1: 官方安装包
# 下载 Docker Desktop for Mac
# 拖拽到 Applications 文件夹
# 方法2: Homebrew
brew install --cask dockerUbuntu/Debian 安装:
# 添加 Docker 官方仓库
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 安装 Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
# 启动服务
sudo systemctl start docker
sudo systemctl enable docker
# 添加用户到 docker 组
sudo usermod -aG docker $USER3.1.3 安装验证
# 检查版本
docker --version
docker-compose --version
# 运行测试容器
docker run hello-world
# 查看系统信息
docker info3.2 💡 实践建议
1. 选择合适的安装方式:Docker Desktop 适合开发,Docker Engine 适合服务器 2. 配置镜像加速器:提升国内用户的镜像拉取速度 3. 验证安装成功:确保所有组件正常工作
4. 镜像拉取运行
📂 详细内容:03-Pull-from-DockerHub-and-Run-Docker-Images
4.1 🎯 核心学习点
4.1.1 Docker Hub 基础
镜像命名规范:
[registry]/[namespace]/[repository]:[tag]
示例:
- nginx:latest # 官方镜像
- mysql:8.0 # 官方镜像带版本
- stacksimplify/app:1.0.0 # 用户镜像4.1.2 镜像操作实践
搜索和拉取镜像:
# 搜索镜像
docker search nginx
docker search --limit 5 mysql
# 拉取镜像
docker pull nginx:latest
docker pull mysql:8.0
docker pull ubuntu:20.04
# 查看本地镜像
docker images
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"4.1.3 容器运行管理
基础运行命令:
# 运行容器
docker run nginx
docker run -d nginx # 后台运行
docker run -d -p 8080:80 nginx # 端口映射
docker run -d -p 8080:80 --name web nginx # 指定名称
# 交互式运行
docker run -it ubuntu:20.04 /bin/bash
docker run -it --rm alpine:latest sh # 退出后自动删除容器生命周期管理:
# 查看容器
docker ps # 运行中的容器
docker ps -a # 所有容器
# 容器控制
docker stop container_name # 停止容器
docker start container_name # 启动容器
docker restart container_name # 重启容器
# 容器清理
docker rm container_name # 删除容器
docker rm -f container_name # 强制删除
docker container prune # 清理停止的容器4.1.4 容器交互调试
# 进入容器
docker exec -it container_name /bin/bash
docker exec -it container_name /bin/sh
# 查看容器日志
docker logs container_name
docker logs -f container_name # 实时查看
docker logs --tail 50 container_name # 查看最后50行
# 文件传输
docker cp file.txt container_name:/path/
docker cp container_name:/path/file.txt ./4.2 💡 实践建议
1. 熟练掌握基础命令:run, ps, stop, start, rm 2. 理解端口映射:-p 参数的使用方法 3. 掌握容器调试:exec, logs 命令的使用
5. 自定义镜像构建
📂 详细内容:04-Build-new-Docker-Image-and-Run-and-Push-to-DockerHub
5.1 🎯 核心学习点
5.1.1 Dockerfile 基础
常用指令说明:
# 基础镜像
FROM nginx:alpine
# 维护者信息
LABEL maintainer="[email protected]"
# 工作目录
WORKDIR /usr/share/nginx/html
# 复制文件
COPY index.html .
COPY ./static ./static
# 添加文件(支持URL和压缩包)
ADD app.tar.gz /app/
# 运行命令
RUN apk add --no-cache curl
# 环境变量
ENV NODE_ENV=production
ENV PORT=3000
# 暴露端口
EXPOSE80443
# 数据卷
VOLUME ["/data"]
# 启动命令
CMD ["nginx", "-g", "daemon off;"]5.1.2 实战:构建 Web 应用镜像
1. 创建项目结构:
mkdir my-web-app && cd my-web-app2. 创建自定义网页:
<!-- index.html -->
<!DOCTYPE html>
<html>
<head>
<title>我的 Docker Web 应用</title>
<style>
body { font-family: Arial; text-align: center; margin-top: 50px; }
.container { max-width: 600px; margin: 0 auto; }
.highlight { color: #0066cc; }
</style>
</head>
<body>
<divclass="container">
<h1>🐳 欢迎使用 Docker!</h1>
<p>这是我的第一个 <spanclass="highlight">自定义 Docker 镜像</span></p>
<p>构建时间: <spanid="buildTime"></span></p>
</div>
<script>
document.getElementById('buildTime').textContent = newDate().toLocaleString();
</script>
</body>
</html>3. 编写 Dockerfile:
# 使用官方 Nginx 镜像作为基础
FROM nginx:alpine
# 添加维护者信息
LABEL maintainer="[email protected]"
LABEL description="My first custom Docker image"
# 复制自定义网页到 Nginx 默认目录
COPY index.html /usr/share/nginx/html/
# 暴露 80 端口
EXPOSE80
# 启动 Nginx
CMD ["nginx", "-g", "daemon off;"]5.1.3 镜像构建和测试
# 构建镜像
docker build -t my-web-app:v1.0 .
# 查看构建的镜像
docker images my-web-app
# 运行容器测试
docker run -d -p 8080:80 --name my-app my-web-app:v1.0
# 测试访问
curl http://localhost:8080
# 或浏览器访问 http://localhost:8080
# 查看容器状态
docker ps
docker logs my-app5.1.4 镜像发布到 Docker Hub
# 登录 Docker Hub
docker login
# 为镜像添加标签(替换 your-username)
docker tag my-web-app:v1.0 your-username/my-web-app:v1.0
docker tag my-web-app:v1.0 your-username/my-web-app:latest
# 推送镜像
docker push your-username/my-web-app:v1.0
docker push your-username/my-web-app:latest
# 验证发布成功
# 访问 https://hub.docker.com/r/your-username/my-web-app5.1.5 镜像优化技巧
多阶段构建示例:
# 构建阶段
FROM node:16-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE80
CMD ["nginx", "-g", "daemon off;"]5.2 💡 实践建议
1. 掌握 Dockerfile 语法:重点理解 FROM, COPY, RUN, CMD 指令 2. 优化镜像大小:使用 alpine 基础镜像,清理缓存文件 3. 版本管理策略:合理使用标签进行版本控制
6. 核心命令掌握
📂 详细内容:05-Essential-Docker-Commands
6.1 🎯 核心学习点
6.1.1 容器管理命令
基础操作:
# 容器查看
docker ps # 运行中的容器
docker ps -a # 所有容器
docker ps -q # 仅显示容器ID
# 容器控制
docker stop container_id # 优雅停止
docker kill container_id # 强制停止
docker start container_id # 启动容器
docker restart container_id # 重启容器
docker pause container_id # 暂停容器
docker unpause container_id # 恢复容器
# 容器清理
docker rm container_id # 删除容器
docker rm -f container_id # 强制删除
docker container prune # 清理停止的容器容器交互:
# 进入容器
docker exec -it container_name /bin/bash
docker exec -it container_name /bin/sh
# 执行命令
docker exec container_name ls -la
docker exec container_name cat /etc/hosts
# 文件传输
docker cp ./file.txt container_name:/path/
docker cp container_name:/path/file.txt ./
# 查看日志
docker logs container_name
docker logs -f container_name # 实时查看
docker logs --tail 100 container_name # 最后100行6.1.2 镜像管理命令
# 镜像查看
docker images # 所有镜像
docker images -q # 仅显示镜像ID
docker images --format "table {{.Repository}}\t{{.Tag}}\t{{.Size}}"
# 镜像操作
docker pull image_name:tag # 拉取镜像
docker push image_name:tag # 推送镜像
docker rmi image_id # 删除镜像
docker rmi -f image_id # 强制删除
# 镜像构建
docker build -t image_name:tag .
docker build --no-cache -t image_name:tag .
docker tag source_image target_image
# 镜像清理
docker image prune # 删除悬空镜像
docker image prune -a # 删除未使用镜像6.1.3 系统管理命令
# 系统信息
docker info # 系统详细信息
docker version # 版本信息
docker system df# 磁盘使用情况
# 系统清理
docker system prune # 清理未使用资源
docker system prune -a # 深度清理
docker system prune --volumes # 包括数据卷清理
# 资源监控
docker stats # 实时资源使用
docker stats container_name # 特定容器资源使用
docker top container_name # 容器进程信息6.1.4 网络和存储命令
网络管理:
# 网络操作
docker network ls# 列出网络
docker network create mynet # 创建网络
docker network inspect bridge # 查看网络详情
docker network connect mynet container_name # 连接网络
docker network disconnect mynet container_name # 断开网络数据卷管理:
# 数据卷操作
docker volume ls# 列出数据卷
docker volume create myvolume # 创建数据卷
docker volume inspect myvolume # 查看数据卷详情
docker volume rm myvolume # 删除数据卷
docker volume prune # 清理未使用数据卷6.1.5 实用技巧和最佳实践
批量操作:
# 停止所有容器
docker stop $(docker ps -q)
# 删除所有停止的容器
docker rm $(docker ps -aq)
# 删除所有镜像
docker rmi $(docker images -q)
# 一键清理系统
docker system prune -a --volumes容器运行技巧:
# 环境变量
docker run -e NODE_ENV=production app:latest
docker run --env-file .env app:latest
# 数据卷挂载
docker run -v /host/path:/container/path app:latest
docker run -v myvolume:/data app:latest
# 网络配置
docker run --network mynet app:latest
docker run -p 8080:80 app:latest
# 资源限制
docker run -m 512m --cpus="1.5" app:latest6.2 💡 实践建议
1. 熟练掌握基础命令:ps, run, stop, rm, images, rmi 2. 学会批量操作:提高工作效率 3. 掌握调试技巧:logs, exec, inspect 命令的使用 4. 定期清理资源:避免磁盘空间不足
7. 学习资源
7.1 📚 官方文档
• Docker 官方文档 • Docker Hub • Dockerfile 参考 • Docker Compose 文档
7.2 🎯 实践项目建议
1. Web 应用容器化:将现有 Web 应用打包成 Docker 镜像 2. 微服务架构:使用 Docker Compose 部署多服务应用 3. CI/CD 集成:在持续集成流程中使用 Docker 4. 开发环境标准化:为团队创建统一的开发环境
7.3 🛠️ 推荐工具
• Docker Desktop:图形化管理界面 • Portainer:Web 端容器管理 • Docker Compose:多容器应用编排 • Watchtower:自动更新容器镜像
8. 常见问题
8.1 ❓ 安装相关
Q: Docker Desktop 启动失败怎么办?
A: 检查系统要求,确保启用虚拟化功能,重启 Docker 服务。
Q: 镜像拉取速度慢怎么办?
A: 配置国内镜像加速器,如阿里云、腾讯云等。
8.2 ❓ 使用相关
Q: 容器无法访问怎么办?
A: 检查端口映射配置,确保防火墙设置正确。
Q: 磁盘空间不足怎么办?
A: 定期清理未使用的镜像、容器和数据卷。
Q: 容器内时间不正确怎么办?
A: 挂载主机时区文件:-v /etc/localtime:/etc/localtime:ro
8.3 ❓ 性能优化
Q: 如何减小镜像大小?
A: 使用 alpine 基础镜像,多阶段构建,清理缓存文件。
Q: 如何提高容器启动速度?
A: 优化 Dockerfile,减少层数,使用镜像缓存。