From 4b9365198943a8b66cc0dc59e849ad4406116f8f Mon Sep 17 00:00:00 2001 From: yeasy Date: Tue, 21 Apr 2026 14:39:41 -0700 Subject: [PATCH] Refine Docker concepts --- 02_basic_concept/2.1_image.md | 21 +++++++++++---------- 02_basic_concept/2.2_container.md | 22 ++++++++++++---------- 02_basic_concept/2.3_repository.md | 8 +++++--- 02_basic_concept/README.md | 2 -- 02_basic_concept/summary.md | 17 +---------------- 5 files changed, 29 insertions(+), 41 deletions(-) diff --git a/02_basic_concept/2.1_image.md b/02_basic_concept/2.1_image.md index 0c55cce..6fbbb5e 100644 --- a/02_basic_concept/2.1_image.md +++ b/02_basic_concept/2.1_image.md @@ -82,24 +82,24 @@ flowchart TD #### 分层是如何工作的? -笔者用一个实际的 Dockerfile 来解释分层: +笔者用一个更贴近最佳实践的 Dockerfile 来解释分层: ```docker -FROM ubuntu:24.04 # 第 1 层:基础系统(约 78MB) -RUN apt-get update # 第 2 层:更新包索引 -RUN apt-get install nginx # 第 3 层:安装 nginx -COPY app.conf /etc/nginx/ # 第 4 层:复制配置文件 +FROM ubuntu:24.04 # 第 1 层:基础系统(约 78MB) +RUN apt-get update && apt-get install -y nginx # 第 2 层:更新索引并安装 nginx +COPY app.conf /etc/nginx/ # 第 3 层:复制配置文件 ``` +这里特意把 `apt-get update` 和 `apt-get install` 放在同一个 `RUN` 里,避免构建缓存导致包索引过期。 + 构建后的镜像结构: ```mermaid flowchart TD - Layer4["第 4 层: COPY app.conf (只读)
← 最新添加的层"] - Layer3["第 3 层: nginx 安装文件 (只读)"] - Layer2["第 2 层: apt 缓存更新 (只读)"] + Layer3["第 3 层: COPY app.conf (只读)
← 最新添加的层"] + Layer2["第 2 层: nginx 安装文件与包索引 (只读)"] Layer1["第 1 层: Ubuntu 基础系统 (只读)
← 基础镜像层"] - Layer4 --> Layer3 --> Layer2 --> Layer1 + Layer3 --> Layer2 --> Layer1 ``` 每一层的特点: @@ -137,7 +137,7 @@ RUN apt-get update && \ ``` -### 2.1.5 查看镜像的分层 +### 2.1.5 查看镜像的构建历史 ```bash ## 查看镜像的历史(每层的构建记录) @@ -152,6 +152,7 @@ a6bd71f48f68 2 weeks ago CMD ["nginx" "-g" "daemon off;"] 0B 2 weeks ago COPY 30-tune-worker-processes.sh /docker-ent… 4.62kB ... ``` +需要注意:`docker history` 展示的是镜像的构建历史。像 `CMD`、`ENTRYPOINT`、`EXPOSE`、`STOPSIGNAL` 这类 `0B` 项主要是镜像配置元数据,并不等同于新增了可见的文件系统内容;真正占用空间的通常是 `RUN`、`COPY`、`ADD` 等带来的文件变化。 ### 2.1.6 镜像的标识 diff --git a/02_basic_concept/2.2_container.md b/02_basic_concept/2.2_container.md index 5fd9669..0fb11fa 100644 --- a/02_basic_concept/2.2_container.md +++ b/02_basic_concept/2.2_container.md @@ -26,11 +26,11 @@ flowchart TD C1["• 独立进程空间
• 独立网络环境
• 独立文件系统
• 独立用户空间"] end ``` -这种隔离是通过 Linux 内核的 **Namespace** 技术实现的。具体表现为: +这种隔离主要通过 Linux 内核的 **Namespace** 实现,资源限制通常与 **cgroups** 配合。具体表现为: - **进程空间**:容器看不到宿主机上的其他进程。 -- **网络**:容器拥有独立的 IP、端口等网络资源。 +- **网络**:在默认网络模式下,容器通常拥有独立的网络命名空间,并可分配独立 IP;使用 `host` 或 `container:` 等模式时则例外。 - **文件系统**:容器拥有独立的 root 目录。 -- **用户**:容器内的 root 用户不等于宿主机的 root 用户。 +- **用户**:默认情况下,容器内的 `root` 仍是 `uid 0`,但通常只拥有受限 capabilities;如果启用 `userns-remap` 或 rootless 等机制,还会进一步映射为宿主机上的低权限用户。 ### 2.2.3 容器 vs 虚拟机:核心区别 @@ -68,10 +68,10 @@ flowchart TD ``` | 特性 | 容器 | 虚拟机 | |------|------|--------| -| **隔离级别** | 进程级 (Namespace)| 硬件级 (Hypervisor)| -| **启动时间** | 秒级 (甚至毫秒)| 分钟级 | -| **资源占用** | MB 级别 | GB 级别 | -| **性能损耗** | 几乎为零 | 5-20% | +| **隔离级别** | 操作系统级 (Namespaces/cgroups) | 硬件虚拟化级 (Hypervisor) | +| **启动时间** | 通常更快 | 通常更慢 | +| **资源占用** | 通常更低 | 通常更高 | +| **运行开销** | 通常更接近原生 | 通常有更高虚拟化开销 | | **内核** | 共享宿主机内核 | 各自独立内核 | ### 2.2.4 容器的存储层 @@ -147,7 +147,7 @@ $ docker run -v /host/path:/container/path nginx ### 2.2.5 容器的生命周期 -掌握容器的生命周期对于管理和调试 Docker 应用非常重要。如图 2-1 所示,容器会经历从创建到删除的完整状态流转。 +掌握容器的生命周期对于管理和调试 Docker 应用非常重要。如图 2-1 所示,这里先聚焦最常见的创建、运行、暂停、停止和删除流转;Docker CLI 中还可能看到 `restarting`、`removing`、`dead` 等状态。 ```mermaid stateDiagram-v2 @@ -166,7 +166,7 @@ stateDiagram-v2 ``` 图 2-1:容器生命周期状态流转图 -#### 常用生命周期命令 +常用生命周期命令如下: ```bash ## 创建并启动容器(最常用) @@ -211,10 +211,12 @@ $ docker rm -f abc123 # 强制删除运行中的容器 $ docker run ubuntu -## 这个容器会持续运行(nginx 作为守护进程持续运行) +## 这个容器会持续运行(官方 nginx 镜像让 nginx 在前台运行) $ docker run nginx ``` +官方 `nginx` 镜像默认使用 `nginx -g 'daemon off;'`,让主进程保持在前台运行,这样容器才会持续处于运行状态。 + 详细解释请参考[后台运行](../05_container/5.2_daemon.md)章节。 ### 2.2.7 容器的隔离性 diff --git a/02_basic_concept/2.3_repository.md b/02_basic_concept/2.3_repository.md index 0c7dd2a..2b352e6 100644 --- a/02_basic_concept/2.3_repository.md +++ b/02_basic_concept/2.3_repository.md @@ -81,7 +81,7 @@ jwilder/nginx-proxy:latest ## 其他 Registry ghcr.io/username/myapp:v1.0 -gcr.io/google-containers/pause:3.10 +us-west1-docker.pkg.dev/my-project/my-repo/myapp:v1.0 ``` > 💡 **笔者提示**:如果不指定 Registry 地址,默认使用 Docker Hub。如果不指定标签,默认使用 `latest`。 @@ -97,7 +97,7 @@ gcr.io/google-containers/pause:3.10 - 拥有大量[官方镜像](https://hub.docker.com/search?q=&type=image&image_filter=official) (nginx、mysql、redis 等) - 免费账户可以创建公开仓库 -- 付费账户支持私有仓库 +- 免费个人账户可创建 1 个私有仓库;更高套餐支持更多私有仓库 ```bash ## 从 Docker Hub 拉取镜像 @@ -118,11 +118,13 @@ $ docker push username/myapp:v1.0 | Registry | 地址 | 说明 | |----------|------|------| | **GitHub Container Registry** | ghcr.io | GitHub 提供,与 GitHub Actions 集成好 | -| **Google Container Registry** | gcr.io | Google Cloud 提供,Kubernetes 镜像常用 | +| **Google Artifact Registry** | LOCATION-docker.pkg.dev | Google Cloud 当前推荐;也支持迁移后的 `gcr.io` 兼容域名 | | **Quay.io** | quay.io | Red Hat 提供 | | **阿里云容器镜像服务** | registry.cn-*.aliyuncs.com | 国内访问快 | | **腾讯云容器镜像服务** | ccr.ccs.tencentyun.com | 国内访问快 | +Google 的 Container Registry 已废弃并完成下线,当前应优先使用 Artifact Registry;如果已经完成迁移,部分 `gcr.io` 域名请求会被兼容到 Artifact Registry。 + ### 2.3.4 镜像加速器 由于网络原因,在国内直接访问 Docker Hub 可能会很慢。可以配置 **镜像加速器** (Registry Mirror) 来加速下载。配置示例如下: diff --git a/02_basic_concept/README.md b/02_basic_concept/README.md index 93677f7..121ee81 100644 --- a/02_basic_concept/README.md +++ b/02_basic_concept/README.md @@ -8,8 +8,6 @@ 理解了这三个概念,就理解了 **Docker** 的整个生命周期。 -## 本章内容 - * [Docker 镜像](2.1_image.md) * [Docker 容器](2.2_container.md) * [Docker 仓库](2.3_repository.md) diff --git a/02_basic_concept/summary.md b/02_basic_concept/summary.md index a0a8a0a..0bbb891 100644 --- a/02_basic_concept/summary.md +++ b/02_basic_concept/summary.md @@ -19,22 +19,7 @@ | **Docker Hub** | 默认的公共 Registry | | **私有 Registry** | 企业内部使用,推荐 Harbor | -现在你已经了解了 Docker 的三个核心概念:[镜像](2.1_image.md)、[容器](2.2_container.md)和仓库。接下来,让我们开始[安装 Docker](../03_install/README.md),动手实践! - -### 延伸阅读 - -- [获取镜像](../04_image/4.1_pull.md):从 Registry 下载镜像 -- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md):创建自己的镜像 -- [Dockerfile 最佳实践](../appendix/best_practices.md):构建高质量镜像的技巧 -- [底层实现 - 联合文件系统](../12_implementation/12.4_ufs.md):深入理解分层存储的技术原理 -- [启动容器](../05_container/5.1_run.md):详细的容器启动选项 -- [后台运行](../05_container/5.2_daemon.md):理解容器为什么会“立即退出” -- [进入容器](../05_container/5.4_attach_exec.md):如何操作运行中的容器 -- [数据管理](../08_data/README.md):Volume 和数据持久化详解 -- [Docker Hub](../06_repository/6.1_dockerhub.md):Docker Hub 的详细使用 -- [私有仓库](../06_repository/6.2_registry.md):搭建私有 Registry -- [私有仓库高级配置](../06_repository/6.3_registry_auth.md):认证、TLS 配置 -- [镜像加速器](../03_install/3.9_mirror.md):配置镜像加速 +现在你已经了解了 Docker 的三个核心概念:[镜像](2.1_image.md)、[容器](2.2_container.md) 和仓库。接下来,让我们开始 [安装 Docker](../03_install/README.md),动手实践! --- > 📝 **发现错误或有改进建议?** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。