Refine Docker concepts

This commit is contained in:
yeasy
2026-04-21 14:39:41 -07:00
parent b3d1508310
commit 4b93651989
5 changed files with 29 additions and 41 deletions
+10 -9
View File
@@ -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 层:复制配置文件
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 (只读)<br/>← 最新添加的层"]
Layer3["第 3 层: nginx 安装文件 (只读)"]
Layer2["第 2 层: apt 缓存更新 (只读)"]
Layer3["第 3 层: COPY app.conf (只读)<br/>← 最新添加的层"]
Layer2["第 2 层: nginx 安装文件与包索引 (只读)"]
Layer1["第 1 层: Ubuntu 基础系统 (只读)<br/>← 基础镜像层"]
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
<missing> 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 镜像的标识
+12 -10
View File
@@ -26,11 +26,11 @@ flowchart TD
C1["• 独立进程空间<br/>• 独立网络环境<br/>• 独立文件系统<br/>• 独立用户空间"]
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 容器的隔离性
+5 -3
View File
@@ -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) 来加速下载配置示例如下
-2
View File
@@ -8,8 +8,6 @@
理解了这三个概念就理解了 **Docker** 的整个生命周期
## 本章内容
* [Docker 镜像](2.1_image.md)
* [Docker 容器](2.2_container.md)
* [Docker 仓库](2.3_repository.md)
+1 -16
View File
@@ -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)。