6.1 KiB
6.1 KiB
第26天:Docker 与容器基础——为什么现代应用都在用容器
今天你将学到什么
今天学习容器技术的基础概念。容器是现代应用部署的主流方式,理解它能帮你明白 AWS 的 ECS、EKS、Fargate 等服务在做什么。
传统部署的痛点
"在我电脑上能跑啊!"
每个开发者都经历过这个场景:
- 开发者在自己电脑上写好代码,测试通过
- 部署到服务器上,报错了
- 原因:服务器的 Python 版本不一样 / 缺少某个库 / 配置文件路径不同
根本问题:应用依赖的环境(操作系统、语言版本、库、配置)在不同机器上不一致。
虚拟机能解决,但太重了
虚拟机(VM)可以解决环境一致性问题——把整个操作系统打包。但是:
- 一个虚拟机动辄几个 GB
- 启动要几分钟
- 每个虚拟机都运行一个完整的操作系统,浪费资源
- 一台物理机上跑不了太多虚拟机
容器是什么
类比理解
虚拟机 = 独栋别墅。每栋房子有自己的地基、水电系统、花园。独立但占地大、建造慢。
容器 = 集装箱公寓。共享地基和水电系统,每个集装箱内部是独立的生活空间。轻量、快速、可以密集排列。
技术角度
容器是一种轻量级的隔离环境:
- 共享宿主机的操作系统内核(不需要自己的操作系统)
- 有自己独立的文件系统、网络、进程空间
- 启动只需要几秒钟
- 镜像大小通常只有几十到几百 MB
虚拟机 vs 容器
| 特性 | 虚拟机 | 容器 |
|---|---|---|
| 大小 | 几 GB | 几十~几百 MB |
| 启动时间 | 几分钟 | 几秒 |
| 资源占用 | 高(完整 OS) | 低(共享内核) |
| 隔离性 | 强(硬件级别) | 较强(进程级别) |
| 密度 | 一台机器跑几个~十几个 | 一台机器跑几十~上百个 |
| 适合 | 需要不同操作系统、强隔离 | 同一操作系统上运行多个应用 |
Docker——容器的事实标准
Docker 是最流行的容器工具。它让你可以:
- 打包:把应用和它的所有依赖打包成一个"镜像"(Image)
- 分发:把镜像上传到仓库,任何人都能下载
- 运行:在任何安装了 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
- 复杂的长时间运行的应用、需要特定环境 → 容器
今天的小测验
- 容器和虚拟机的核心区别是什么?容器为什么更轻量?
- Docker 镜像和容器的关系是什么?用一个类比解释。
- Dockerfile 的作用是什么?
- 什么场景适合用容器,什么场景适合用 Lambda?
延伸阅读
明天预告
明天学习 AWS ECS(Elastic Container Service)——AWS 的容器编排服务。了解如何在 AWS 上运行和管理你的容器化应用。