Skip to content

技术教程模板 ​

技术教程的目标不是「我做过」,而是「另一个读者按文章能再做一次,并判断是否成功」。因此这份模板把环境、版本、命令、预期输出、验证和排错放在正文的核心位置。

用途 ​

  • 记录安装、配置、迁移、部署、调试等可重复执行的操作。
  • 让读者知道在什么系统、什么版本、哪些前置条件下能够复现。
  • 用命令、代码、截图和预期输出证明每一步确实可以完成。
  • 出现失败时,读者能根据常见问题快速定位原因。

放在哪里 ​

教程仍然是文章,必须放在 docs/posts/ 下,不要在文章目录创建 index.md。

场景目标文件categoriespermalink公开地址
一级分类下docs/posts/技术笔记/10.docker-tutorial.md[技术笔记]/posts/技术笔记/docker-tutorialhttps://www.baecon.cn/posts/技术笔记/docker-tutorial
二级目录下docs/posts/技术笔记/项目记录/20.ci-cd-tutorial.md[技术笔记]/posts/技术笔记/项目记录/ci-cd-tutorialhttps://www.baecon.cn/posts/技术笔记/项目记录/ci-cd-tutorial

公式:

text
文件:docs/posts/<一级分类>/[<子目录>/]<slug>.md
permalink:/posts/<一级分类>/[<子目录>/]<slug>
公开地址:https://www.baecon.cn/posts/<一级分类>/[<子目录>/]<slug>

二级目录只进入 URL 和文件路径,categories 仍然只写一级分类。文件名前缀用于排序,不作为 URL。

什么时候使用 ​

  • 读者需要按顺序执行命令、修改配置或完成一项操作。
  • 步骤有明确的前置条件、版本要求或环境差异。
  • 你可以给出可观察的成功标志、失败现象和恢复方式。
  • 内容需要长期维护,未来可能因版本升级而过时。

什么时候不要使用 ​

  • 只是解释一个概念、分享观点或写经验总结:使用 通用文章模板。
  • 重点是项目完成后的取舍、结果和复盘:使用 项目复盘模板。
  • 记录生活经历或感受:使用 生活随笔模板。
  • 创建分类目录入口:使用 目录页模板。
  • 你无法确认命令、版本或输出是否真实。不要凭记忆编造「预期输出」,应先实际执行或明确标注未验证。

完整可复制文件 ​

这个模板包含多个内层代码块,所以外层使用四个反引号。复制整段内容时要连同 frontmatter 和所有正文一起复制。

markdown
---
title: Docker 入门教程
description: 介绍如何在本地准备 Docker 环境、拉取测试镜像并运行第一个容器,逐步验证安装和排错流程,同时说明版本要求、命令输出、常见问题和安全清理步骤。
permalink: /posts/技术笔记/docker-tutorial
categories:
  - 技术笔记
tags:
  - Docker
  - 教程
article: true
sidebar: true
pagefind-indexed: true
comment: true
---

# Docker 入门教程

这篇教程帮助第一次使用 Docker 的读者完成环境检查、镜像拉取、容器运行和结果验证。命令均在文档标注的环境中实际执行。

## 适用场景

说明这篇教程解决什么问题、适合谁、在哪些环境下适用。

- 适合:第一次在本地运行 Docker 容器的开发者。
- 适用系统:Windows 11 + WSL 2,或 Ubuntu 24.04。
- 不覆盖:生产集群编排、Kubernetes 和镜像安全审计。

## 前置条件

在开始前确认:

- 已经安装终端和编辑器。
- 当前用户有权限启动 Docker Desktop 或 Docker Engine。
- 已预留约 2 GB 磁盘空间用于镜像和容器。
- 重要数据已经备份;涉及生产环境时先在测试环境操作。

## 环境与版本

| 组件 | 本文验证版本 | 检查命令 |
|---|---|---|
| 操作系统 | Windows 11 / Ubuntu 24.04 | `uname -a` 或系统设置 |
| Docker | 27.x | `docker --version` |
| Docker Compose | 2.x | `docker compose version` |

```bash
docker --version
docker compose version
```

预期输出应包含版本号,且命令退出码为 `0`:

```text
Docker version 27.x.x, build ...
Docker Compose version v2.x.x
```

## 步骤

### 1. 检查 Docker 是否可用

```bash
docker info
```

预期结果:输出 `Server Version`、`Storage Driver` 等信息,没有 `Cannot connect to the Docker daemon` 错误。

### 2. 拉取测试镜像

```bash
docker pull hello-world
```

预期结果:最终出现 `Status: Downloaded newer image for hello-world:latest`,或者提示镜像已是最新。

### 3. 运行第一个容器

```bash
docker run --rm hello-world
```

预期输出:

```text
Hello from Docker!
This message shows that your installation appears to be working correctly.
```

### 4. 清理

