aws-doc/课程/第四阶段-应用架构/第26天-Docker与容器基础.md
2026-05-08 10:24:39 +08:00

190 lines
6.1 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 第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 ECRElastic 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 ECSElastic Container Service——AWS 的容器编排服务。了解如何在 AWS 上运行和管理你的容器化应用。