- 教程
- 云原生
【免费下载链接】learn-to-cloud
A courseware built on the belief that anyone can learn foundational cloud engineering skills with the right guide and discipline
本文是 learn-to-cloud 课程 Phase 4「DevOps 基础」的第一个主题,围绕 i18n/es/docusaurus-plugin-content-docs/current/phase4/1-containers.md(对应英文版 docs/phase4/1-containers.md)展开。你将系统掌握容器化的核心概念、Docker 镜像构建与发布流程、主流云厂商容器注册中心的使用思路,并通过两个 hands-on 任务(基础容器化项目 + 本地运行 GitHub MCP Server)把理论落到实操。读完本篇,你能独立完成"写 Dockerfile → 构建镜像 → 本地运行 → 推送注册中心 → 异地拉取验证"的完整闭环,并理解如何用容器承载 MCP(Model Context Protocol)服务器,将应用与 LLM 和外部 AI 工具连接起来。
为什么先学容器化
容器化(Containerization)是现代环境下部署与管理应用程序和服务的核心方法。它把软件、工具以及全部依赖打包成轻量、可移植的单元——容器(Container),从而解决"在我机器上能跑"的环境差异问题。
关键收益(与虚拟机相比):
- 环境一致性:开发、测试、生产环境使用同一套打包产物,杜绝环境漂移
- 资源利用率更高:容器共享宿主内核,比 VM 更轻量、启动更快
- 部署与伸缩更简单:镜像即产物,秒级拉起/销毁,天然适配水平扩展
- 应用间隔离:每个容器拥有独立的文件系统、进程与网络命名空间
容器工具生态非常丰富,常见的有 Docker、Podman、Containerd 等。本主题以Docker为主线——它是当前最普及、资料最完整的容器运行时。同时,你还需要理解容器化与虚拟化的本质差异:
- 虚拟机:每个 VM 包含完整的客户操作系统(Guest OS),由 Hypervisor 管理,隔离性最强但开销大
- 容器:多个容器共享宿主机内核,只打包应用及其运行依赖,资源开销小、密度高
注意:本主题所属的 Phase 4 建议用时 4-5 周,单个主题(容器化)的预估学习时长为3-4 天。前置要求是完成 Phase 2(编程与 AI 集成)和 Phase 3(云平台基础)的 capstone 项目,本阶段将基于此前构建的 Journal API 应用继续演进,详见 docs/phase4/README.md。
核心概念:注册中心(Container Registry)
镜像需要地方存放和分发,这个场所就是容器注册中心(Container Registry)。它负责存储镜像、管理版本标签(tag),并支持 push/pull 操作。云厂商几乎都提供托管注册中心,本主题要求你掌握如何将一个应用容器化后部署到不同的注册中心:
| 注册中心 | 典型场景 |
|---|---|
| DockerHub | 最通用的公共/私有镜像仓库,适合学习与开源项目 |
| AWS ECR | 与 AWS 生态深度集成,配合 EKS、ECS 使用 |
| Azure Container Registry (ACR) | Azure 原生镜像仓库,支持 AKS 集成 |
| Google Container Registry (GCR) | GCP 生态镜像仓库,配合 GKE 使用 |
学习重点不在于记住各家控制台按钮,而在于理解统一的镜像工作流:docker build构建 →docker tag打标签 →docker push推送 →docker pull拉取。不同注册中心只是认证方式和仓库地址前缀不同。
实战一:基础容器化项目(7 步闭环)
这是本主题的第一个 hands-on 任务,目标是亲手走完"应用 → 镜像 → 注册中心 → 异地运行"的全流程:
- 创建一个简单应用(或用你已有的应用,例如 Phase 2 的 FastAPI Journal API)
- 为应用编写 Dockerfile:定义基础镜像、工作目录、依赖安装、启动命令
- 构建 Docker 镜像:执行
docker build -t <镜像名>:<tag> . - 本地运行容器并验证功能:
docker run -p <宿主端口>:<容器端口> <镜像名>:<tag>,然后访问应用确认可用 - 在 DockerHub(或其他注册中心)创建账号
- 打标签并推送镜像:
docker tag <镜像名>:<tag> <dockerhub用户名>/<镜像名>:<tag> docker push <dockerhub用户名>/<镜像名>:<tag> - 在另一台机器上拉取并运行,验证镜像的可移植性:
docker pull <dockerhub用户名>/<镜像名>:<tag> docker run -p <端口>:<端口> <dockerhub用户名>/<镜像名>:<tag>
这一步的意义在于亲身体验"构建一次、到处运行":只要目标机器装有 Docker 运行时,同一份镜像就能无差别工作——这正是容器化相对于传统部署的最大价值。
仓库里的真实 Dockerfile:多阶段构建范例
本仓库自身就是一个容器化的真实案例:根目录的 Dockerfile 使用**多阶段构建(multi-stage build)**来打包这个基于 Docusaurus 的课程网站,是理解 Dockerfile 最佳实践的绝佳样本。逐段拆解:
# Stage 1: 基础镜像。 FROM node:lts as base # 关闭 yarn 的彩色输出,让日志更易读。 ENV FORCE_COLOR=0 # 启用 corepack(Node 自带的包管理器管理器)。 RUN corepack enable # 设置工作目录为 /opt/docusaurus。 WORKDIR /opt/docusaurusFROM node:lts as base:选用 Node 长期支持版作为基础镜像,并给阶段命名baseENV FORCE_COLOR=0:通过环境变量控制工具行为,这是"用 ENV 传递配置"的典型手法WORKDIR /opt/docusaurus:固定工作目录,后续所有命令都在此目录执行
# Stage 2a: 开发模式。 FROM base as dev WORKDIR /opt/docusaurus # 暴露 Docusaurus 开发服务器端口。 EXPOSE 3000 # 运行开发服务器:没有 node_modules 先安装依赖,再以 0.0.0.0 启动并轮询文件变化。 CMD [ -d "node_modules" ] && npm run start --host 0.0.0.0 --poll 1000 || npm run install && npm run start --host 0.0.0.0 --poll 1000# Stage 2b: 生产构建模式。 FROM base as prod WORKDIR /opt/docusaurus # 复制全部源码。 COPY . /opt/docusaurus/ # 使用 --immutable 安装依赖,保证可复现。 RUN npm ci # 构建静态站点。 RUN npm run build# Stage 3a: 用 docusaurus serve 提供服务。 FROM prod as serve EXPOSE 3000 CMD ["npm", "run", "serve", "--", "--host", "0.0.0.0", "--no-open"] # Stage 3b: 用 Caddy 提供服务。 FROM caddy:2-alpine as caddy COPY --from=prod /opt/docusaurus/Caddyfile /etc/caddy/Caddyfile COPY --from=prod /opt/docusaurus/build /var/docusaurus这个 Dockerfile 包含几个值得沿用到你自己项目的实践:
- 多阶段构建:
base→prod只保留构建产物,最终镜像(serve/caddy)不携带构建工具链,大幅缩小镜像体积 - 分层缓存:
COPY .放在依赖安装之前,源码变更时能最大化利用层缓存 - 可复现构建:
npm ci --immutable依据 package.json 中的锁文件精确安装依赖,避免版本漂移(该文件还声明了engines.node >= 16.14) - 开发/生产分离:
dev阶段暴露 3000 端口跑热更新开发服务器,prod阶段产出静态站点再由serve或轻量的caddy:2-alpine对外服务
对照 package.json 的 scripts(start、build、serve),可以看到 Dockerfile 中的每条命令都能在项目脚本里找到对应实现——这正是"镜像内容与项目声明保持一致"的体现。当你为自己的 FastAPI/Node 应用写 Dockerfile 时,这套模式完全可以直接迁移。
实战二:本地运行 GitHub MCP Server 作为容器
这是本主题最有特色的任务:把MCP(Model Context Protocol,模型上下文协议)服务器以容器方式跑起来,让 GitHub Copilot / VS Code 能通过标准协议访问 GitHub 仓库数据并执行操作。
MCP 是什么:MCP 是一个开放协议,用于统一应用与 LLM、外部 AI 工具之间的数据与操作接口。类比而言,它之于 AI 工具集成,就像 USB 之于外设连接——一套标准让"AI 应用 ↔ 数据源/工具"的对接规范化。容器化是运行 MCP 服务器的理想方式:依赖封装、版本隔离、一条命令即可启动。
操作步骤:
- 准备环境:安装 Docker Desktop,并确保 VS Code 已安装 GitHub Copilot 扩展
- 在 Docker Desktop 中安装官方的 GitHub MCP Server(
github/github-mcp-server镜像) - 创建 GitHub Personal Access Token(个人访问令牌),并将其作为环境变量传给服务器——注意令牌属于敏感凭据,应当通过环境变量或密钥管理注入,绝不写死在镜像或代码里
- 在 VS Code 中启用 MCP Gateway:通过 Command Palette 执行
docker mcp gateway run,将 Docker 中的 MCP 服务器注册为 VS Code 可用的 MCP 网关 - 启用 GitHub Copilot 的 Agent mode(代理模式)
- 探索与测试:向 Copilot 提问查询你的仓库、发起 GitHub 操作(如创建 issue、查看 PR 等),验证 MCP 通道是否打通
提示:如果你在非 macOS/Linux 环境遇到 Docker 与 VS Code MCP 网关连通性问题,优先检查 Docker Desktop 是否处于运行状态、令牌权限范围是否覆盖所需 repo 操作,以及
docker mcp gateway run是否在正确的项目工作区执行。
常见问题与排查思路
容器化入门阶段最常遇到的问题,集中在镜像构建失败、端口映射不通、容器启动即退出、镜像体积过大几类。官方资料给出了两个必读方向(此处不展开外链,建议在 Docker 官方文档中检索):
- Docker Common Issues & Solutions:覆盖引擎层面的常见故障与修复路径,例如守护进程无法启动、镜像拉取超时、存储驱动问题等
- Best Practices for Writing Dockerfiles:Dockerfile 编写最佳实践,包括:每个容器只运行一个进程、合理利用构建缓存(把变更频率低的指令放前面)、使用
.dockerignore排除无关文件、优先选用官方镜像和固定 tag、尽量使用非 root 用户运行、将环境变量通过ENV/运行时注入而非写死
结合前面仓库 Dockerfile 的剖析,你已具备评估"自己的 Dockerfile 是否合格"的判断力。
用 AI 助手检验你的理解
完成实操后,推荐用 AI 助手(ChatGPT、Claude 或 Google Gemini)对你进行面试式考核,步骤:
开启一个新的对话
使用以下初始提示词:
我正在学习容器和 Docker。希望你扮演面试官: - 一次只问一个问题,围绕容器化概念提问 - 不要立刻给出答案 - 对我的回答给出反馈 - 如果我答错了,引导我走向正确答案 - 每次回答后分享相关的真实示例 我们开始吧?逐题作答,重点主题包括:
- 容器 vs 虚拟机
- Docker 架构及其组件(客户端、守护进程、镜像、容器、注册中心)
- Dockerfile 结构与最佳实践
- 注册中心与镜像管理
- 容器网络与存储
- 安全考量(最小权限、镜像来源可信、密钥管理)
每答完一题:
- 请 AI 给出反馈
- 请它分享真实案例
- 需要时请求进一步澄清
:::tip 进阶技巧 给 AI 提供你的具体场景,例如:"我正在用 Docker 容器化一个 Node.js 应用,请把问题聚焦在这个场景上。"上下文越具体,考核越贴近实战。 :::
记住:目标是检验理解深度,而不是追求一次答对。回答卡壳恰恰说明这里需要回头复习。
主题清单:完成标准自检
在进入下一个主题之前,确认你已经具备以下能力:
- 理解容器化与虚拟化的区别
- 掌握 Docker 基础与架构
- 能为应用编写 Dockerfile
- 能构建并在本地运行容器
- 能将镜像推送到容器注册中心
- 能配置并测试 GitHub MCP Server
- 理解容器网络与存储
下一步:容器化在 Phase 4 中的位置
容器化是 Phase 4 的基石,后续主题将在此基础上层层递进(见 docs/phase4/README.md):
- CI/CD:为容器化应用搭建流水线,每次提交自动构建镜像并推送注册中心
- Infrastructure as Code:用 Terraform 声明式管理基础设施
- 容器编排:用 Kubernetes 编排多容器应用(Pod、Service、Deployment、ConfigMap/Secret)
- 监控与可观测性:用 Docker 部署 Prometheus、Grafana、n8n 构建监控与 AI 告警
- DevOps Capstone:将本主题学到的 Dockerfile 编写、镜像构建与推送能力,应用于 Phase 2 的 Journal API——包括通过环境变量注入 LLM API 凭据、将镜像推送至注册中心、编写 Kubernetes 清单并部署,最终形成端到端的 DevOps 项目
至此,你已经掌握了容器化的完整工作流:从理解概念、编写 Dockerfile、构建运行镜像、发布到注册中心,到用容器承载 MCP 服务器接入 AI 工具链。这套能力将直接支撑你在后续主题中完成 CI/CD、Kubernetes 编排与 capstone 项目——这也是初级云工程师最核心的 DevOps 技能之一。
- 教程
- 云原生
【免费下载链接】learn-to-cloud
A courseware built on the belief that anyone can learn foundational cloud engineering skills with the right guide and discipline
相关推荐
Learn to Cloud 实战:Kubernetes 容器编排入门指南(Phase 4)
Learn to Cloud 实战:Kubernetes 容器编排入门指南(Phase 4) 本文是 Learn to Cloud 课程 Phase 4「Dev
教程云原生告别重复输入:ripgrep 个性化配置的3个实用技巧
告别重复输入:ripgrep 个性化配置的3个实用技巧 还在为每次使用 ripgrep 都要敲一堆命令行参数而烦恼吗?😫 今天我要分享几个让搜索体验飞升的实用
CLI开发工具Gemini MCP 服务器容器化实践:从本地部署到Docker化演进
Gemini MCP 服务器容器化实践:从本地部署到Docker化演进 在开源项目Gemini MCP Server的开发过程中,跨平台兼容性问题逐渐显现,特别
人工智能AI 应用MCP 服务LLM 网关大模型代码智能体
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考