```bash
docker image rm hello-world
```

预期结果:镜像被删除;如果镜像正在被容器使用,命令会提示原因,应先停止或删除对应容器。

## 验证

逐项确认教程结果,而不是只看命令有没有报错:

| 验证项 | 命令或观察方式 | 通过标准 |
|---|---|---|
| Docker 服务正常 | `docker info` | 能读取 Server Version |
| 容器可运行 | `docker run --rm hello-world` | 输出 Hello from Docker |
| 清理成功 | `docker image ls` | 不再列出测试镜像 |

![Docker 运行成功后的终端输出截图](/images/posts/docker-tutorial/verify-output.webp)

> 图片提示:换成真实截图并写清 alt;没有截图时删除这一行。

## 常见问题

| 现象 | 可能原因 | 解决方式 |
|---|---|---|
| `Cannot connect to the Docker daemon` | Docker Desktop 或 Docker Engine 未启动 | 启动 Docker,等待状态变为 Running 后重试 |
| `permission denied` | Linux 用户没有 Docker 权限 | 按官方文档配置用户组,重新登录后再试 |
| 镜像拉取超时 | 网络或镜像源不可用 | 检查网络、代理和镜像源配置,不要直接粘贴不明来源的加速地址 |

## 总结

回顾最重要的准备条件、成功验证标志和清理步骤。提醒读者:版本不同可能导致输出略有差异,应优先以自己环境的实际结果为准。

复制后必须修改或确认 ​

值位置应该怎么改为什么必须确认
title 和正文 H1frontmatter 与 # Docker 入门教程改成完全一致的教程标题页面只能有一个 H1,且标题会用于首页、侧边栏和搜索。
descriptionfrontmatter换成 50–150 个中文字符的教程摘要说明读者能完成什么,而不是只写「一篇教程」。
datefrontmatter通常不要手填;文件首次 Git commit 后启动/构建会自动写入自动写入后不要为了「更新」而改它;更新信息用 updated。
permalinkfrontmatter改成全站唯一的 /posts/一级分类/.../slug决定教程的公开 URL,不能用随机 /pages/...。
categoriesfrontmatter改成教程所在的一级分类二级目录不写入分类。
tagsfrontmatter改成 2–5 个具体主题标签「教程」「示例」这类泛标签不能单独承担检索作用。
coverImgfrontmatter通常删除以使用正文图片/随机背景;只在需要固定卡片或分享图时写真实路径显式写后会固定,不再随机;路径必须存在。
articlefrontmatter保持 true确保教程作为文章进入首页和归档。
sidebarfrontmatter保持 true让读者能在文章侧边栏中切换。
pagefind-indexedfrontmatter保持 true教程通常需要被搜索到;它不能提供访问控制。
commentfrontmatter保持 true允许读者反馈复现问题;不希望讨论时才关闭。
环境与版本body换成实际系统、软件版本和检查命令版本是教程可复现性的关键,不能写「最新版」代替。
命令与预期输出body换成真实命令、工作目录和实际输出不真实的输出会误导读者,也会降低文章可信度。
截图与 altbody换成真实图片,alt 描述看到的结果路径应使用 /images/posts/<slug>/<file>.webp。

可选字段 ​

字段什么时候用推荐值注意
titleTag想突出「教程」属性教程只是标题旁短标签,不替代 tags。
top教程需要进入首页精选1真值标记,不是排名。
sticky教程需要置顶排序1 或较小数字必须是数字,越小越靠前。
sidebarSort需要覆盖侧边栏顺序10、20通常优先使用文件名数字前缀。
inHomePost不想让教程出现在首页主列表省略或 false会影响首页及分类/标签的 HomePost 列表,不是隐私设置。
updated教程大改后需要覆盖 SEO 修改时间YYYY-MM-DD HH:mm:ss通常省略,不能代替 date。
author站点作者之外的真实作者不写;如确需覆盖,用对象 { name, link }本站默认使用站点级作者,不建议逐篇覆盖。

文章 frontmatter 字段总表 ​

