aws-doc/课程/第四阶段-应用架构/第26天-Docker与容器基础.md

190 lines
6.1 KiB
Markdown
Raw Permalink Normal View History

2026-05-08 10:24:39 +08:00
# 第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 上运行和管理你的容器化应用。