style: apply global formatting fixes (struct, spacing, zhlint)

This commit is contained in:
Baohua Yang
2026-02-21 11:08:52 -08:00
parent ad68b2d973
commit 79ac9c639a
159 changed files with 1708 additions and 882 deletions

View File

@@ -2,7 +2,7 @@
本节将通过一个简单的 Web 应用例子带你快速体验 Docker 的核心流程构建镜像运行容器
### 1. 准备代码
### 1准备代码
创建一个名为 `hello-docker` 的文件夹并在其中创建一个 `index.html` 文件
@@ -10,7 +10,7 @@
<h1>Hello, Docker!</h1>
```
### 2. 编写 Dockerfile
### 2编写 Dockerfile
在同级目录下创建一个名为 `Dockerfile` (无后缀) 的文件
@@ -19,7 +19,7 @@ FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
```
### 3. 构建镜像
### 3构建镜像
打开终端进入该目录执行构建命令
@@ -27,11 +27,11 @@ COPY index.html /usr/share/nginx/html/index.html
$ docker build -t my-hello-world .
```
* `docker build`: 构建命令
* `-t my-hello-world`: 给镜像起个名字标签
* `.`: 指定上下文路径为当前目录
* `docker build`构建命令
* `-t my-hello-world`给镜像起个名字 (标签)
* `.`指定上下文路径为当前目录
### 4. 运行容器
### 4运行容器
使用刚才构建的镜像启动一个容器
@@ -39,15 +39,15 @@ $ docker build -t my-hello-world .
$ docker run -d -p 8080:80 my-hello-world
```
* `docker run`: 运行命令
* `-d`: 后台运行
* `-p 8080:80`: 将宿主机的 8080 端口映射到容器的 80 端口
* `docker run`运行命令
* `-d`后台运行
* `-p 8080:80`将宿主机的 8080 端口映射到容器的 80 端口
### 5. 访问测试
### 5访问测试
打开浏览器访问 [http://localhost:8080](http://localhost:8080),你应该能看到 "Hello, Docker!"
打开浏览器访问 [http://localhost:8080](http://localhost:8080),你应该能看到 HelloDocker!”
### 6. 清理
### 6清理
停止并删除容器
@@ -65,4 +65,4 @@ $ docker stop <CONTAINER_ID>
$ docker rm <CONTAINER_ID>
```
恭喜你已经完成了第一次 Docker 实战接下来请阅读 [Docker 核心概念](../02_basic_concept/README.md) 做深入了解
恭喜你已经完成了第一次 Docker 实战接下来请阅读 [Docker 核心概念](../02_basic_concept/README.md)做深入了解

View File

@@ -12,7 +12,7 @@ Docker 做的事情类似:无论你的应用是用 Python、Java、Node.js 还
### Docker 的核心价值
笔者认为Docker 解决的是软件开发中最古老的问题之一**"在我机器上明明能跑啊"**
笔者认为Docker 解决的是软件开发中最古老的问题之一**在我机器上明明能跑啊**
```mermaid
flowchart LR
@@ -44,7 +44,7 @@ flowchart LR
### Docker vs 虚拟机
很多人第一次接触 Docker 时会问**"这不就是虚拟机吗"**答案是**不是而且差别很大**
很多人第一次接触 Docker 时会问**这不就是虚拟机吗**答案是**不是而且差别很大**
#### 传统虚拟机
@@ -68,18 +68,22 @@ flowchart LR
| **隔离级别** | 进程级隔离 | 完全隔离 |
| **单机数量** | 可运行上千个 | 通常几十个 |
> 笔者经常用这个类比来解释虚拟机像是每个应用都住在一栋独立的房子里有自己的地基水电系统而容器像是大家住在同一栋公寓楼里的不同房间共享地基和水电系统但各自独立
> 笔者经常用这个类比来解释虚拟机像是每个应用都住在一栋独立的房子里 (有自己的地基水电系统)而容器像是大家住在同一栋公寓楼里的不同房间 (共享地基和水电系统但各自独立)
### Docker 的技术基础
Docker 使用 [Go 语言](https://golang.google.cn/) 开发,基于 Linux 内核的以下技术:
Docker 使用 [Go 语言](https://golang.google.cn/)开发,基于 Linux 内核的以下技术:
- **[Namespace](https://en.wikipedia.org/wiki/Linux_namespaces)**:实现资源隔离进程、网络、文件系统等
- **[Cgroups](https://zh.wikipedia.org/wiki/Cgroups)**:实现资源限制CPU、内存、I/O 等
- **[Union FS](https://en.wikipedia.org/wiki/Union_mount)**:实现分层存储如 OverlayFS
- **[Namespace](https://en.wikipedia.org/wiki/Linux_namespaces)**:实现资源隔离 (进程、网络、文件系统等)
- **[Cgroups](https://zh.wikipedia.org/wiki/Cgroups)**:实现资源限制 (CPU、内存、I/O 等)
- **[Union FS](https://en.wikipedia.org/wiki/Union_mount)**:实现分层存储 (如 OverlayFS)
> 如果你对这些底层技术感兴趣可以阅读本书的[底层实现](../14_implementation/README.md)章节
#### 概述
总体概述了以下内容
#### Docker 架构演进
Docker 的底层实现经历了多次演进
@@ -95,14 +99,14 @@ flowchart LR
end
```
- **LXC**2013Docker 最初基于 Linux Containers
- **libcontainer**2014v0.7Docker 自研的容器运行时
- **runC**2015v1.11捐献给 OCI 的标准容器运行时
- **LXC** (2013)Docker 最初基于 Linux Containers
- **libcontainer** (2014v0.7)Docker 自研的容器运行时
- **runC** (2015v1.11)捐献给 OCI 的标准容器运行时
- **containerd**高级容器运行时管理容器生命周期
![Docker 架构](../_images/docker-on-linux.png)
> `runc` 是一个 Linux 命令行工具用于根据 [OCI 容器运行时规范](https://github.com/opencontainers/runtime-spec) 创建和运行容器。
> `runc` 是一个 Linux 命令行工具用于根据 [OCI 容器运行时规范](https://github.com/opencontainers/runtime-spec)创建和运行容器。
> `containerd` 是一个守护程序它管理容器生命周期提供了在一个节点上执行容器和管理镜像的最小功能集
@@ -113,8 +117,8 @@ flowchart LR
Docker 的发展历程
- **2013 3 **开源发布
- **2013 年底**dotCloud 公司改名为 Docker, Inc.
- **2015 **成立 [开放容器联盟OCI](https://opencontainers.org/),推动容器标准化
- **至今**[GitHub 项目](https://github.com/moby/moby) 超过 7 万星标
- **2013 年底**dotCloud 公司改名为 DockerInc
- **2015 **成立[开放容器联盟 (OCI)](https://opencontainers.org/),推动容器标准化
- **至今**[GitHub 项目](https://github.com/moby/moby)超过 7 万星标
Docker 的成功推动了整个容器生态的发展催生了 KubernetesPodman 等众多相关项目笔者认为Docker 最大的贡献不仅是技术本身更是它**让容器技术从系统管理员的工具变成了每个开发者都能使用的标准工具**

View File

@@ -1,12 +1,12 @@
## 1.3 为什么要使用 Docker
在回答"为什么用 Docker"之前笔者想先问一个问题**你有没有经历过这些场景**
在回答 为什么用 Docker 之前笔者想先问一个问题**你有没有经历过这些场景**
### 没有 Docker 的世界
Docker 出现之前软件开发和运维面临着诸多棘手的问题我们先来看看以下三个典型的痛点场景
#### 场景一"在我电脑上明明能跑"
#### 场景一在我电脑上明明能跑
具体内容如下
@@ -20,10 +20,10 @@
笔者统计过这个问题通常由以下原因导致
- Python/Node/Java 版本不一致
- 依赖库版本不一致
- 依赖库版本不一致
- 操作系统配置不一致
- 某些环境变量没有设置
- "哦,忘了说我本地装了个 XXX"
- 忘了说我本地装了个 XXX
#### 场景二环境配置的噩梦
@@ -51,7 +51,11 @@
### Docker 如何解决这些问题
Docker 的出现为上述问题提供了完美的解决方案它通过"一次构建,到处运行"的核心理念从根本上改变了软件交付的方式
Docker 的出现为上述问题提供了完美的解决方案它通过 一次构建到处运行 的核心理念从根本上改变了软件交付的方式
#### 概述
总体概述了以下内容
#### 核心理念一次构建到处运行
@@ -74,12 +78,12 @@ flowchart TD
除了解决上述痛点Docker 还拥有诸多显著的技术优势包括环境一致性秒级启动高效的资源利用等
#### 1. 环境一致性
#### 1环境一致性
Docker 镜像包含了应用运行所需的**一切**代码运行时系统工具配置这意味着
- 开发环境和生产环境完全一致
- 不会再有"在我机器上能跑"的问题
- 不会再有 在我机器上能跑 的问题
- 新人入职一条命令就能启动开发环境
```bash
@@ -92,9 +96,9 @@ $ docker compose up
...
```
#### 2. 秒级启动
#### 2秒级启动
传统虚拟机启动需要几分钟引导操作系统 Docker 容器启动通常只需要**几秒甚至几百毫秒**
传统虚拟机启动需要几分钟 (引导操作系统) Docker 容器启动通常只需要**几秒甚至几百毫秒**
笔者实测数据
@@ -109,7 +113,7 @@ $ docker compose up
- **弹性扩容**流量高峰时能快速启动更多实例
- **开发体验**快速重启服务进行调试
#### 3. 资源效率
#### 3资源效率
Docker 容器共享宿主机内核无需为每个应用运行完整的操作系统
@@ -140,7 +144,7 @@ flowchart TD
end
```
#### 4. 持续交付和部署
#### 4持续交付和部署
Docker 完美契合 DevOps 的工作流程
@@ -156,17 +160,17 @@ flowchart LR
- 任何人都能从代码重建完全相同的镜像
- 配合 [GitHub Actions](../15_cases/ci/actions/README.md) CI 系统实现自动化
#### 5. 轻松迁移
#### 5轻松迁移
Docker 可以在几乎任何平台上运行
- 本地开发机macOSWindowsLinux
- 公有云AWSAzureGCP阿里云腾讯云
- 本地开发机 (macOSWindowsLinux)
- 公有云 (AWSAzureGCP阿里云腾讯云)
- 私有云和自建数据中心
- 边缘设备和 IoT
**同一个镜像在任何地方运行结果都一致** 这让应用迁移变得前所未有的简单
**同一个镜像在任何地方运行结果都一致**这让应用迁移变得前所未有的简单
#### 6. 微服务架构的基石
#### 6微服务架构的基石
现代微服务架构几乎都依赖容器技术Docker 让你可以
@@ -200,19 +204,19 @@ flowchart TD
笔者认为技术选型要客观Docker 并非银弹以下场景可能不太适合
#### 1. 需要完全隔离的场景
#### 1需要完全隔离的场景
容器共享宿主机内核隔离性不如虚拟机如果你需要运行不受信任的代码虚拟机可能更安全
#### 2. 需要特殊内核的场景
#### 2需要特殊内核的场景
容器使用宿主机内核如果应用需要特定版本的内核或内核模块可能需要虚拟机
#### 3. Windows 原生应用
#### 3Windows 原生应用
虽然 Docker 支持 Windows 容器但生态不如 Linux 容器成熟传统 Windows 应用的容器化仍有挑战
#### 4. 桌面应用
#### 4桌面应用
Docker 主要面向服务端应用桌面 GUI 应用的容器化虽然可行但通常得不偿失

View File

@@ -8,7 +8,7 @@
* 通过一个简单的 Web 应用例子带你快速体验 Docker 的核心流程构建镜像运行容器
* [什么是 Docker](1.2_what.md)
* 介绍 Docker 的起源发展历程以及其背后的核心技术Cgroups, Namespaces, UnionFS
* 介绍 Docker 的起源发展历程以及其背后的核心技术 (CgroupsNamespacesUnionFS)
* 了解 Docker 是如何改变软件交付方式的
* [为什么要用 Docker](1.3_why.md)

View File

@@ -3,6 +3,6 @@
- Docker 是一种轻量级虚拟化技术核心价值是**环境一致性**
- 与虚拟机相比Docker 更轻量更快速资源利用率更高
- Docker 基于 Linux 内核的 NamespaceCgroups Union FS 技术
- Docker 推动了容器技术的标准化OCI和生态发展
- Docker 推动了容器技术的标准化 (OCI) 和生态发展
Docker 的核心价值可以用一句话概括**让应用的开发测试部署保持一致同时极大提高资源利用效率**笔者认为对于现代软件开发者来说Docker 已经不是"要不要学"的问题而是**必备技能**无论你是前端后端运维还是全栈开发者掌握 Docker 都能让你的工作更高效
Docker 的核心价值可以用一句话概括**让应用的开发测试部署保持一致同时极大提高资源利用效率**笔者认为对于现代软件开发者来说Docker 已经不是 要不要学 的问题而是**必备技能**无论你是前端后端运维还是全栈开发者掌握 Docker 都能让你的工作更高效