字段类型省略时默认推荐值级别完整说明
titlestring无可用默认;不要依赖自动推导与正文唯一 H1 完全一致必填页面标题,也是首页卡片、侧边栏、搜索结果和浏览器标题的来源。复制模板后必须改成真实标题,并保证正文只有一个 H1。
descriptionstringSEO 会回退到站点描述;首页摘要质量不可控50–150 个中文字符,说明问题、内容与读者收益推荐供 SEO 描述、首页卡片摘要和分享信息使用。应写成完整的一句话或两句话,不要堆关键词,也不要直接复制标题。
descstring未设置省略可选(旧字段)旧目录页的兼容显示字段,主要给 catalogue 页面使用;它不是 SEO 主字段,也不参与首页摘要。新文章不要写;目录页如保留 desc,需与 description 同值。
datestring文件首次 Git commit 的作者时间;已有值保留通常省略,不手填;需要人工指定发布时间时才覆盖自动维护;通常不手填文章的创建/发布时间,用于展示、首页排序、归档和 SEO 的 datePublished。新文章不需要写;首次 commit 后启动/构建会写入并保持稳定。
updatedstring未显式设置;SEO 修改时间由构建或最后更新时间兜底正常省略;确实需要覆盖时再用同一日期格式可选只用于覆盖 SEO 的 dateModified,不是文章发布时间,也不能代替 date。除非有明确的更新日期要展示给搜索引擎,否则不要填。
permalinkstring自动插件通常跳过已有 frontmatter,不能依赖自动生成全站唯一:/posts/<一级分类>/[<子目录>/]<slug>必填决定文章的公开 URL。本项目要求显式填写,不能包含 .md,不能以 docs/ 开头,也不能与其他页面重复。
categoriesstring[]自动插件通常跳过;缺省时没有可靠分类显式写一级分类,如 [技术笔记]推荐分类归档和分类卡片使用。只写一级分类;二级目录属于路径,不是第二个分类。一篇文章通常只写一个一级分类。
tagsstring[][]2–5 个具体标签,如 [VitePress, 部署]推荐标签用于聚合主题和搜索。标签应短而具体,避免把整句话、分类名或大量近义词都写成标签。
coverImgstring 或 string[]首页卡片:正文图片随机 → /home/bg*.webp 随机;SEO 分享图回退站点默认需要固定封面/分享图时才写真实路径;否则省略可选(按需)首页卡片优先使用;文章 Banner、OG 和分享图也会读取。显式写后不再随机;路径必须真实存在;不写时分享图不会自动取正文图。
articleboolean在 /posts/ 下省略时按 true 处理true推荐明确声明这是文章,让首页、归档、分类和标签等文章能力正常工作。教程、复盘、随笔、题解和建站记录都应显式写 true。
sidebarbooleanVitePress 默认为 truetrue推荐控制文章页是否显示左侧文章导航。本站文章应保持 true;只有特殊全宽页面才考虑关闭。
sidebarSortnumber使用文件名数字前缀;没有前缀时按 9999省略;确需覆盖时用 10、20 这类数字可选覆盖该文章在侧边栏中的排序,数字越小越靠前。优先用文件名前缀排序;同时使用两种方式会增加理解和维护成本。
pagefind-indexedbooleantruetrue推荐控制 Pagefind 是否索引此页。文章应保持 true;设为 false 只是不进入站内搜索,并不会把页面变成私有页面。
commentboolean未写 false 时按开启处理true推荐控制文章评论区。普通文章保持 true;目录页、纯功能页或含敏感信息的页面应关闭或不要发布。
topboolean 或 number未设置,即不进入精选省略;只有需要首页精选时写 1可选首页「精选文章」的真值筛选标记,不是排名:写 1 表示入选,数字大小本身不会排序。是否显示还受首页精选数量上限影响。
stickynumber未设置,即不置顶省略;确需置顶时用较小数字,如 1可选置顶排序字段,数字越小越靠前。它和 top 分工不同:top 负责进入精选卡片,sticky 负责置顶排序。不要用 true 代替数字。
inHomePostbooleantrue省略或显式 true;只有特殊文章才写 false可选设为 false 时会从首页、分类页和标签页等 HomePost 列表隐藏;文章的 URL、侧边栏、归档、精选和搜索等不会自动变成私有。不要把它当作隐私开关。
inCataloguebooleantrue通常省略;不想让文章出现在目录页时写 false高级目录插件扫描开关;不影响侧栏、Pagefind、首页、归档或 RSS。
titleTagstring无标签省略;需要短标识时用 原创、教程、复盘、题解、记录可选标题旁的小标签,只用于视觉提示,不替代分类或标签。保持 2–4 个汉字最清晰,不要塞入长句。
authorobject使用站点级作者 Baecon省略,不在单篇文章覆盖可选(不建议)若覆盖需用 { name: string, link?: string } 对象;普通文章不要填写。

高级 VitePress 字段 ​

这些字段由 VitePress 或主题布局控制,不是教程正文的一部分。普通教程不要填写;若要调整,应优先修改全站配置。

