当前内容已经是 Markdown 格式,若要优化,可在一些细节上调整,如部分代码块格式、表格样式等,使其更规范易读。

一、前言:为什么多数人学 Docker 会走弯路?

新手学 Docker 常陷入两个误区:要么死记硬背命令却不懂原理,要么沉迷底层源码忽略实操。其实 Docker 的核心是 “用起来”—— 本文结合 100 + 实操踩坑经验,整理出可落地的 3 天学习路径,配合高频命令速查表和实战案例,让你避开 90% 的无效学习。

二、Day1:基础筑基 —— 搞定环境与核心概念(2 小时通关)

1. 环境搭建:3 大系统避坑指南

环境是入门第一道坎,不同系统适配方案不同,直接照搬官方文档易踩坑:

系统 核心问题 解决方案(附命令)
Ubuntu 依赖包找不到(unable to locate package) 更换阿里云源 + 强制更新sudo sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list<br>sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io
Windows 10 Home 虚拟化未启用导致安装失败 1. 管理员 PowerShell 执行:wsl --install2. BIOS 开启 VT-x/AMD-V 虚拟化
macOS 与 VirtualBox 冲突启动失败 卸载 VirtualBox + 清理残留sudo rm -rf /Applications/VirtualBox.app

验证技巧:安装后执行bash

  1. docker run hello-world

,出现 “Hello from Docker!” 即成功(国内用户先配镜像源,见下文)

2. 核心概念:3 分钟吃透 3 大组件

不用死记定义,用 “手机应用” 类比瞬间理解:

  • 镜像(Image):≈微信安装包(只读模板,含代码 + 依赖)✅ 关键特性:分层存储(复用公共层,如多个 Java 镜像共享 JDK 层)
  • 容器(Container):≈运行中的微信(镜像的可运行实例)✅ 核心技术:Linux Namespaces(进程隔离)+ cgroups(资源限制)
  • 仓库(Registry):≈应用商店(存储镜像)✅ 国内优选:阿里云镜像仓库(https://xxxx.mirror.aliyuncs.com,需自己注册获取)

配置国内镜像源(解决拉取慢问题):

创建/etc/docker/daemon.json(Linux/macOS)或在 Docker Desktop 设置中添加:json

  1. { "registry-mirrors": ["https://docker.registry.cyou", "https://dockercf.jsdelivr.fyi"] }

重启服务:bash

  1. sudo systemctl restart docker

三、Day2:实操突破 —— 高频命令与镜像构建(4 小时实战)

1. 命令速查表:只记 20 个够用 90% 场景

场景分类 核心命令(附示例) 关键参数说明
镜像操作 拉取:docker pull redis:7.0查看:docker images删除:docker rmi redis:7.0 :7.0指定版本,无则拉 latest
容器操作 启动:docker run -d -p 6379:6379 --name myredis redis:7.0进入:docker exec -it myredis /bin/bash停止:docker stop myredis -d后台运行,-p端口映射
批量管理 清理停止容器:docker rm $(docker ps -aq)删除无用镜像:docker image prune -a -aq列出所有容器 ID,-a删除无标签镜像

2. Dockerfile:从零构建自定义镜像(实战案例)

以 Node.js 应用为例,写一个生产级 Dockerfile(附优化技巧):dockerfile

  1. # 阶段1:构建依赖(多阶段构建减小体积)
  2. FROM node:18-alpine AS builder
  3. WORKDIR /app
  4. COPY package.json package-lock.json ./
  5. # 无缓存安装依赖(避免镜像臃肿)
  6. RUN npm install --no-cache
  7. # 阶段2:生产环境
  8. FROM node:18-alpine
  9. WORKDIR /app
  10. # 复制构建产物(仅需依赖,不含源码)
  11. COPY --from=builder /app/node_modules ./node_modules
  12. COPY src ./src
  13. # 暴露端口(文档作用,非实际映射)
  14. EXPOSE 3000
  15. # 启动命令(用exec格式,保证信号传递)
  16. CMD ["node", "src/index.js"]

构建命令:bash

  1. docker build -t my-node-app:1.0 .

.代表构建上下文路径)

避坑点:.dockerignore文件排除node_modules.git 等无用文件,否则构建变慢

四、Day3:进阶提升 —— 多容器编排与数据持久化(3 小时通关)

1. Docker Compose:一行命令启动多容器应用

当需要同时运行 Node+MySQL 时,用 Compose 替代繁琐的docker run命令。创建compose.yaml:yaml

  1. version: '3.8'
  2. services:
  3. app:
  4. image: my-node-app:1.0
  5. ports:
  6. - "3000:3000"
  7. environment:
  8. - MYSQL_HOST=mysql
  9. depends_on: # 解决服务依赖问题
  10. - mysql
  11. mysql:
  12. image: mysql:8.0
  13. environment:
  14. - MYSQL_ROOT_PASSWORD=123456
  15. - MYSQL_DATABASE=todos
  16. volumes:
  17. - mysql-data:/var/lib/mysql # 数据持久化(避免容器删除数据丢失)
  18. volumes:
  19. mysql-data: # 自动创建命名卷

核心命令:

启动:docker compose up -d(后台运行)停止:docker compose down -v-v删除卷,生产环境慎用)

2. 数据持久化:3 种方案对比(新手必看)

方案 用法示例 适用场景
命名卷 volumes: - mysql-data:/path 生产环境(安全稳定)
绑定挂载 volumes: - ./data:/var/lib/mysql 开发环境(实时同步代码)
临时文件系统 tmpfs: /tmp 临时数据(如日志缓存)

避坑点:绑定挂载路径必须用绝对路径(Linux/macOS),Windows 用C:/data格式

五、实战项目:10 分钟部署 WordPress 博客(检验成果)

bash

  1. # 1. 创建compose.yaml
  2. cat > compose.yaml << EOF
  3. version: '3'
  4. services:
  5. wordpress:
  6. image: wordpress:latest
  7. ports:
  8. - "8080:80"
  9. environment:
  10. - WORDPRESS_DB_HOST=db
  11. - WORDPRESS_DB_PASSWORD=wp123
  12. volumes:
  13. - wp-data:/var/www/html
  14. db:
  15. image: mysql:5.7
  16. environment:
  17. - MYSQL_ROOT_PASSWORD=wp123
  18. - MYSQL_DATABASE=wordpress
  19. volumes:
  20. - db-data:/var/lib/mysql
  21. volumes:
  22. wp-data:
  23. db-data:
  24. EOF
  25. # 2. 启动服务
  26. docker compose up -d

访问http://localhost:8080即可配置博客,数据自动持久化,重启容器不丢失。

六、避坑指南:新手最易踩的 5 个坑及解决方案

  1. 端口冲突:启动容器报错port is already allocated✅ 解决:netstat -tulpn | grep 端口号查占用进程,kill 或换端口
  2. 数据丢失:容器删除后数据没了✅ 解决:必须用卷(volumes)挂载数据目录,禁用--rm参数
  3. 镜像臃肿:构建的镜像几百 MB✅ 解决:用多阶段构建 + Alpine 基础镜像(比 Ubuntu 小 80%)
  4. 日志过大:容器日志占满磁盘✅ 解决:truncate 清理运行中容器日志:truncate -s 0 $(docker inspect --format='{{.LogPath}}' 容器名)
  5. 网络不通:容器间无法通信✅ 解决:Compose 自动创建网络,非 Compose 容器需手动加入同一网络:docker network connect 网络名 容器名

七、进阶资源推荐(按学习阶段划分)

阶段 资源类型 推荐内容
基础 在线演练场 Play with Docker(training.play-with-docker.com,浏览器直接练)
进阶 官方文档 Docker Compose 教程(docs.docker.com/get-started/workshop/08_using_compose
实战 项目案例 阿里云容器服务博客(yq.aliyun.com/teams/11,含微服务部署方案)
面试 核心原理 《理解 Docker 容器的进程管理》《容器健康检查机制》