Fix and update

This commit is contained in:
baohua
2026-02-09 11:34:35 -08:00
parent e669ee0fe8
commit 63377d0431
136 changed files with 2146 additions and 262 deletions

View File

@@ -1,5 +1,9 @@
## Docker 镜像
## Docker 镜像
Docker 镜像作为容器运行的基石其设计理念和实现机制至关重要本节将深入探讨镜像的本质与操作系统的关系内容构成以及核心的分层存储机制
### 一句话理解镜像
> **Docker 镜像是一个只读的模板包含了运行应用所需的一切代码运行时环境变量和配置文件**
@@ -46,6 +50,10 @@ Docker 镜像是一个特殊的文件系统,包含:
### 分层存储镜像的核心设计
### 分层存储镜像的核心设计
镜像的分层存储机制是 Docker 最具创新性的特性之一通过 Union FS 技术Docker 能够高效地构建和管理镜像
#### 为什么需要分层
笔者认为分层存储是 Docker 最巧妙的设计之一
@@ -114,16 +122,20 @@ COPY app.conf /etc/nginx/ # 第 4 层:复制配置文件
```docker
## 错误示范 ❌
FROM ubuntu:24.04
RUN apt-get update
RUN apt-get install -y build-essential # 安装编译工具(约 200MB
RUN make && make install # 编译应用
RUN apt-get remove build-essential # 试图删除编译工具
## 结果:镜像仍然包含 200MB 的编译工具!
## 结果:镜像仍然包含 200MB 的编译工具!
```
```docker
## 正确做法 ✅
FROM ubuntu:24.04
RUN apt-get update && \
apt-get install -y build-essential && \
@@ -132,12 +144,17 @@ RUN apt-get update && \
apt-get autoremove -y && \
rm -rf /var/lib/apt/lists/*
## 在同一层完成安装、使用、清理
## 在同一层完成安装、使用、清理
```
#### 查看镜像的分层
运行以下命令
```bash
## 查看镜像的历史(每层的构建记录)
$ docker history nginx:latest
IMAGE CREATED CREATED BY SIZE
@@ -159,13 +176,16 @@ Docker 镜像有多种标识方式:
```bash
## 完整格式
registry.example.com/myproject/myapp:v1.2.3
## 简写(使用 Docker Hub
nginx:1.25
ubuntu:24.04
## 省略标签(默认使用 latest
nginx # 等同于 nginx:latest
```

View File

@@ -1,5 +1,9 @@
## Docker 容器
## Docker 容器
容器是 Docker 技术的核心是应用实际运行的载体本节将从容器的本质与虚拟机的区别存储层机制以及生命周期管理等方面全面解析 Docker 容器
### 一句话理解容器
> **容器是镜像的运行实例如果把镜像比作程序那么容器就是进程**
@@ -69,6 +73,10 @@
### 容器的存储层
### 容器的存储层
理解容器的存储层机制对于数据的持久化和镜像的优化至关重要本节将介绍容器的可写层以及 Copy-on-Write 机制
#### 镜像层 + 容器层
当容器运行时Docker 会在镜像的只读层之上创建一个**可写层**容器存储层
@@ -109,13 +117,17 @@
```bash
## 创建容器,写入数据
$ docker run -it ubuntu bash
root@abc123:/# echo "important data" > /data.txt
root@abc123:/# exit
## 删除容器
$ docker rm abc123
## 数据丢了!没有任何办法恢复!
## 数据丢了!没有任何办法恢复!
```
@@ -130,9 +142,11 @@ $ docker rm abc123
```bash
## 使用数据卷(推荐)
$ docker run -v mydata:/var/lib/mysql mysql
## 使用绑定挂载
$ docker run -v /host/path:/container/path nginx
```
@@ -140,6 +154,10 @@ $ docker run -v /host/path:/container/path nginx
### 容器的生命周期
### 容器的生命周期
掌握容器的生命周期对于管理和调试 Docker 应用非常重要下图展示了容器从创建到删除的完整状态流转
```
┌──────────────────────────────────────────────────┐
│ 容器生命周期 │
@@ -169,23 +187,30 @@ $ docker run -v /host/path:/container/path nginx
#### 常用生命周期命令
运行以下命令
```bash
## 创建并启动容器(最常用)
$ docker run nginx
## 分步操作
$ docker create nginx # 创建容器(不启动)
$ docker start abc123 # 启动容器
## 停止容器
$ docker stop abc123 # 优雅停止(发送 SIGTERM等待后发送 SIGKILL
$ docker kill abc123 # 强制停止(直接发送 SIGKILL
## 暂停/恢复(不常用,但有时有用)
$ docker pause abc123 # 暂停容器内所有进程
$ docker unpause abc123 # 恢复
## 删除容器
$ docker rm abc123 # 删除已停止的容器
$ docker rm -f abc123 # 强制删除运行中的容器
```
@@ -196,6 +221,9 @@ $ docker rm -f abc123 # 强制删除运行中的容器
```bash
## 主进程运行,容器运行
## 主进程退出,容器停止
## 主进程退出,容器停止
```
@@ -203,9 +231,11 @@ $ docker rm -f abc123 # 强制删除运行中的容器
```bash
## 这个容器会立即退出bash 没有输入就退出了)
$ docker run ubuntu
## 这个容器会持续运行nginx 作为守护进程持续运行)
$ docker run nginx
```

View File

