# 第26天:Docker 与容器基础——为什么现代应用都在用容器 ## 今天你将学到什么 今天学习容器技术的基础概念。容器是现代应用部署的主流方式,理解它能帮你明白 AWS 的 ECS、EKS、Fargate 等服务在做什么。 --- ## 传统部署的痛点 ### "在我电脑上能跑啊!" 每个开发者都经历过这个场景: - 开发者在自己电脑上写好代码,测试通过 - 部署到服务器上,报错了 - 原因:服务器的 Python 版本不一样 / 缺少某个库 / 配置文件路径不同 **根本问题**:应用依赖的环境(操作系统、语言版本、库、配置)在不同机器上不一致。 ### 虚拟机能解决,但太重了 虚拟机(VM)可以解决环境一致性问题——把整个操作系统打包。但是: - 一个虚拟机动辄几个 GB - 启动要几分钟 - 每个虚拟机都运行一个完整的操作系统,浪费资源 - 一台物理机上跑不了太多虚拟机 --- ## 容器是什么 ### 类比理解 **虚拟机** = 独栋别墅。每栋房子有自己的地基、水电系统、花园。独立但占地大、建造慢。 **容器** = 集装箱公寓。共享地基和水电系统,每个集装箱内部是独立的生活空间。轻量、快速、可以密集排列。 ### 技术角度 容器是一种轻量级的隔离环境: - 共享宿主机的操作系统内核(不需要自己的操作系统) - 有自己独立的文件系统、网络、进程空间 - 启动只需要几秒钟 - 镜像大小通常只有几十到几百 MB ### 虚拟机 vs 容器 | 特性 | 虚拟机 | 容器 | |------|--------|------| | 大小 | 几 GB | 几十~几百 MB | | 启动时间 | 几分钟 | 几秒 | | 资源占用 | 高(完整 OS) | 低(共享内核) | | 隔离性 | 强(硬件级别) | 较强(进程级别) | | 密度 | 一台机器跑几个~十几个 | 一台机器跑几十~上百个 | | 适合 | 需要不同操作系统、强隔离 | 同一操作系统上运行多个应用 | --- ## Docker——容器的事实标准 Docker 是最流行的容器工具。它让你可以: 1. **打包**:把应用和它的所有依赖打包成一个"镜像"(Image) 2. **分发**:把镜像上传到仓库,任何人都能下载 3. **运行**:在任何安装了 Docker 的机器上,用镜像启动容器 ### 核心概念 | 概念 | 类比 | 说明 | |------|------|------| | 镜像(Image) | 菜谱 + 食材包 | 包含应用代码和所有依赖的只读模板 | | 容器(Container) | 做好的菜 | 镜像的运行实例,可以启动、停止、删除 | | Dockerfile | 菜谱 | 描述如何构建镜像的文本文件 | | 仓库(Registry) | 菜谱书店 | 存储和分发镜像的地方 | ### Dockerfile 长什么样 一个简单的 Python Web 应用的 Dockerfile: ``` FROM python:3.11 ← 基于 Python 3.11 的基础镜像 COPY app.py /app/ ← 把你的代码复制进去 COPY requirements.txt /app/ RUN pip install -r /app/requirements.txt ← 安装依赖 EXPOSE 8080 ← 声明应用使用 8080 端口 CMD ["python", "/app/app.py"] ← 容器启动时运行的命令 ``` **效果**:无论在谁的电脑上、在哪台服务器上,用这个 Dockerfile 构建出来的镜像,运行起来的环境都是一模一样的。 ### Docker 的工作流程 ``` 开发者电脑: 写代码 → 写 Dockerfile → 构建镜像 → 本地测试通过 ↓ 推送镜像到仓库(Docker Hub / AWS ECR) ↓ 服务器: 从仓库拉取镜像 → 启动容器 → 应用运行 ``` --- ## 为什么容器这么受欢迎 ### 1. 环境一致性 "在我电脑上能跑"的问题彻底解决。开发、测试、生产用的是同一个镜像。 ### 2. 快速部署 传统部署:安装操作系统 → 安装运行时 → 安装依赖 → 部署代码 → 配置环境(可能要几小时) 容器部署:拉取镜像 → 启动容器(几秒钟) ### 3. 资源效率 一台服务器上可以运行几十个容器,比虚拟机密度高得多。 ### 4. 微服务友好 一个大应用可以拆分成多个小服务,每个服务一个容器,独立开发、独立部署、独立扩展。 ### 5. 易于扩展 需要更多处理能力?多启动几个相同的容器就行。 --- ## 容器在 AWS 上怎么跑 AWS 提供了多种运行容器的方式: | 服务 | 定位 | 类比 | |------|------|------| | ECR | 镜像仓库 | 存放镜像的"仓库" | | ECS | 容器编排 | 管理容器的"调度员" | | EKS | Kubernetes 托管 | 用 Kubernetes 管理容器 | | Fargate | 无服务器容器 | 不用管服务器,直接跑容器 | ### AWS ECR(Elastic Container Registry) ECR 是 AWS 的私有镜像仓库。就像 Docker Hub,但是: - 私有的(只有你的团队能访问) - 和 AWS 其他服务无缝集成 - 自动扫描镜像中的安全漏洞 --- ## 容器 vs 无服务器(Lambda) | 特性 | 容器(ECS/EKS) | Lambda | |------|-----------------|--------| | 运行时间 | 无限制 | 最长 15 分钟 | | 启动时间 | 几秒 | 毫秒~秒 | | 自定义程度 | 完全自定义环境 | 受限的运行时 | | 适合 | 长时间运行的服务、复杂应用 | 事件驱动、短时任务 | | 管理复杂度 | 中等 | 低 | | 成本模型 | 按容器运行时间 | 按调用次数和执行时间 | **选择建议**: - 简单的事件处理、API 后端 → Lambda - 复杂的长时间运行的应用、需要特定环境 → 容器 --- ## 今天的小测验 1. 容器和虚拟机的核心区别是什么?容器为什么更轻量? 2. Docker 镜像和容器的关系是什么?用一个类比解释。 3. Dockerfile 的作用是什么? 4. 什么场景适合用容器,什么场景适合用 Lambda? --- ## 延伸阅读 - [Docker 官方入门教程](https://docs.docker.com/get-started/) - [AWS 容器服务概览](https://aws.amazon.com/containers/) - [AWS ECR 用户指南](https://docs.aws.amazon.com/AmazonECR/latest/userguide/) --- ## 明天预告 明天学习 AWS ECS(Elastic Container Service)——AWS 的容器编排服务。了解如何在 AWS 上运行和管理你的容器化应用。