字段类型省略时默认推荐值级别完整说明
layoutstring 或 false使用 VitePress 标准文章布局省略高级切换页面布局。文章模板不需要设置;目录页才固定使用 layout: page。初学者不要为了外观而改它。
outlinefalse、数字、[number, number] 或 "deep"由 VitePress 与主题的默认大纲配置决定省略高级控制右侧标题大纲。普通文章沿用站点统一配置即可,除非全站规范明确要求,否则不要逐篇覆盖。
asideboolean 或 "left"默认跟随 VitePress 文章布局省略高级控制右侧辅助栏。与全站布局相关,不应由每篇文章随意切换。
lastUpdatedboolean跟随站点 lastUpdated: true省略高级控制页面是否显示最后更新时间。本站已统一开启,不需要在每篇文章重复设置。
editLinkboolean跟随站点主题配置省略高级控制是否显示编辑链接。它属于站点能力,不是文章内容字段。
pageClassstring空省略高级给页面根元素追加 CSS 类,只在有配套样式时使用。随意填写不会产生视觉效果。
layoutClassstring空省略高级当前项目会把它作为布局组件 class 读取,但只有配套 CSS 才有意义;普通写作不需要填写。
headarray[]省略高级为单个页面追加 <head> 标签。站点已统一生成 SEO 和分享标签,重复配置容易冲突。
titleTemplatestring 或 false使用站点标题模板省略高级覆盖浏览器标题拼接方式。除非页面有特殊 SEO 要求,否则不要覆盖全站一致性。
autoTitlebooleandoc 布局默认允许自动注入 H1省略;正文已手写 H1高级设为 false 可禁止自动 H1 注入。
articleUpdateboolean 或 object跟随站点配置,默认启用省略高级设为 false 隐藏文章页最近更新模块。
articleBannerboolean 或 object跟随站点配置;本站开启省略高级设为 false 关闭单文章 Banner;通常仅无侧栏 doc 文章生效。
coverBgColorstring跟随站点 defaultCoverBgColor,本站为空省略高级单文章 Banner 背景色覆盖;无 Banner 时不可见。
prevbooleantrue(有上一页时)省略高级设为 false 隐藏上一页链接。
nextbooleantrue(有下一页时)省略高级设为 false 隐藏下一页链接。

catalogue、path、pageTitle 是目录页专用字段,文章模板不要填写。若需要创建分类或子目录入口,请使用 目录页模板。

推荐正文结构 ​

章节写什么示例
## 适用场景教程解决什么问题、适合谁、覆盖和不覆盖什么列出系统、角色和边界。
## 前置条件开始前必须具备的环境、权限、工具和备份「需要 Docker 权限,已备份数据」。
## 环境与版本操作系统、软件版本、依赖版本和检查命令用表格列出版本,再附 docker --version。
## 步骤按顺序拆成可执行的小步骤,每步写命令、工作目录和预期结果每个 H3 只完成一个动作。
## 验证用命令、页面或指标证明结果正确命令加预期输出,不能只写「应该可以」。
## 常见问题列出可复现的失败现象、原因和解决办法用「现象 / 原因 / 解决」表格。
## 总结回收关键步骤、清理动作和后续学习方向说明版本差异和注意事项。

以上标题是推荐结构,不是系统强制字段。可以根据教程复杂度增删小节;例如短教程可以合并「步骤」和「验证」。系统只读取 frontmatter,正文标题不会自动变成字段。无论怎样调整,页面都要保留一个 H1,并与 title 一致。

命令和预期输出的写法 ​

  • 在命令前说明所在目录、使用的 shell 和权限,例如「在仓库根目录的 PowerShell 中执行」。
  • 不要只给命令。每条关键命令后面写出预期输出、退出码或页面现象。
  • 命令与输出分开放在不同的代码块中,避免读者把输出当成命令复制。
  • 不要复制带有 $、PS> 等提示符的命令文本;除非文章明确说明需要保留。
  • 版本号写实际验证过的版本,不要笼统写「最新版即可」。
  • 涉及删除、覆盖、生产发布或修改权限的命令,先写备份和回滚方式。
  • 如果有平台差异,分别说明 Windows、macOS 或 Linux 的不同命令。

发布前检查 ​

  • 文件位于 docs/posts/ 下,且没有创建文章目录的 index.md。
  • frontmatter 可解析,且 title 与唯一 H1 完全一致。
  • description 说明读者能完成什么,长度为 50–150 个中文字符。
  • 没有手写 date;文件首次 commit 后启动/构建已自动写入,且后续保持稳定。
  • categories 只写一级分类,tags 有 2–5 个具体标签。
  • 如果写了 coverImg,它指向真实存在的图片;如果省略,首页卡片随机封面和分享图回退行为符合预期。
  • 四个文章开关保持为 true,除非有明确理由关闭评论或搜索。
  • 系统中写明了版本、前置条件和权限要求。
  • 所有命令都实际执行过,输出、退出码和截图真实。
  • 命令中的账号、Token、主机名、IP、路径和个人信息已脱敏。
  • 步骤顺序完整,涉及危险操作时有备份和回滚说明。
  • 验证章节能独立判断成功或失败,常见问题覆盖主要故障。
  • 本地 /posts/... 能打开,侧边栏、搜索和首页卡片正常。
  • pnpm docs:build 通过,代码围栏和 Markdown 表格没有破坏页面。

最后更新于: