mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 08:27:25 +00:00
Refine Docker concepts
This commit is contained in:
@@ -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 (只读)<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 镜像的标识
|
||||
|
||||
|
||||
@@ -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 容器的隔离性
|
||||
|
||||
@@ -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) 来加速下载。配置示例如下:
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
|
||||
理解了这三个概念,就理解了 **Docker** 的整个生命周期。
|
||||
|
||||
## 本章内容
|
||||
|
||||
* [Docker 镜像](2.1_image.md)
|
||||
* [Docker 容器](2.2_container.md)
|
||||
* [Docker 仓库](2.3_repository.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)。
|
||||
|
||||
Reference in New Issue
Block a user