Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 24 additions & 38 deletions 01_introduction/1.3_why.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,11 @@ Docker 的出现为上述问题提供了完美的解决方案。它通过 “一
具体内容如下:

```mermaid
flowchart TD
dev["开发环境"] --> img1["Docker 镜像"]
test["测试环境"] --> img2["Docker 镜像"]
prod["生产环境"] --> img3["Docker 镜像"]

img1 === img2 === img3

img1 --> res1["完全一致"]
img2 --> res2["完全一致"]
img3 --> res3["完全一致"]
flowchart LR
dev["开发团队"] -->|创建| img["Docker 镜像"]
img -->|测试团队验证| test["测试团队"]
test -- "有问题<br/>反馈修改和更新" --> dev
test -- "没问题<br/>发布" --> prod["生产环境"]
```

### 1.3.3 Docker 的核心优势
Expand Down Expand Up @@ -117,30 +112,32 @@ $ docker compose up

#### 3. 资源效率

Docker 容器共享宿主机内核,无需为每个应用运行完整的操作系统。
Docker 容器共享宿主机内核,无需为每个应用运行完整的操作系统。以一台 64GB 内存的物理服务器为例:
- **传统虚拟机方案**:每个虚拟机都需要运行完整的操作系统(每个额外占用如 2GB 内存),产生大量资源开销,实际可用于应用的内存可能只有约 18GB。
- **Docker 方案**:容器直接共享宿主机系统,只需付出很少的基础开销(OS及引擎约 4GB),即可将约 60GB 的内存全部用于实际应用。

```mermaid
flowchart TD
subgraph VM ["传统虚拟机方案 (实际可用于应用: 18GB) ❌"]
subgraph VM ["传统虚拟机方案 ❌"]
direction TB
Server1["物理服务器 (64GB 内存)"]
subgraph VMs [" "]
subgraph VMs ["可用应用内存: 约 18GB"]
direction LR
VM1["VM1<br/>8GB 内存 (含 OS 2GB)<br/>应用 1"]
VM2["VM2<br/>8GB 内存 (含 OS 2GB)<br/>应用 2"]
VM3["VM3<br/>8GB 内存 (含 OS 2GB)<br/>应用 3"]
VM1["VM 1: 应用 1<br/>(含 2GB OS)"]
VM2["VM 2: 应用 2<br/>(含 2GB OS)"]
VM3["VM 3: 应用 3<br/>(含 2GB OS)"]
end
Server1 --- VMs
end

subgraph Docker ["Docker 方案 (实际可用于应用: 约 60GB) ✅"]
subgraph Docker ["Docker 方案 ✅"]
direction TB
Server2["物理服务器 (64GB 内存)<br/>宿主机 OS + Docker (约 4GB)"]
subgraph Containers [" "]
Server2["物理服务器 (64GB 内存)<br/>含约 4GB OS及引擎配置"]
subgraph Containers ["可用应用内存: 约 60GB"]
direction LR
C1["容器 1<br/>应用 1<br/>(按需分配)"]
C2["容器 2<br/>应用 2<br/>(按需分配)"]
C3["容器 3<br/>应用 3<br/>(按需分配)"]
C1["容器 1: 应用 1<br/>(按需分配)"]
C2["容器 2: 应用 2<br/>(按需分配)"]
C3["容器 3: 应用 3<br/>(按需分配)"]
end
Server2 --- Containers
end
Expand Down Expand Up @@ -208,25 +205,14 @@ flowchart TD

笔者认为,技术选型要客观。Docker 并非银弹,以下场景可能不太适合:

#### 1. 需要完全隔离的场景

容器共享宿主机内核,隔离性不如虚拟机。如果你需要运行不受信任的代码,虚拟机可能更安全。

#### 2. 需要特殊内核的场景

容器使用宿主机内核。如果应用需要特定版本的内核或内核模块,可能需要虚拟机。

#### 3. Windows 原生应用

虽然 Docker 支持 Windows 容器,但生态不如 Linux 容器成熟。传统 Windows 应用的容器化仍有挑战。

#### 4. 桌面应用

Docker 主要面向服务端应用。桌面 GUI 应用的容器化虽然可行,但通常得不偿失。
- **需要完全隔离的场景**:容器共享宿主机内核,隔离性不如虚拟机。如果需要运行不受信任的代码,虚拟机可能更安全。
- **需要特殊内核的场景**:容器使用宿主机内核。如果应用需要特定版本的内核或内核模块,可能需要虚拟机。
- **Windows 原生应用**:虽然 Docker 支持 Windows 容器,但生态不如 Linux 容器成熟。传统 Windows 应用的容器化仍有挑战。
- **桌面应用**:Docker 主要面向服务端应用。桌面 GUI 应用的容器化虽然可行,但通常得不偿失。

### 1.3.5 与传统虚拟机的对比总结

相关信息如下表
下表对比了容器技术与传统虚拟机的区别

| 特性 | Docker 容器 | 传统虚拟机 |
|:------|:-----------|:-----------|
Expand Down