@@ -1,5 +1,9 @@
## Docker Registry
## Docker Registry
Docker Registry 是镜像分发和管理的核心组件本节将介绍 Registry 的基本概念公共和私有服务的选择以及镜像的安全管理
### 一句话理解 Registry
> **Docker Registry 是存储和分发 Docker 镜像的服务类似于代码的 GitHub 或包管理的 npm**
@@ -10,6 +14,14 @@
#### Registry仓库标签的关系
### 核心概念
要熟练使用 Docker Registry首先需要理清它与仓库Repository标签Tag之间的关系
#### Registry仓库标签的关系
Docker Registry 中可以包含多个 Repository每个 Repository 可以包含多个 Tag下图清晰地展示了它们之间的层级关系
```
┌─────────────────────────────────────────────────────────────────────┐
│ Docker Registry │
@@ -39,6 +51,10 @@
#### 镜像的完整名称
#### 镜像的完整名称
一个完整的 Docker 镜像名称由 Registry 地址用户名/组织名仓库名和标签组成了解其结构有助于我们更准确地定位镜像
```
[registry地址/][用户名/]仓库名[:标签]
```
@@ -47,6 +63,7 @@
```bash
## 完整格式
registry.example.com/mycompany/myapp:v1.2.3
│ │ │ │
│ │ │ └── 标签
@@ -55,13 +72,16 @@ registry.example.com/mycompany/myapp:v1.2.3
└── Registry 地址
## Docker Hub 官方镜像(省略 registry 和用户名)
nginx:1.25
ubuntu:24.04
## Docker Hub 用户镜像
jwilder/nginx-proxy:latest
## 其他 Registry
ghcr.io/username/myapp:v1.0
gcr.io/google-containers/pause:3.6
```
@@ -70,6 +90,10 @@ gcr.io/google-containers/pause:3.6
### 公共 Registry 服务
### 公共 Registry 服务
公共 Registry 服务为开发者提供了便捷的镜像获取途径其中最著名的是 Docker Hub
#### Docker Hub默认
[Docker Hub](https://hub.docker.com/) 是最大的公共 Registry也是 Docker 的默认 Registry。
@@ -81,10 +105,12 @@ gcr.io/google-containers/pause:3.6
```bash
## 从 Docker Hub 拉取镜像
$ docker pull nginx # 官方镜像
$ docker pull bitnami/redis # 第三方镜像
## 推送镜像到 Docker Hub
$ docker login
$ docker push username/myapp:v1.0
```
@@ -118,7 +144,9 @@ $ docker push username/myapp:v1.0
### 私有 Registry
对于企业用户通常需要搭建私有 Registry 来存储内部镜像
出于安全和隐私的考虑企业往往需要搭建自己的私有 Registry以下是几种常见的搭建方案
#### 官方 Registry 镜像
#### 官方 Registry 镜像
@@ -126,13 +154,16 @@ Docker 官方提供了 [registry](https://hub.docker.com/_/registry/) 镜像,
```bash
## 启动一个本地 Registry
$ docker run -d -p 5000:5000 --name registry registry:2
## 推送镜像到本地 Registry
$ docker tag myapp:v1.0 localhost:5000/myapp:v1.0
$ docker push localhost:5000/myapp:v1.0
## 从本地 Registry 拉取
$ docker pull localhost:5000/myapp:v1.0
```
@@ -155,6 +186,14 @@ $ docker pull localhost:5000/myapp:v1.0
#### 完整工作流程
### 镜像的推送和拉取
掌握镜像的推送Push和拉取Pull是使用 Docker Registry 的基本功
#### 完整工作流程
下图展示了从开发环境构建镜像推送到 Registry再到生产环境拉取运行的完整流程
```
开发者机器 Registry 生产服务器
│ │ │
@@ -173,37 +212,50 @@ $ docker pull localhost:5000/myapp:v1.0
#### 常用命令
运行以下命令
```bash
## 登录 Registry
$ docker login # 登录 Docker Hub
$ docker login registry.example.com # 登录其他 Registry
## 拉取镜像
$ docker pull nginx:1.25
## 标记镜像(准备推送)
$ docker tag myapp:latest registry.example.com/myteam/myapp:v1.0
## 推送镜像
$ docker push registry.example.com/myteam/myapp:v1.0
## 登出
$ docker logout
```
### 镜像的安全性
### 镜像的安全性
在使用公共镜像或维护私有镜像时安全性是不容忽视的重要环节
#### 使用官方镜像
Docker Hub [官方镜像](https://hub.docker.com/search?q=&type=image&image_filter=official)(标有 "Official Image" 标识)经过 Docker 团队审核,相对更安全。
```bash
## 官方镜像示例
nginx # ✅ 官方
mysql # ✅ 官方
redis # ✅ 官方
## 第三方镜像(需要自行评估可信度)
bitnami/redis # ⚠️ 需要评估
someuser/myapp # ⚠️ 需要评估
```
@@ -214,19 +266,25 @@ someuser/myapp # ⚠️ 需要评估
```bash
## 启用镜像签名验证
$ export DOCKER_CONTENT_TRUST=1
## 此后的 pull/push 会验证签名
$ docker pull nginx:latest
```
#### 漏洞扫描
运行以下命令
```bash
## 使用 Docker Scout 扫描镜像漏洞
$ docker scout cves nginx:latest
## 使用 Trivy开源工具
$ trivy image nginx:latest
```