Simplify words and fix format issues

This commit is contained in:
Baohua Yang
2026-02-24 22:01:02 -08:00
parent c44cbfcd62
commit d6e0838807
124 changed files with 45 additions and 1073 deletions

24
.github/CODEOWNERS vendored
View File

@@ -9,15 +9,21 @@
/05_container/* @yeasy @khs1994
/06_repository/* @khs1994
/07_dockerfile/* @yeasy @khs1994
/08_data_network/* @yeasy @khs1994
/09_buildx/* @khs1994
/10_compose/* @yeasy @khs1994
/11_ops/* @yeasy @khs1994
/12_orchestration/* @yeasy @khs1994
/13_ecosystem/* @khs1994
/14_implementation/* @yeasy @khs1994
/15_cases/* @yeasy @khs1994
/16_appendix/* @yeasy @khs1994
/08_data/* @yeasy @khs1994
/09_network/* @yeasy @khs1994
/10_buildx/* @khs1994
/11_compose/* @yeasy @khs1994
/12_implementation/* @yeasy @khs1994
/13_kubernetes_concepts/* @yeasy @khs1994
/14_kubernetes_setup/* @yeasy @khs1994
/15_etcd/* @yeasy @khs1994
/16_cloud/* @khs1994
/17_ecosystem/* @khs1994
/18_security/* @yeasy @khs1994
/19_observability/* @yeasy @khs1994
/20_cases_os/* @yeasy @khs1994
/21_case_devops/* @yeasy @khs1994
/appendix/* @yeasy @khs1994
/.drone.yml @khs1994
/.editorconfig/ @khs1994
/.gitattributes @khs1994

View File

@@ -36,9 +36,4 @@ about: Create a report to help us improve
<!--describe problem with detailed steps and logs-->
<!--提交问题之前请点击预览标签符合要求之后再提交问题-->

View File

@@ -36,9 +36,4 @@ about: Create a issue about Docker
<!--describe problem with detailed steps and logs-->
<!--提交问题之前请点击预览标签符合要求之后再提交问题-->

View File

@@ -82,25 +82,15 @@ jobs:
cp -r _images .vuepress/dist
mkdir -p .vuepress/dist/appendix
cp -r 16_appendix/_images .vuepress/dist/appendix
mkdir -p .vuepress/dist/cases/ci/drone
cp -r 15_cases/ci/drone/_images .vuepress/dist/cases/ci/drone
mkdir -p .vuepress/dist/cases/os
cp -r 15_cases/os/_images .vuepress/dist/cases/os
cp -r appendix/_images .vuepress/dist/appendix
mkdir -p .vuepress/dist/cloud
cp -r 13_ecosystem/cloud/_images .vuepress/dist/cloud
cp -r 16_cloud/_images .vuepress/dist/cloud
mkdir -p .vuepress/dist/data_management
cp -r 08_data_network/data/_images .vuepress/dist/data_management
cp -r 08_data/_images .vuepress/dist/data_management
mkdir -p .vuepress/dist/etcd
cp -r 12_orchestration/etcd/_images .vuepress/dist/etcd
mkdir -p .vuepress/dist/image
cp -r 04_image/_images .vuepress/dist/image
mkdir -p .vuepress/dist/install
cp -r 03_install/_images .vuepress/dist/install
cp -r 15_etcd/_images .vuepress/dist/etcd
mkdir -p .vuepress/dist/kubernetes
cp -r 12_orchestration/kubernetes/_images .vuepress/dist/kubernetes
mkdir -p .vuepress/dist/underly
cp -r 14_implementation/_images .vuepress/dist/underly
cp -r 13_kubernetes_concepts/_images .vuepress/dist/kubernetes
echo "include: [_images]" > .vuepress/dist/_config.yml
- name: Upload Vuepress dist

View File

@@ -60,8 +60,6 @@ flowchart LR
#### 关键区别
相关信息如下表
| 特性 | Docker 容器 | 传统虚拟机 |
|------|-------------|------------|
| **启动速度** | 秒级 | 分钟级 |
@@ -82,10 +80,6 @@ Docker 使用 [Go 语言](https://golang.google.cn/)开发,基于 Linux 内核
> 如果你对这些底层技术感兴趣可以阅读本书的[底层实现](../12_implementation/README.md)章节
#### 概述
总体概述了以下内容
#### Docker 架构演进
Docker 的底层实现经历了多次演进

View File

@@ -8,8 +8,6 @@
#### 场景一在我电脑上明明能跑
具体内容如下
```bash
周五下午 5:00
├── 开发者:代码写完了,本地测试通过,提交!🎉
@@ -28,8 +26,6 @@
#### 场景二环境配置的噩梦
具体内容如下
```bash
新同事入职
├── Day 1领电脑配环境
@@ -41,8 +37,6 @@
#### 场景三服务器迁移的恐惧
具体内容如下
```bash
运维:"我们需要把服务迁移到新服务器"
开发:"旧服务器上的配置文档在哪?"
@@ -54,14 +48,8 @@
Docker 的出现为上述问题提供了完美的解决方案它通过 一次构建到处运行 的核心理念从根本上改变了软件交付的方式
#### 概述
总体概述了以下内容
#### 核心理念一次构建到处运行
具体内容如下
```mermaid
flowchart LR
dev["开发团队"] -->|创建| img["Docker 镜像"]
@@ -158,7 +146,7 @@ flowchart LR
- 构建过程 **可重复可追溯**
- 任何人都能从代码重建完全相同的镜像
- 配合 [GitHub Actions](../20_cases/ci/actions/README.md) CI 系统实现自动化
- 配合 [GitHub Actions](../21_case_devops/21.2_github_actions.md) CI 系统实现自动化
#### 5. 轻松迁移

View File

@@ -39,7 +39,9 @@ Docker 镜像是一个特殊的文件系统,包含:
| **库文件** | libcOpenSSL各种依赖库 |
| **配置文件** | nginx.confmy.cnf |
| **环境变量** | PATHLANG 等预设值 |
| **元数据**| 启动命令暴露端口数据卷定义 |**关键特性**
| **元数据** | 启动命令暴露端口数据卷定义 |
**关键特性**
- 镜像是 **只读**
- 镜像 **不包含** 动态数据
- 镜像构建后 **内容不会改变**
@@ -140,8 +142,6 @@ RUN apt-get update && \
#### 查看镜像的分层
运行以下命令
```bash
## 查看镜像的历史(每层的构建记录)

View File

@@ -12,7 +12,7 @@
### 2.2.2 容器的本质
> 💡 **笔者认为理解这一点是理解 Docker 的关键****容器的本质是一个特殊的进程**
> 💡 **笔者认为理解这一点是理解 Docker 的关键** **容器的本质是一个特殊的进程**
```mermaid
flowchart TD
@@ -166,14 +166,8 @@ stateDiagram-v2
2-1 容器生命周期状态流转图
#### 概述
总体概述了以下内容
#### 常用生命周期命令
运行以下命令
```bash
## 创建并启动容器(最常用)

View File

@@ -210,8 +210,6 @@ $ docker pull localhost:5000/myapp:v1.0
#### 常用命令
运行以下命令
```bash
## 登录 Registry
@@ -279,8 +277,6 @@ $ cosign verify --key cosign.pub $IMAGE
#### 漏洞扫描
运行以下命令
```bash
## 使用 Docker Scout 扫描镜像漏洞

View File

@@ -1,4 +1,4 @@
# 第二章基本概念
# 第二章 基本概念
**Docker** 包括三个基本概念

View File

@@ -1,7 +1,5 @@
## 2.4 本章小结
相关信息如下表
| 概念 | 要点 |
|------|------|
| **镜像是什么** | 只读的应用模板包含运行所需的一切 |

View File

@@ -86,10 +86,6 @@ $ echo \
>以上命令会添加稳定版本的 Docker APT 镜像源如果需要测试版本的 Docker 请将 stable 改为 test
#### 概述
总体概述了以下内容
#### 安装 Docker
更新 apt 软件包缓存并安装 `docker-ce`
@@ -119,8 +115,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
### 3.1.4 启动 Docker
运行以下命令
```bash
$ sudo systemctl enable docker
$ sudo systemctl start docker
@@ -146,8 +140,6 @@ $ sudo usermod -aG docker $USER
### 3.1.6 测试 Docker 是否安装正确
运行以下命令
```bash
$ docker run --rm hello-world

View File

@@ -77,10 +77,6 @@ $ echo \
>以上命令会添加稳定版本的 Docker APT 如果需要测试版本的 Docker 请将 stable 改为 testDebian11 可能不使用 `/etc/apt/keyrings/` gpg 错误可以考虑更换为 `/etc/apt/trusted.gpg.d` [issue 15727](https://github.com/docker/docs/issues/15727)。
#### 概述
总体概述了以下内容
#### 安装 Docker
更新 apt 软件包缓存并安装 `docker-ce`
@@ -110,8 +106,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
### 3.2.4 启动 Docker
运行以下命令
```bash
$ sudo systemctl enable docker
$ sudo systemctl start docker
@@ -137,8 +131,6 @@ $ sudo usermod -aG docker $USER
### 3.2.6 测试 Docker 是否安装正确
运行以下命令
```bash
$ docker run --rm hello-world

View File

@@ -76,10 +76,6 @@ $ sudo dnf config-manager --set-enabled docker-ce-test
$ sudo dnf config-manager --set-disabled docker-ce-test
```
#### 概述
总体概述了以下内容
#### 安装 Docker
更新 `dnf` 软件源缓存并安装 `docker-ce`
@@ -118,8 +114,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
### 3.3.4 启动 Docker
运行以下命令
```bash
$ sudo systemctl enable docker
$ sudo systemctl start docker
@@ -145,8 +139,6 @@ $ sudo usermod -aG docker $USER
### 3.3.6 测试 Docker 是否安装正确
运行以下命令
```bash
$ docker run --rm hello-world

View File

@@ -72,10 +72,6 @@ $ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.r
$ sudo dnf config-manager --set-enabled docker-ce-test
```
#### 概述
总体概述了以下内容
#### 安装 Docker
更新 `dnf` 软件源缓存并安装 `docker-ce`
@@ -123,8 +119,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
### 3.4.5 启动 Docker
运行以下命令
```bash
$ sudo systemctl enable docker
$ sudo systemctl start docker
@@ -150,8 +144,6 @@ $ sudo usermod -aG docker $USER
### 3.4.7 测试 Docker 是否安装正确
运行以下命令
```bash
$ docker run --rm hello-world

View File

@@ -133,8 +133,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
### 3.5.4 启动 Docker
运行以下命令
```bash
$ sudo systemctl enable docker
$ sudo systemctl start docker
@@ -160,8 +158,6 @@ $ sudo usermod -aG docker $USER
### 3.5.6 测试 Docker 是否安装正确
运行以下命令
```bash
$ docker run --rm hello-world

View File

@@ -10,8 +10,6 @@
### 3.6.1 概述
总体概述了以下内容
### 3.6.2 CentOS/Rocky/AlmaLinux 离线安装 Docker
在无法连接外网的安全环境中离线安装是唯一的选择本节介绍如何在 RHEL 系发行版中进行离线安装
@@ -24,8 +22,6 @@
##### 查询可用的软件版本
运行以下命令
```bash
#下载清华的镜像源文件
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
@@ -53,8 +49,6 @@ docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
##### 下载到指定文件夹
运行以下命令
```bash
sudo yum install --downloadonly --downloaddir=/tmp/docker24_offline_install/ docker-ce-24.0.4-1.el7 docker-ce-cli-24.0.4-1.el7
```
@@ -155,12 +149,8 @@ sudo yum versionlock delete all
#### YUM 本地源服务器搭建安装 Docker
本节涵盖了相关内容与详细描述主要探讨以下几个方面
##### 挂载 ISO 镜像搭建本地 File
运行以下命令
```bash
## 删除其他网络源
@@ -192,8 +182,6 @@ yum install createrepo -y
##### 根据本地文件搭建 BASE 网络源
运行以下命令
```bash
## 安装apache 服务器
@@ -246,8 +234,6 @@ createrepo /var/www/html/docker-ce/
##### YUM 客户端设置 (C...N)
运行以下命令
```bash
rm -f /etc/yum.repos.d/*
cat >/etc/yum.repos.d/local_files.repo<< EOF
@@ -273,8 +259,6 @@ EOF
##### Docker 安装 (C...N)
运行以下命令
```bash
sudo yum makecache fast
sudo yum install docker-ce docker-ce-cli containerd.io

View File

@@ -1,7 +1,5 @@
## 3.7 macOS
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 3.7.1 系统要求
[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS Sonora 14.0 或更高版本,建议升级到最新版本的 macOS。

View File

@@ -1,13 +1,9 @@
# 第三章安装 Docker
# 第三章 安装 Docker
Docker 分为 `stable` `test` `nightly` 三个更新频道
官方网站上有各种环境下的[安装指南](https://docs.docker.com/get-docker/),这里主要介绍 Docker 在 `Linux`、`Windows 10` 和 `macOS` 上的安装。
## 概述
总体概述了以下内容
## 详细安装指南
* [Ubuntu](3.1_ubuntu.md)

View File

@@ -31,8 +31,6 @@ Registry地址 用户名 仓库名 标签
#### 示例
运行以下命令
```bash
## 完整格式
@@ -65,8 +63,6 @@ $ docker pull ghcr.io/username/myapp:v1.0
当我们执行 `docker pull` 命令时Docker 会输出详细的下载进度让我们以 `ubuntu:24.04` 为例来解析这些信息
运行以下命令
```bash
$ docker pull ubuntu:24.04
24.04: Pulling from library/ubuntu
@@ -80,8 +76,6 @@ docker.io/library/ubuntu:24.04
#### 输出解读
相关信息如下表
| 输出内容 | 说明 |
|---------|------|
| `Pulling from library/ubuntu` | 正在从官方 ubuntu 仓库拉取 |
@@ -118,10 +112,6 @@ flowchart TD
| `--platform` | 指定平台架构 | `docker pull --platform linux/arm64 nginx` |
| `--quiet, -q` | 静默模式 | `docker pull -q nginx` |
#### 概述
总体概述了以下内容
#### 指定平台
Apple Silicon Mac 上拉取 x86 镜像
@@ -196,8 +186,6 @@ $ sudo systemctl restart docker # Linux
#### 查看镜像摘要
运行以下命令
```bash
$ docker images --digests ubuntu
REPOSITORY TAG DIGEST IMAGE ID
@@ -228,8 +216,6 @@ $ docker pull ubuntu@sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9
#### Q提示镜像不存在
运行以下命令
```bash
Error: pull access denied, repository does not exist
```
@@ -242,8 +228,6 @@ Error: pull access denied, repository does not exist
#### Q磁盘空间不足
运行以下命令
```bash
## 清理未使用的镜像

View File

@@ -31,10 +31,6 @@ ubuntu noble 329ed837d508 3 days ago 78MB
| **CREATED** | 创建时间 |
| **SIZE** | 本地占用空间 |
#### 概述
总体概述了以下内容
#### 同一镜像多个标签
注意上面的 `ubuntu:24.04` `ubuntu:noble` 拥有相同的 IMAGE ID它们是同一个镜像的不同标签只占用一份存储空间
@@ -47,8 +43,6 @@ Docker 镜像的大小可能与我们通常理解的文件大小有所不同,
#### 本地大小 vs Hub 显示大小
相关信息如下表
| 位置 | 显示大小 | 说明 |
|------|---------|------|
| Docker Hub | 29MB | 压缩后的网络传输大小 |
@@ -70,8 +64,6 @@ ubuntu:24.04 nginx:latest redis:latest
#### 查看实际空间占用
运行以下命令
```bash
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
@@ -89,8 +81,6 @@ Build Cache 0 0 0B 0B
#### 按仓库名过滤
运行以下命令
```bash
## 列出所有 ubuntu 镜像
@@ -103,8 +93,6 @@ ubuntu 22.04 a1b2c3d4e5f6 72MB
#### 按仓库名和标签过滤
运行以下命令
```bash
$ docker images ubuntu:24.04
REPOSITORY TAG IMAGE ID SIZE
@@ -113,8 +101,6 @@ ubuntu 24.04 329ed837d508 78MB
#### 使用过滤器 --filter
相关信息如下表
| 过滤条件 | 说明 | 示例 |
|---------|------|------|
| `dangling=true` | 虚悬镜像 | `-f dangling=true` |
@@ -160,8 +146,6 @@ REPOSITORY TAG IMAGE ID SIZE
#### 处理虚悬镜像
运行以下命令
```bash
## 列出虚悬镜像
@@ -178,14 +162,8 @@ $ docker image prune
除了虚悬镜像`docker image ls` 默认列出的只是顶层镜像还有一种镜像是为了加速镜像构建重复利用资源而存在的中间层镜像
#### 概述
总体概述了以下内容
#### 查看所有镜像 (包含中间层)
运行以下命令
```bash
$ docker images -a
```
@@ -202,8 +180,6 @@ $ docker images -a
#### 只输出 ID
运行以下命令
```bash
$ docker images -q
5f515359c7f8
@@ -225,16 +201,12 @@ $ docker rmi $(docker images -q redis)
#### 显示完整 ID
运行以下命令
```bash
$ docker images --no-trunc
```
#### 显示摘要
运行以下命令
```bash
$ docker images --digests
REPOSITORY TAG DIGEST IMAGE ID
@@ -264,8 +236,6 @@ ubuntu 24.04 78MB
#### 可用模板字段
相关信息如下表
| 字段 | 说明 |
|------|------|
| `.ID` | 镜像 ID |
@@ -280,8 +250,6 @@ ubuntu 24.04 78MB
### 4.2.8 常用命令组合
运行以下命令
```bash
## 列出所有镜像及其大小,按大小排序(需要系统 sort 命令)

View File

@@ -27,8 +27,6 @@ $ docker image rm [选项] <镜像1> [<镜像2> ...]
#### 使用短 ID 删除
运行以下命令
```bash
$ docker image ls
REPOSITORY TAG IMAGE ID SIZE
@@ -44,8 +42,6 @@ Deleted: sha256:501ad78535f0...
#### 使用镜像名删除
运行以下命令
```bash
$ docker rmi redis:alpine
Untagged: redis:alpine
@@ -87,8 +83,6 @@ Deleted: sha256:32770d1dcf835f192cafd6b9263b7b597a1778a403a109e2cc2ee866f74adf23
#### Untagged vs Deleted
相关信息如下表
| 操作 | 含义 |
|------|------|
| **Untagged** | 移除镜像的标签 |
@@ -146,8 +140,6 @@ $ docker image prune -f
#### 删除所有未使用的镜像
运行以下命令
```bash
## 删除所有没有被容器使用的镜像
@@ -160,8 +152,6 @@ $ docker image prune -a --filter "until=24h"
#### 按条件删除
运行以下命令
```bash
## 删除所有 redis 镜像
@@ -184,8 +174,6 @@ $ docker image prune -a --filter "until=168h" # 7天前
#### 原因一有容器依赖
运行以下命令
```bash
$ docker rmi nginx
Error: conflict: unable to remove repository reference "nginx"
@@ -207,8 +195,6 @@ $ docker rmi -f nginx
#### 原因二多个标签指向同一镜像
运行以下命令
```bash
$ docker images
REPOSITORY TAG IMAGE ID
@@ -225,8 +211,6 @@ Untagged: ubuntu:24.04
#### 原因三被其他镜像依赖 (中间层)
运行以下命令
```bash
$ docker rmi some_base_image
Error: image has dependent child images
@@ -238,8 +222,6 @@ Error: image has dependent child images
### 4.3.6 常用过滤条件
相关信息如下表
| 过滤条件 | 说明 | 示例 |
|---------|------|------|
| `dangling=true` | 虚悬镜像 | `-f dangling=true` |
@@ -256,8 +238,6 @@ Error: image has dependent child images
#### 开发环境
运行以下命令
```bash
## 定期清理虚悬镜像
@@ -270,8 +250,6 @@ $ docker system prune -a
#### CI/CD 环境
运行以下命令
```bash
## 只保留最近使用的镜像
@@ -280,8 +258,6 @@ $ docker image prune -a --filter "until=72h" -f
#### 查看空间占用
运行以下命令
```bash
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE

View File

@@ -122,8 +122,6 @@ docker run --name web2 -d -p 81:80 nginx:v2
### 4.4.1 概述
总体概述了以下内容
### 4.4.2 慎用 `docker commit`
使用 `docker commit` 命令虽然可以比较直观的帮助理解镜像分层存储的概念但是实际环境中并不会这样使用

View File

@@ -146,8 +146,6 @@ Sending build context to Docker daemon 2.048 kB
### 4.5.7 其它 `docker build` 的用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 直接用 Git repo 进行构建
或许你已经注意到了`docker build` 还支持从 URL 构建比如可以直接从 Git repo 中构建
@@ -174,8 +172,6 @@ Successfully built 038ad4142d2b
#### 用给定的 tar 压缩包构建
运行以下命令
```bash
$ docker build http://server/context.tar.gz
```
@@ -184,8 +180,6 @@ $ docker build http://server/context.tar.gz
#### 从标准输入中读取 Dockerfile 进行构建
运行以下命令
```bash
docker build - < Dockerfile
```
@@ -200,8 +194,6 @@ cat Dockerfile | docker build -
#### 从标准输入中读取上下文压缩包进行构建
运行以下命令
```bash
$ docker build - < context.tar.gz
```

View File

@@ -41,10 +41,6 @@ f477a6e18e98 About a minute ago 214.9 MB
Docker 还提供了 `docker save` `docker load` 命令用以将镜像保存为一个文件然后传输到另一个位置上再加载进来这是在没有 Docker Registry 时的做法现在已经不推荐镜像迁移应该直接使用 Docker Registry无论是直接使用 Docker Hub 还是使用内网私有 Registry 都可以
#### 概述
总体概述了以下内容
#### 保存镜像
使用 `docker save` 命令可以将镜像保存为归档文件

View File

@@ -1,13 +1,9 @@
# 第四章使用镜像
# 第四章 使用镜像
在之前的介绍中我们知道镜像是 Docker 的三大组件之一
Docker 运行容器前需要本地存在对应的镜像如果本地不存在该镜像Docker 会从镜像仓库下载该镜像
## 概述
总体概述了以下内容
## 本章内容
本章将介绍更多关于镜像的内容包括

View File

@@ -1,7 +1,5 @@
## 4.8 本章小结
相关信息如下表
| 操作 | 命令 |
|------|------|
| 拉取镜像 | `docker pull 镜像名:标签` |
@@ -16,8 +14,6 @@
- [镜像加速器](../03_install/3.9_mirror.md)加速镜像下载
- [Docker Hub](../06_repository/6.1_dockerhub.md)官方镜像仓库
相关信息如下表
| 操作 | 命令 |
|------|------|
| 列出所有镜像 | `docker images` |
@@ -34,8 +30,6 @@
- [删除镜像](4.3_rm.md)清理本地镜像
- [镜像](../02_basic_concept/2.1_image.md)理解镜像概念
相关信息如下表
| 操作 | 命令 |
|------|------|
| 删除指定镜像 | `docker rmi 镜像名:标签` |

View File

@@ -13,12 +13,8 @@
### 5.1.2 新建并启动
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基本语法
运行以下命令
```bash
docker run [选项] 镜像 [命令] [参数...]
```
@@ -84,12 +80,8 @@ flowchart TD
### 5.1.4 常用启动选项
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基础选项
相关信息如下表
| 选项 | 说明 | 示例 |
|------|------|------|
| `-d` | 后台运行 (detach)| `docker run -d nginx` |
@@ -99,8 +91,6 @@ flowchart TD
#### 端口映射
运行以下命令
```bash
## 将容器的 80 端口映射到宿主机的 8080 端口
@@ -117,8 +107,6 @@ $ docker run -d -p 127.0.0.1:8080:80 nginx
#### 数据卷挂载
运行以下命令
```bash
## 挂载命名卷
@@ -135,8 +123,6 @@ $ docker run -v /host/path:/container/path:ro nginx
#### 环境变量
运行以下命令
```bash
## 设置单个环境变量
@@ -149,8 +135,6 @@ $ docker run --env-file .env myapp
#### 资源限制
运行以下命令
```bash
## 限制内存
@@ -198,8 +182,6 @@ root@ba267838cc1b:/# ps
### 5.1.7 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器启动后立即退出
**原因**主进程执行完毕或无法保持运行

View File

@@ -13,12 +13,8 @@ Docker 容器默认是 **前台运行** 的。使用 `-d` (detach) 参数可以
### 5.2.2 基本使用
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 前台运行 (默认)
运行以下命令
```bash
$ docker run ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
@@ -35,8 +31,6 @@ hello world
#### 后台运行 (使用 -d 参数)
运行以下命令
```bash
$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
@@ -89,8 +83,6 @@ flowchart TD
#### 常见的 立即退出 场景
相关信息如下表
| 场景 | 原因 | 解决方案 |
|------|------|---------|
| `docker run -d ubuntu` | 默认 bash 无输入立即退出 | 指定长期运行的命令 |
@@ -99,12 +91,8 @@ flowchart TD
### 5.2.4 查看后台容器
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 查看运行中的容器
运行以下命令
```bash
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
@@ -113,8 +101,6 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS PO
#### 查看容器输出日志
运行以下命令
```bash
$ docker container logs 77b2dc01fe0f
hello world
@@ -131,8 +117,6 @@ $ docker container logs -f 77b2dc01fe0f
#### 查看已停止的容器
运行以下命令
```bash
$ docker container ls -a
```
@@ -141,12 +125,8 @@ $ docker container ls -a
### 5.2.5 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 长期运行的服务使用 -d
运行以下命令
```bash
## Web 服务器
@@ -185,8 +165,6 @@ Hello, World!
#### 4. 配合日志查看
运行以下命令
```bash
## 后台启动
@@ -207,8 +185,6 @@ $ docker logs -t myapp
### 5.2.6 常见问题排查
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器启动后立即退出
1. **查看退出状态码**

View File

@@ -16,20 +16,14 @@
### 5.3.2 docker stop (推荐)
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### docker stop 基本用法
运行以下命令
```bash
$ docker stop 容器名或ID
```
#### 工作原理
具体内容如下
```mermaid
flowchart TD
cmd["docker stop mycontainer"] --> A["1. 发送 SIGTERM 信号给容器主进程 (PID 1)"]
@@ -39,8 +33,6 @@ flowchart TD
#### 自定义超时时间
运行以下命令
```bash
## 等待 30 秒后强制终止
@@ -53,8 +45,6 @@ $ docker stop -t 0 mycontainer
#### 停止多个容器
运行以下命令
```bash
## 停止多个指定容器
@@ -69,20 +59,14 @@ $ docker stop $(docker ps -q)
### 5.3.3 docker kill
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基本用法
运行以下命令
```bash
$ docker kill 容器名或ID
```
#### stop 的区别
相关信息如下表
| 命令 | 信号 | 使用场景 |
|------|------|---------|
| `docker stop` | SIGTERM SIGKILL | 正常停止让应用优雅退出 |
@@ -90,8 +74,6 @@ $ docker kill 容器名或ID
#### 发送自定义信号
运行以下命令
```bash
## 发送 SIGHUP让进程重新加载配置
@@ -123,8 +105,6 @@ $ docker run ubuntu echo "Hello" # echo 执行完 → 容器停止
### 5.3.5 查看已停止的容器
运行以下命令
```bash
$ docker ps -a
CONTAINER ID IMAGE COMMAND STATUS NAMES
@@ -146,12 +126,8 @@ c5d3a5e8f7b2 nginx "nginx" Up 5 minutes mynginx
### 5.3.6 重新启动容器
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 启动已停止的容器
运行以下命令
```bash
$ docker start 容器名或ID
@@ -162,8 +138,6 @@ $ docker start -ai 容器名
#### 重启运行中的容器
运行以下命令
```bash
## 先停止再启动
@@ -178,8 +152,6 @@ $ docker restart -t 30 容器名
### 5.3.7 生命周期状态图
具体内容如下
```mermaid
stateDiagram-v2
direction TB
@@ -200,28 +172,20 @@ stateDiagram-v2
### 5.3.8 批量操作
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 停止所有容器
运行以下命令
```bash
$ docker stop $(docker ps -q)
```
#### 删除所有已停止的容器
运行以下命令
```bash
$ docker container prune
```
#### 停止并删除所有容器
运行以下命令
```bash
$ docker stop $(docker ps -q) && docker container prune -f
```
@@ -230,8 +194,6 @@ $ docker stop $(docker ps -q) && docker container prune -f
### 5.3.9 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器停止很慢
原因应用没有正确处理 SIGTERM 信号需要等待超时后强制终止
@@ -258,8 +220,6 @@ CMD ["node", "server.js"]
#### Q容器无法停止
运行以下命令
```bash
## 强制终止

View File

@@ -1,7 +1,5 @@
## 5.4 进入容器
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 5.4.1 为什么需要进入容器
使用 `-d` 参数启动容器后容器在后台运行以下场景需要进入容器内部操作
@@ -26,12 +24,8 @@ Docker 提供两种进入容器的命令:
### 5.4.3 docker exec (推荐)
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### docker exec 基本用法
运行以下命令
```bash
## 进入容器并启动交互式 shell
@@ -44,8 +38,6 @@ $ docker exec -it 容器名 /bin/sh
#### 参数说明
相关信息如下表
| 参数 | 作用 |
|------|------|
| `-i` | 保持标准输入打开 (interactive)|
@@ -57,8 +49,6 @@ $ docker exec -it 容器名 /bin/sh
#### docker exec 示例
运行以下命令
```bash
## 启动一个后台容器
@@ -99,8 +89,6 @@ $ docker exec -u root myubuntu apt update
#### 只用 -i 不用 -t 的区别
运行以下命令
```bash
## 只用 -i可以执行命令但没有提示符
@@ -123,12 +111,8 @@ root@69d137adef7a:/# # 有提示符
### 5.4.4 docker attach (谨慎使用)
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### docker attach 基本用法
运行以下命令
```bash
$ docker attach 容器名
```
@@ -150,8 +134,6 @@ flowchart LR
#### docker attach 示例
运行以下命令
```bash
## 启动容器
@@ -199,8 +181,6 @@ CONTAINER ID IMAGE STATUS NAMES
### 5.4.5 exec vs attach 对比
相关信息如下表
| 特性 | docker exec | docker attach |
|------|-------------|---------------|
| **工作方式** | 在容器内启动新进程 | 附加到主进程 |
@@ -238,12 +218,8 @@ flowchart LR
### 5.4.6 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 首选 docker exec
运行以下命令
```bash
## 进入容器调试
@@ -285,8 +261,6 @@ $ docker debug myapp
### 5.4.7 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Qexec 进入后看不到其他终端的操作
这是正常的exec 启动的是独立进程多个 exec 会话互不影响
@@ -301,8 +275,6 @@ $ docker exec -it myapp /bin/sh
#### Q需要 root 权限
运行以下命令
```bash
$ docker exec -u root -it myapp bash
```

View File

@@ -16,8 +16,6 @@ $ docker rm 容器名或ID
### 5.6.2 删除选项
相关信息如下表
| 选项 | 说明 | 示例 |
|------|------|------|
| 无参数 | 删除已停止的容器 | `docker rm mycontainer` |
@@ -26,8 +24,6 @@ $ docker rm 容器名或ID
#### 删除已停止的容器
运行以下命令
```bash
$ docker rm mycontainer
mycontainer
@@ -35,8 +31,6 @@ mycontainer
#### 强制删除运行中的容器
运行以下命令
```bash
## 不加 -f 会报错
@@ -53,8 +47,6 @@ running_container
#### 删除容器及其数据卷
运行以下命令
```bash
## 删除容器时同时删除其匿名卷
@@ -67,12 +59,8 @@ $ docker rm -v mycontainer
### 5.6.3 批量删除
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 删除所有已停止的容器
运行以下命令
```bash
## 方式一:使用 prune 命令(推荐)
@@ -92,8 +80,6 @@ $ docker container prune -f
#### 删除所有容器 (包括运行中的)
运行以下命令
```bash
## 先停止所有容器,再删除
@@ -107,8 +93,6 @@ $ docker rm -f $(docker ps -aq)
#### 按条件删除
运行以下命令
```bash
## 删除所有已退出的容器
@@ -138,14 +122,8 @@ $ docker container prune --filter "until=24h"
| `before=xxx` | 在某容器之前创建 | `-f before=mycontainer` |
| `since=xxx` | 在某容器之后创建 | `-f since=mycontainer` |
#### 概述
总体概述了以下内容
#### 示例
运行以下命令
```bash
## 删除所有基于 nginx 镜像的容器
@@ -178,12 +156,8 @@ $ docker image rm nginx
### 5.6.6 清理策略建议
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 开发环境
运行以下命令
```bash
## 定期清理已停止的容器
@@ -196,8 +170,6 @@ $ docker system prune -f
#### 生产环境
运行以下命令
```bash
## 使用 --rm 参数运行临时容器
@@ -211,8 +183,6 @@ $ docker container prune --filter "until=168h" # 保留 7 天内的
#### 完整清理脚本
运行以下命令
```bash
#!/bin/bash
## cleanup.sh - Docker 资源清理脚本
@@ -237,12 +207,8 @@ docker system df
### 5.6.7 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器无法删除
运行以下命令
```bash
Error: container is running
```

View File

@@ -1,4 +1,4 @@
# 第五章操作容器
# 第五章 操作容器
容器是 Docker 又一核心概念
@@ -6,7 +6,7 @@
本章将具体介绍如何来管理一个容器包括创建启动和停止等
* [启动容器](../05_container/5.1_run.md)
* [启动容器](5.1_run.md)
* [守护态运行](5.2_daemon.md)
* [终止容器](5.3_stop.md)
* [进入容器](5.4_attach_exec.md)

View File

@@ -1,7 +1,5 @@
## 5.7 本章小结
相关信息如下表
| 操作 | 命令 | 说明 |
|------|------|------|
| 新建并运行 | `docker run` | 最常用的启动方式 |

View File

@@ -1,7 +1,5 @@
## 6.1 Docker Hub
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 6.1.1 什么是 Docker Hub
Docker Hub Docker 的中央镜像仓库通过它您可以轻松地分享和获取 Docker 镜像
@@ -20,8 +18,6 @@ Docker Hub 是 Docker 的中央镜像仓库,通过它您可以轻松地分享
### 6.1.2 核心功能
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 搜索镜像
我们可以通过 `docker search` 命令来查找官方仓库中的镜像并利用 `docker pull` 命令来将它下载到本地
@@ -39,8 +35,6 @@ centos The official build of CentOS. 7000+ [OK]
#### 2. 拉取镜像
运行以下命令
```bash
$ docker pull nginx:alpine
```
@@ -72,12 +66,6 @@ $ docker push username/myapp:v1
### 6.1.3 限制与配额
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 概述
总体概述了以下内容
#### 镜像拉取限制
2020 11 月起Docker Hub 对匿名和免费用户实施了拉取速率限制
@@ -97,8 +85,6 @@ $ docker push username/myapp:v1
### 6.1.4 安全最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 启用 2FA (双因素认证)
为了保护您的 Docker Hub 账号安全我们建议采取以下措施

View File

@@ -8,12 +8,6 @@
### 6.2.1 安装运行 docker-registry
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 概述
总体概述了以下内容
#### 容器运行
如果您需要搭建私有仓库可以通过官方提供的 `registry` 镜像快速部署
@@ -105,10 +99,6 @@ REPOSITORY TAG IMAGE ID CREAT
这是因为 Docker 默认不允许非 `HTTPS` 方式推送镜像我们可以通过 Docker 的配置选项来取消这个限制或者查看下一节配置能够通过 `HTTPS` 访问的私有仓库
#### 概述
总体概述了以下内容
#### Linux
默认情况下Docker 强制使用 HTTPS 协议推送镜像如果您搭建的私有仓库是 HTTP 协议需要进行如下配置

View File

@@ -125,8 +125,6 @@ threshold: 3
### 6.3.3 生成 http 认证文件
运行以下命令
```bash
$ mkdir auth
@@ -166,8 +164,6 @@ volumes:
### 6.3.6 启动
运行以下命令
```bash
$ docker compose up -d
```

View File

@@ -4,8 +4,6 @@
### 6.4.1 启动 Nexus 容器
运行以下命令
```bash
$ docker run -d --name nexus3 --restart=always \
-p 8081:8081 \

View File

@@ -1,4 +1,4 @@
# 第六章访问仓库
# 第六章 访问仓库
仓库 (`Repository`) 是集中存放镜像的地方

View File

@@ -1,7 +1,5 @@
## 6.5 本章小结
相关信息如下表
| 功能 | 说明 |
|------|------|
| **官方镜像** | 优先使用的基础镜像 |
@@ -11,8 +9,6 @@
### 6.5.1 概述
总体概述了以下内容
### 6.5.2 延伸阅读
- [私有仓库](6.2_registry.md)搭建自己的 Registry

View File

@@ -1,7 +1,5 @@
## 7.10 WORKDIR 指定工作目录
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.10.1 基本语法
如下代码块所示展示了相关示例
@@ -30,8 +28,6 @@ COPY . . # 复制到 /app/
### 7.10.3 为什么需要 WORKDIR
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 常见错误
如下代码块所示展示了相关示例
@@ -125,8 +121,6 @@ COPY --from=builder /build/dist .
### 7.10.7 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 尽早设置 WORKDIR
如下代码块所示展示了相关示例
@@ -188,8 +182,6 @@ WORKDIR /data
### 7.10.8 与其他指令的关系
相关信息如下表
| 指令 | WORKDIR 的影响 |
|------|---------------|
| `RUN` | WORKDIR 中执行命令 |

View File

@@ -1,7 +1,5 @@
## 7.11 USER 指定当前用户
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.11.1 基本语法
如下代码块所示展示了相关示例
@@ -38,8 +36,6 @@ flowchart LR
### 7.11.3 基本用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 创建并切换用户
如下代码块所示展示了相关示例
@@ -94,10 +90,6 @@ RUN useradd -r -s /bin/false appuser
USER appuser
```
#### 概述
总体概述了以下内容
#### 创建用户的方式
**Debian/Ubuntu**
@@ -126,8 +118,6 @@ RUN addgroup -g 1001 -S appgroup && \
### 7.11.5 运行时切换用户
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 使用 gosu (推荐)
ENTRYPOINT 脚本中切换用户时不要使用 `su` `sudo`应使用 [gosu](https://github.com/tianon/gosu)
@@ -165,8 +155,6 @@ exec gosu redis "$@"
#### 为什么不用 su/sudo
相关信息如下表
| 问题 | su/sudo | gosu |
|------|---------|------|
| TTY 要求 | 需要 | 不需要 |
@@ -223,8 +211,6 @@ CMD ["node", "server.js"]
### 7.11.8 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 始终使用非 root 用户
如下代码块所示展示了相关示例
@@ -279,12 +265,8 @@ CMD ["node", "server.js"]
### 7.11.9 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q权限被拒绝
运行以下命令
```bash
permission denied: '/app/data.log'
```

View File

@@ -1,7 +1,5 @@
## 7.12 HEALTHCHECK 健康检查
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.12.1 基本语法
如下代码块所示展示了相关示例
@@ -37,8 +35,6 @@ Starting ──成功──> Healthy ──失败N次──> Unhealthy
### 7.12.3 基本用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Web 服务检查
如下代码块所示展示了相关示例
@@ -59,8 +55,6 @@ HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
#### 常用选项
相关信息如下表
| 选项 | 说明 | 默认值 |
|------|------|--------|
| `--interval` | 两次检查的间隔 | 30s |
@@ -83,8 +77,6 @@ HEALTHCHECK NONE
### 7.12.5 常见检查脚本
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### HTTP 服务
使用 `curl` `wget`
@@ -158,8 +150,6 @@ services:
### 7.12.7 查看健康状态
运行以下命令
```bash
## 查看容器状态(包含健康信息)
@@ -189,8 +179,6 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq
### 7.12.8 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 避免副作用
健康检查会被频繁执行不要在检查脚本中进行写操作或消耗大量资源的操作

View File

@@ -1,7 +1,5 @@
## 7.13 ONBUILD 为他人做嫁衣裳
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.13.1 基本语法
如下代码块所示展示了相关示例
@@ -77,8 +75,6 @@ FROM 基础镜像 ──build──> 读取基础镜像触发器 ──> 执行
### 7.13.4 常见使用场景
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 自动处理依赖安装
如下代码块所示展示了相关示例
@@ -115,8 +111,6 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
### 7.13.5 注意事项
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 继承性限制
`ONBUILD` 指令 **只会继承一次**
@@ -141,8 +135,6 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
### 7.13.6 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 命名规范
建议在镜像标签中添加 `-onbuild` 后缀明确告知使用者该镜像包含触发器

View File

@@ -1,7 +1,5 @@
## 7.14 LABEL 为镜像添加元数据
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.14.1 基本语法
如下代码块所示展示了相关示例
@@ -25,8 +23,6 @@ LABEL <key>=<value> <key>=<value> ...
### 7.14.3 基本用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 定义单个标签
如下代码块所示展示了相关示例
@@ -67,10 +63,6 @@ LABEL maintainer="user@example.com" \
| `org.opencontainers.image.title` | 镜像标题 | `My App` |
| `org.opencontainers.image.description` | 描述 | `Production ready web server` |
#### 概述
总体概述了以下内容
#### 示例
如下代码块所示展示了相关示例
@@ -132,8 +124,6 @@ $ docker build \
### 7.14.7 查看标签
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### docker inspect
查看镜像的标签信息

View File

@@ -1,7 +1,5 @@
## 7.15 SHELL 指令
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.15.1 基本语法
如下代码块所示展示了相关示例
@@ -21,8 +19,6 @@ SHELL ["executable", "parameters"]
### 7.15.2 为什么要用 SHELL 指令
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 使用 bash 特性
默认的 `/bin/sh` (通常是 dash alpine ash) 功能有限如果你需要使用 bash 的特有功能 (如数组`{}` 扩展`pipefail` )可以切换 shell
@@ -125,8 +121,6 @@ RUN echo "Using sh again"
### 7.15.5 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 推荐开启 pipefail
对于使用 bash 的镜像强烈建议开启 `pipefail`以确保构建过程中的错误能被及时捕获

View File

@@ -1,7 +1,5 @@
## 7.1 RUN 执行命令
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.1.1 基本语法
如下代码块所示展示了相关示例
@@ -17,8 +15,6 @@ RUN ["executable", "param1", "param2"]
### 7.1.2 两种格式对比
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. Shell 格式
如下代码块所示展示了相关示例
@@ -50,8 +46,6 @@ RUN ["apt-get", "update"]
### 7.1.3 常见最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 组合命令 (减少层数)
每一个 `RUN` 指令都会新建一层镜像为了减少镜像体积和层数应使用 `&&` 连接命令
@@ -110,8 +104,6 @@ RUN wget http://url | gzip -d > file
### 7.1.4 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q为什么 `RUN cd /app` 不生效
如下代码块所示展示了相关示例
@@ -148,8 +140,6 @@ RUN echo $MY_VAR
### 7.1.5 高级技巧
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 使用 BuildKit 的挂载缓存
BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存加速构建

View File

@@ -1,7 +1,5 @@
## 7.2 COPY 复制文件
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.2.1 基本语法
如下代码块所示展示了相关示例
@@ -17,8 +15,6 @@ COPY [选项] ["<源路径1>", "<源路径2>", ... "<目标路径>"]
### 7.2.2 基本用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 复制单个文件
如下代码块所示展示了相关示例
@@ -90,8 +86,6 @@ COPY app[0-9].js /app/ # app0.js ~ app9.js
### 7.2.4 目标路径
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 绝对路径
如下代码块所示展示了相关示例
@@ -163,8 +157,6 @@ COPY start.sh /app/
### 7.2.7 COPY vs ADD
相关信息如下表
| 特性 | COPY | ADD |
|------|------|-----|
| 复制本地文件 | | |
@@ -189,8 +181,6 @@ ADD app.tar.gz /app/
### 7.2.8 多阶段构建中的 COPY
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 从其他构建阶段复制
如下代码块所示展示了相关示例
@@ -254,8 +244,6 @@ Dockerfile
### 7.2.10 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 利用缓存先复制依赖文件
如下代码块所示展示了相关示例

View File

@@ -1,7 +1,5 @@
## 7.3 ADD 更高级的复制文件
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.3.1 基本语法
如下代码块所示展示了相关示例
@@ -20,8 +18,6 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
### 7.3.2 ADD vs COPY
相关信息如下表
| 特性 | COPY | ADD |
|------|------|-----|
| 复制本地文件 | | |
@@ -36,8 +32,6 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
### 7.3.3 自动解压功能
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基本用法 (自动解压本地 tar)
如下代码块所示展示了相关示例
@@ -85,8 +79,6 @@ app.tar.gz 包含: /app/ 目录结果:
### 7.3.4 URL 下载功能 (不推荐)
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基本用法
如下代码块所示展示了相关示例
@@ -99,8 +91,6 @@ ADD https://example.com/app.zip /app/app.zip
#### 为什么不推荐
相关信息如下表
| 问题 | 说明 |
|------|------|
| 权限固定 | 下载的文件权限为 600通常需要额外 RUN 修改 |
@@ -144,8 +134,6 @@ ADD --chown=1000:1000 files/ /app/
### 7.3.6 何时使用 ADD
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 适合使用 ADD
如下代码块所示展示了相关示例
@@ -212,8 +200,6 @@ ADD app.tar.gz /app/
### 7.3.8 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 默认使用 COPY
如下代码块所示展示了相关示例

View File

@@ -1,7 +1,5 @@
## 7.4 CMD 容器启动命令
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.4.1 什么是 CMD
`CMD` 指令用于指定容器启动时默认执行的命令它定义了容器的 主进程
@@ -63,8 +61,6 @@ CMD ["sh", "-c", "echo $HOME"]
### 7.4.3 exec 格式 vs shell 格式
相关信息如下表
| 特性 | exec 格式 | shell 格式 |
|------|----------|-----------|
| 主进程 | 指定的程序 | `/bin/sh` |
@@ -72,10 +68,6 @@ CMD ["sh", "-c", "echo $HOME"]
| 环境变量 | 需要 shell 包装 | 自动解析 |
| 推荐使用 | 大多数场景 | 需要 shell 特性时 |
#### 概述
总体概述了以下内容
#### 信号传递问题示例
如下代码块所示展示了相关示例
@@ -122,8 +114,6 @@ CMD ["/bin/bash"] + cat /etc/os-release
### 7.4.5 经典错误容器立即退出
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 错误示例
如下代码块所示展示了相关示例
@@ -166,8 +156,6 @@ CMD ["nginx", "-g", "daemon off;"]
### 7.4.6 CMD vs ENTRYPOINT
相关信息如下表
| 指令 | 用途 | 运行时行为 |
|------|------|-----------|
| **CMD**| 默认命令 | `docker run` 参数会 **覆盖** |
@@ -210,8 +198,6 @@ $ docker run myimage http://other.com # curl -s http://other.com参数覆盖
### 7.4.7 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 优先使用 exec 格式
如下代码块所示展示了相关示例
@@ -278,8 +264,6 @@ $ docker run myapp --port 9000
### 7.4.8 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### QCMD 可以写多个吗
不可以多个 CMD 只有最后一个生效

View File

@@ -1,7 +1,5 @@
## 7.5 ENTRYPOINT 入口点
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.5.1 什么是 ENTRYPOINT
`ENTRYPOINT` 指定容器启动时运行的入口程序 CMD 不同ENTRYPOINT 定义的命令不会被 `docker run` 的参数覆盖而是 **接收这些参数**
@@ -12,8 +10,6 @@
### 7.5.2 语法格式
相关信息如下表
| 格式 | 语法 | 推荐程度 |
|------|------|---------|
| **exec 格式**| `ENTRYPOINT ["可执行文件", "参数1"]` | **推荐** |
@@ -33,12 +29,8 @@ ENTRYPOINT nginx -g "daemon off;"
### 7.5.3 ENTRYPOINT vs CMD
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 核心区别
相关信息如下表
| 特性 | ENTRYPOINT | CMD |
|------|------------|-----|
| **定位** | 固定的入口程序 | 默认参数 |
@@ -90,8 +82,6 @@ $ docker run myimage -v http://other.com # curl -s -v http://other.com ✓
### 7.5.4 场景一让镜像像命令一样使用
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 需求 (启动前准备)
创建一个查询公网 IP 命令 镜像
@@ -156,8 +146,6 @@ curl -s http://myip.ipip.net -i
### 7.5.5 场景二启动前的准备工作
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 需求
在启动主服务前执行初始化脚本 (如数据库迁移权限设置)
@@ -276,8 +264,6 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
### 7.5.8 ENTRYPOINT CMD 组合表
相关信息如下表
| ENTRYPOINT | CMD | 最终执行命令 |
|------------|-----|-------------|
| | | (容器无法启动)|
@@ -292,8 +278,6 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
### 7.5.9 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 使用 exec 格式
如下代码块所示展示了相关示例
@@ -319,8 +303,6 @@ CMD ["-g", "daemon off;"]
#### 3. 入口脚本使用 exec
运行以下命令
```bash
#!/bin/sh
## 准备工作...

View File

@@ -1,7 +1,5 @@
## 7.6 ENV 设置环境变量
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.6.1 基本语法
如下代码块所示展示了相关示例
@@ -20,8 +18,6 @@ ENV <key1>=<value1> <key2>=<value2> ...
### 7.6.2 基本用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 设置单个变量
如下代码块所示展示了相关示例
@@ -47,8 +43,6 @@ ENV NODE_VERSION=20.10.0 \
### 7.6.3 环境变量的作用
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 后续指令中使用
如下代码块所示展示了相关示例
@@ -130,14 +124,8 @@ $ docker run -e APP_ENV=development -e DEBUG=true myimage
$ docker run --env-file .env myimage
```
#### 概述
总体概述了以下内容
#### env 文件格式
运行以下命令
```bash
## .env
@@ -150,8 +138,6 @@ DATABASE_URL=postgres://localhost/mydb
### 7.6.6 ENV vs ARG
相关信息如下表
| 特性 | ENV | ARG |
|------|-----|-----|
| **生效时间** | 构建时 + 运行时 | 仅构建时 |
@@ -159,10 +145,6 @@ DATABASE_URL=postgres://localhost/mydb
| **覆盖方式** | `docker run -e` | `docker build --build-arg` |
| **适用场景** | 应用配置 | 构建参数 (如版本号)|
#### 概述
总体概述了以下内容
#### 组合使用
如下代码块所示展示了相关示例
@@ -191,8 +173,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
### 7.6.7 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 统一管理版本号
如下代码块所示展示了相关示例
@@ -257,8 +237,6 @@ ENV HOST=localhost \
### 7.6.8 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q环境变量在 CMD 中不展开
exec 格式不会自动展开环境变量
@@ -275,8 +253,6 @@ CMD ["sh", "-c", "python app.py --port $PORT"]
#### Q如何查看容器的环境变量
运行以下命令
```bash
$ docker inspect mycontainer --format '{{json .Config.Env}}'
$ docker exec mycontainer env

View File

@@ -1,7 +1,5 @@
## 7.7 ARG 构建参数
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.7.1 基本语法
如下代码块所示展示了相关示例
@@ -16,8 +14,6 @@ ARG <参数名>[=<默认值>]
### 7.7.2 ARG vs ENV
相关信息如下表
| 特性 | ARG | ENV |
|------|-----|-----|
| **生效时间** | 仅构建时 | 构建时 + 运行时 |
@@ -39,8 +35,6 @@ ARG <参数名>[=<默认值>]
### 7.7.3 基本用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 定义和使用
如下代码块所示展示了相关示例
@@ -58,8 +52,6 @@ RUN echo "Using Node.js $NODE_VERSION"
#### 构建时覆盖
运行以下命令
```bash
## 使用默认值
@@ -74,8 +66,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
### 7.7.4 ARG 的作用域
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### FROM 之前的 ARG
如下代码块所示展示了相关示例
@@ -132,8 +122,6 @@ RUN echo "Running with Node $NODE_VERSION"
### 7.7.5 常见使用场景
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 控制基础镜像版本
如下代码块所示展示了相关示例
@@ -231,8 +219,6 @@ $ docker build --build-arg HTTP_PROXY=http://proxy:8080 .
### 7.7.8 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. ARG 提供合理默认值
如下代码块所示展示了相关示例

View File

@@ -1,7 +1,5 @@
## 7.8 VOLUME 定义匿名卷
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.8.1 基本语法
如下代码块所示展示了相关示例
@@ -47,8 +45,6 @@ flowchart LR
### 7.8.3 基本用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 定义单个卷
如下代码块所示展示了相关示例
@@ -71,8 +67,6 @@ VOLUME ["/data", "/logs", "/config"]
### 7.8.4 VOLUME 的行为
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 自动创建匿名卷
如果运行时未指定挂载Docker 会自动创建匿名卷
@@ -86,8 +80,6 @@ local a1b2c3d4e5f6... # 自动创建的匿名卷
#### 2. 可被命名卷覆盖
运行以下命令
```bash
## 使用命名卷替代匿名卷
@@ -96,8 +88,6 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
#### 3. 可被 Bind Mount 覆盖
运行以下命令
```bash
## 使用宿主机目录替代
@@ -121,10 +111,6 @@ RUN echo "hello" > /data/test.txt
**原因**VOLUME 指令之后Docker 将该目录视为外部挂载点不再记录对它的修改
#### 概述
总体概述了以下内容
#### 正确做法
如下代码块所示展示了相关示例
@@ -145,8 +131,6 @@ VOLUME /data
### 7.8.6 常见使用场景
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 数据库持久化
如下代码块所示展示了相关示例
@@ -178,8 +162,6 @@ VOLUME /app/uploads
### 7.8.7 查看 VOLUME 定义
运行以下命令
```bash
## 查看镜像定义的 VOLUME
@@ -197,8 +179,6 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
### 7.8.8 VOLUME vs docker run -v
相关信息如下表
| 特性 | Dockerfile VOLUME | docker run -v |
|------|-------------------|---------------|
| **定义时机** | 镜像构建时 | 容器运行时 |
@@ -232,16 +212,8 @@ volumes:
### 7.8.10 安全注意事项
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 概述
总体概述了以下内容
#### 匿名卷可能导致数据丢失
运行以下命令
```bash
## 使用 --rm 运行的容器,匿名卷会在容器删除时一起删除
@@ -261,8 +233,6 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
### 7.8.11 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 定义必须持久化的路径
如下代码块所示展示了相关示例

View File

@@ -1,7 +1,5 @@
## 7.9 EXPOSE 声明端口
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 7.9.1 基本语法
如下代码块所示展示了相关示例
@@ -37,8 +35,6 @@ EXPOSE 53/udp
### 7.9.3 EXPOSE 的作用
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 文档说明
告诉镜像使用者容器将在哪些端口提供服务
@@ -76,8 +72,6 @@ $ docker port $(docker ps -q)
### 7.9.4 EXPOSE vs -p
相关信息如下表
| 特性 | EXPOSE | -p |
|------|--------|-----|
| **位置** | Dockerfile | docker run 命令 |
@@ -92,10 +86,6 @@ flowchart TD
Expose ~~~ Run
```
#### 概述
总体概述了以下内容
#### 没有 EXPOSE 也能 -p
如下代码块所示展示了相关示例
@@ -119,8 +109,6 @@ $ docker run -p 8080:80 mynginx
### 7.9.5 常见误解
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 误解EXPOSE 会打开端口
如下代码块所示展示了相关示例
@@ -160,8 +148,6 @@ $ docker run -p 8080:80 nginx # 2. 映射:宿主机 8080 → 容器 80
### 7.9.6 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 总是声明应用使用的端口
如下代码块所示展示了相关示例

View File

@@ -1,7 +1,5 @@
# 第七章 Dockerfile 指令详解
本节涵盖了相关内容与详细描述主要探讨以下几个方面
## 什么是 Dockerfile
Dockerfile 是一个文本文件其內包含了一条条的 **指令 (Instruction)**每一条指令构建一层therefore 每一条指令的内容就是描述该层应当如何构建
@@ -19,10 +17,6 @@ Dockerfile 是一个文本文件,其內包含了一条条的 **指令 (Instruc
Dockerfile 一般分为四部分基础镜像信息维护者信息镜像操作指令和容器启动时执行指令
### 概述
总体概述了以下内容
### 指令详解
本章将详细讲解 Dockerfile 中的各个指令

View File

@@ -1,7 +1,5 @@
## 7.19 本章小结
相关信息如下表
| 要点 | 说明 |
|------|------|
| **作用** | 设置后续指令的工作目录 |

View File

@@ -1,7 +1,5 @@
## 8.2 数据卷
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 8.2.1 为什么需要数据卷
容器的存储层有一个关键问题**容器删除后数据就没了**
@@ -19,8 +17,6 @@ flowchart LR
### 8.2.2 数据卷的特性
相关信息如下表
| 特性 | 说明 |
|------|------|
| **持久化** | 容器删除后数据仍然保留 |
@@ -33,8 +29,6 @@ flowchart LR
### 8.2.3 数据卷 vs 容器存储层
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 容器存储层 (不推荐存储重要数据)
如下代码块所示展示了相关示例
@@ -73,20 +67,14 @@ graph TD
### 8.2.4 数据卷基本操作
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 创建数据卷
运行以下命令
```bash
$ docker volume create my-vol
```
#### 列出所有数据卷
运行以下命令
```bash
$ docker volume ls
DRIVER VOLUME NAME
@@ -97,8 +85,6 @@ local redis_data
#### 查看数据卷详情
运行以下命令
```bash
$ docker volume inspect my-vol
[
@@ -123,12 +109,8 @@ $ docker volume inspect my-vol
### 8.2.5 挂载数据卷
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 方式一--mount (推荐)
运行以下命令
```bash
$ docker run -d \
--name web \
@@ -146,8 +128,6 @@ $ docker run -d \
#### 方式二-v (简写)
运行以下命令
```bash
$ docker run -d \
--name web \
@@ -159,8 +139,6 @@ $ docker run -d \
#### 两种方式对比
相关信息如下表
| 特性 | --mount | -v |
|------|---------|-----|
| 语法 | 键值对更清晰 | 冒号分隔更简洁 |
@@ -169,8 +147,6 @@ $ docker run -d \
#### 只读挂载
运行以下命令
```bash
## --mount 方式
@@ -189,12 +165,8 @@ $ docker run -d \
### 8.2.6 使用场景示例
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 场景一数据库持久化
运行以下命令
```bash
## 创建数据卷
@@ -223,8 +195,6 @@ $ docker run -d \
#### 场景二多容器共享数据
运行以下命令
```bash
## 创建共享数据卷
@@ -245,8 +215,6 @@ $ docker run --rm \
#### 场景三配置文件持久化
运行以下命令
```bash
## 将 nginx 配置存储在数据卷中
@@ -261,12 +229,8 @@ $ docker run -d \
### 8.2.7 数据卷管理
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 删除数据卷
运行以下命令
```bash
## 删除指定数据卷
@@ -279,8 +243,6 @@ $ docker rm -v container_name
#### 清理未使用的数据卷
运行以下命令
```bash
## 查看未被任何容器使用的数据卷
@@ -301,12 +263,8 @@ $ docker volume prune -f
### 8.2.8 数据卷备份与恢复
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 备份数据卷
运行以下命令
```bash
## 使用临时容器挂载数据卷,打包备份
@@ -325,8 +283,6 @@ $ docker run --rm \
#### 恢复数据卷
运行以下命令
```bash
## 创建新数据卷
@@ -342,8 +298,6 @@ $ docker run --rm \
#### 备份脚本示例
运行以下命令
```bash
#!/bin/bash
## backup-volume.sh
@@ -390,20 +344,14 @@ $ docker run -v /host/path:/app/data nginx
### 8.2.10 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q如何知道容器使用了哪些数据卷
运行以下命令
```bash
$ docker inspect container_name --format '{{json .Mounts}}' | jq
```
#### Q数据卷的数据在哪里
运行以下命令
```bash
## 查看数据卷详情

View File

@@ -1,7 +1,5 @@
## 8.3 挂载主机目录
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 8.3.1 什么是绑定挂载
Bind Mount (绑定挂载) **宿主机的目录或文件** 直接挂载到容器中容器可以读写宿主机的文件系统
@@ -25,8 +23,6 @@ flowchart LR
### 8.3.2 Bind Mount vs Volume
相关信息如下表
| 特性 | Bind Mount | Volume |
|------|------------|--------|
| **数据位置** | 宿主机任意路径 | Docker 管理的目录 |
@@ -36,14 +32,8 @@ flowchart LR
| **适用场景** | 开发环境配置文件 | 生产数据持久化 |
| **备份** | 直接访问文件 | 需要通过 Docker |
#### 概述
总体概述了以下内容
#### 选择建议
相关信息如下表
| 需求 | 推荐方案 |
|------|----------|
| 开发时同步代码 | Bind Mount |
@@ -57,12 +47,8 @@ flowchart LR
### 8.3.3 基本语法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 使用 --mount (推荐)
运行以下命令
```bash
$ docker run -d \
--mount type=bind,source=/宿主机路径,target=/容器路径 \
@@ -71,8 +57,6 @@ $ docker run -d \
#### 使用 -v (简写)
运行以下命令
```bash
$ docker run -d \
-v /宿主机路径:/容器路径 \
@@ -81,8 +65,6 @@ $ docker run -d \
#### 两种语法对比
相关信息如下表
| 特性 | --mount | -v |
|------|---------|-----|
| 语法 | 键值对更清晰 | 冒号分隔更简洁 |
@@ -93,12 +75,8 @@ $ docker run -d \
### 8.3.4 使用场景
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 场景一开发环境代码同步
运行以下命令
```bash
## 将本地代码目录挂载到容器
@@ -117,8 +95,6 @@ $ echo "Hello" > src/index.html
#### 场景二配置文件挂载
运行以下命令
```bash
## 挂载自定义 nginx 配置
@@ -129,8 +105,6 @@ $ docker run -d \
#### 场景三日志收集
运行以下命令
```bash
## 将容器日志输出到宿主机目录
@@ -141,8 +115,6 @@ $ docker run -d \
#### 场景四共享 SSH 密钥
运行以下命令
```bash
## 挂载 SSH 密钥(只读)
@@ -182,8 +154,6 @@ touch: /app/config/new.txt: Read-only file system
### 8.3.6 挂载单个文件
运行以下命令
```bash
## 挂载 bash 历史记录
@@ -204,8 +174,6 @@ $ docker run -d \
### 8.3.7 查看挂载信息
运行以下命令
```bash
$ docker inspect mycontainer --format '{{json .Mounts}}' | jq
```
@@ -237,12 +205,8 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
### 8.3.8 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q路径不存在报错
运行以下命令
```bash
$ docker run --mount type=bind,source=/not/exist,target=/app nginx
docker: Error response from daemon: invalid mount config for type "bind":
@@ -289,12 +253,8 @@ $ docker run -v /host/path:/container/path:cached myapp
### 8.3.9 最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 开发环境使用 Bind Mount
运行以下命令
```bash
## 代码热更新
@@ -303,8 +263,6 @@ $ docker run -v $(pwd):/app -p 3000:3000 node npm run dev
#### 2. 生产环境使用 Volume
运行以下命令
```bash
## 数据持久化
@@ -313,16 +271,12 @@ $ docker run -v mysql_data:/var/lib/mysql mysql
#### 3. 配置文件使用只读挂载
运行以下命令
```bash
$ docker run -v /config/nginx.conf:/etc/nginx/nginx.conf:ro nginx
```
#### 4. 注意路径安全
运行以下命令
```bash
## ❌ 危险:挂载根目录或敏感目录

View File

@@ -30,8 +30,6 @@ $ docker run --mount type=tmpfs,destination=/run,tmpfs-size=67108864 nginx
### 8.4.4 Volume / Bind Mount 对比
相关信息如下表
| 类型 | 数据位置 | 持久化 | 典型用途 |
|------|---------|-------|---------|
| Volume | Docker 管理目录 | | 数据库长期业务数据 |

View File

@@ -1,4 +1,4 @@
# 数据管理
# 第八章 数据管理
如图 8-1 所示Docker 数据管理主要围绕三类挂载方式展开

View File

@@ -1,7 +1,5 @@
## 8.5 本章小结
相关信息如下表
| 要点 | 说明 |
|------|------|
| **作用** | 将宿主机目录挂载到容器 |

View File

@@ -1,4 +1,4 @@
# 网络配置
# 第九章 网络配置
Docker 容器需要网络来与外部世界通信容器之间相互通信以及与宿主机通信Docker 在安装时会自动配置网络基础设施大多数情况下开箱即用

View File

@@ -1,7 +1,5 @@
## 10.2 使用 Buildx 构建镜像
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 10.2.1 使用
Buildx 的使用非常直观绝大多数情况下可以替代 `docker build` 命令

View File

@@ -109,8 +109,6 @@ ENTRYPOINT ["/dist"]
#### 创建 manifest list
运行以下命令
```bash
## 首先,为每个架构构建并推送镜像

View File

@@ -4,10 +4,6 @@ Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持
> Buildx 需要 Docker v19.03+在较新版本中已更常用且功能更完整
## 概述
总体概述了以下内容
## 本章内容
本章将详细介绍 Docker Buildx 的使用包括

View File

@@ -12,8 +12,6 @@
### 11.1.1 概述
总体概述了以下内容
### 11.1.2 模板文件规范
Compose 模板文件采用 YAML 格式扩展名为 `.yml` `.yaml`

View File

@@ -34,8 +34,6 @@ $ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
### 11.2.2 测试安装
运行以下命令
```bash
$ docker compose version
Docker Compose version v5.0.2
@@ -43,8 +41,6 @@ Docker Compose version v5.0.2
### 11.2.3 bash 补全命令
运行以下命令
```bash
$ curl -L https://raw.githubusercontent.com/docker/compose/v5.0.2/contrib/completion/bash/docker-compose | sudo tee /etc/bash_completion.d/docker-compose > /dev/null
```

View File

@@ -67,8 +67,6 @@ services:
#### 运行 compose 项目
运行以下命令
```bash
$ docker compose up
```
@@ -80,24 +78,18 @@ $ docker compose up
#### 后台运行
运行以下命令
```bash
$ docker compose up -d
```
#### 停止
运行以下命令
```bash
$ docker compose stop
```
#### 进入服务
运行以下命令
```bash
$ docker compose exec redis sh
/data # redis-cli
@@ -107,48 +99,36 @@ $ docker compose exec redis sh
#### 查看日志
运行以下命令
```bash
$ docker compose logs -f
```
#### 构建镜像
运行以下命令
```bash
$ docker compose build
```
#### 启动服务
运行以下命令
```bash
$ docker compose start
```
#### 运行一次性命令
运行以下命令
```bash
$ docker compose run web python app.py
```
#### 验证 Compose 文件
运行以下命令
```bash
$ docker compose config
```
#### 删除项目
运行以下命令
```bash
$ docker compose down
```

View File

@@ -26,8 +26,6 @@ docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
### 11.4.3 命令使用说明
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### `build`
格式为 `docker compose build [options] [SERVICE...]`

View File

@@ -254,8 +254,6 @@ ALLOWED_HOSTS = ['*']
### 11.6.8 步骤 6启动应用
运行以下命令
```bash
$ docker compose up
```
@@ -301,8 +299,6 @@ $ docker compose exec db psql -U django_user -d django_db
### 11.6.10 常见问题排查
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q1数据库连接失败
**错误信息**`django.db.utils.OperationalError: could not connect to server` **可能原因与解决方案**
@@ -330,8 +326,6 @@ $ docker compose logs db
#### Q3权限问题
运行以下命令
```bash
## 如果容器内创建的文件 root 用户所有

View File

@@ -194,8 +194,6 @@ production:
### 11.7.9 步骤 7启动应用
运行以下命令
```bash
$ docker compose up
```
@@ -226,8 +224,6 @@ Created database 'myapp_test'
### 11.7.11 常用开发命令
运行以下命令
```bash
## 数据库迁移
@@ -252,8 +248,6 @@ $ docker compose exec web bash
### 11.7.12 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q数据库连接失败
检查 `DATABASE_URL` 环境变量格式是否正确确保 db 服务已启动
@@ -283,8 +277,6 @@ $ docker compose run --rm web bundle update
### 11.7.13 开发 vs 生产
相关信息如下表
| 配置项 | 开发环境 | 生产环境 |
|--------|---------|---------|
| Rails 服务器 | Puma (开发模式) | Puma + Nginx |

View File

@@ -81,8 +81,6 @@ networks:
### 11.8.3 配置文件详解
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 环境变量 (.env)
为了安全不要在 `compose.yaml` 中直接写密码创建 `.env` 文件
@@ -136,8 +134,6 @@ $ docker compose logs -f
### 11.8.5 生产环境最佳实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1. 数据库备份
不要只依赖 Volume建议定期备份数据库
@@ -194,8 +190,6 @@ WordPress 支持 Redis 缓存以提高性能。
### 11.8.6 常见问题
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q数据库连接错误
**现象**访问页面显示 Error establishing a database connection**排查**

View File

@@ -142,8 +142,6 @@ flowchart TD
### 12.1.6 总结
相关信息如下表
| 组件 | 角色 | 关键职责 |
|------|------|----------|
| **CLI** | 指挥官 | 发送指令展示结果 |

View File

@@ -52,8 +52,6 @@ PID Namespace 负责进程 ID 的隔离,使得容器内的进程彼此不可
#### PID 隔离效果
运行以下命令
```bash
## 宿主机上查看进程
@@ -141,8 +139,6 @@ MNT Namespace 负责文件系统挂载点的隔离,确保容器看到独立的
#### chroot 的区别
相关信息如下表
| 特性 | chroot | MNT Namespace |
|------|--------|---------------|
| 安全性 | 可以逃逸 | 更安全 |
@@ -161,8 +157,6 @@ UTS Namespace 主要用于隔离主机名和域名。
#### UTS 隔离效果
运行以下命令
```bash
## 宿主机
@@ -244,8 +238,6 @@ flowchart LR
#### 实验 1UTS Namespace
运行以下命令
```bash
## 创建新的 UTS namespace 并启动 shell
@@ -266,8 +258,6 @@ my-server
#### 实验 2PID Namespace
运行以下命令
```bash
## 创建新的 PID 和 MNT namespace
@@ -287,8 +277,6 @@ root 8 0.0 0.0 10072 3200 pts/0 R+ 10:00 0:00 ps aux
#### 实验 3NET Namespace
运行以下命令
```bash
## 创建新的网络 namespace

View File

@@ -33,8 +33,6 @@ flowchart LR
### 12.3.2 cgroups 的历史
相关信息如下表
| 时间 | 事件 |
|------|------|
| 2006 | Google 工程师提出 cgroups 概念 |
@@ -46,8 +44,6 @@ flowchart LR
### 12.3.3 cgroups 可以限制的资源
相关信息如下表
| 资源类型 | 子系统 | 说明 |
|---------|--------|------|
| **CPU** | `cpu`, `cpuset` | CPU 使用时间和核心分配 |
@@ -64,8 +60,6 @@ Docker 提供了丰富的参数来配置容器的资源限制,主要包括内
#### 内存限制
运行以下命令
```bash
## 限制容器最多使用 512MB 内存
@@ -89,8 +83,6 @@ $ docker run --memory-reservation 256m myapp
#### CPU 限制
运行以下命令
```bash
## 限制使用 1.5 个 CPU 核心
@@ -114,8 +106,6 @@ $ docker run --cpu-shares=512 myapp
#### 磁盘 I/O 限制
运行以下命令
```bash
## 限制设备写入速度为 10MB/s
@@ -132,8 +122,6 @@ $ docker run --device-write-iops /dev/sda:100 myapp
#### 进程数限制
运行以下命令
```bash
## 限制最多 100 个进程
@@ -144,8 +132,6 @@ $ docker run --pids-limit=100 myapp
### 12.3.5 查看容器资源使用
运行以下命令
```bash
## 实时监控所有容器的资源使用
@@ -167,12 +153,8 @@ $ docker inspect mycontainer --format '{{json .HostConfig}}' | jq
### 12.3.6 资源限制的效果
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 内存超限
运行以下命令
```bash
## 启动限制 100MB 内存的容器
@@ -191,8 +173,6 @@ abc123 Exited (137) 5 seconds ago hopeful_darwin
#### CPU 限制验证
运行以下命令
```bash
## 不限制 CPU
@@ -211,8 +191,6 @@ $ docker run --rm --cpus=1 stress --cpu 4
### 12.3.7 cgroups v1 vs v2
相关信息如下表
| 特性 | cgroups v1 | cgroups v2 |
|------|-----------|-----------|
| 层级结构 | 多层级 (每个资源单独)| 统一层级 |
@@ -221,14 +199,8 @@ $ docker run --rm --cpus=1 stress --cpu 4
| PSI (压力监控)| | |
| rootless 容器 | 部分支持 | 完整支持 |
#### 概述
总体概述了以下内容
#### 检查系统使用的版本
运行以下命令
```bash
## 查看 cgroup 版本
@@ -271,8 +243,6 @@ services:
#### 1. 始终设置内存限制
运行以下命令
```bash
## 防止 OOM 影响宿主机
@@ -281,16 +251,12 @@ $ docker run -m 1g myapp
#### 2. 为关键应用设置 CPU 保证
运行以下命令
```bash
$ docker run --cpus=2 --cpu-shares=2048 critical-app
```
#### 3. 监控资源使用
运行以下命令
```bash
## 配合 Prometheus + cAdvisor 监控

View File

@@ -107,8 +107,6 @@ Docker 可使用多种联合文件系统实现:
#### 各发行版推荐
相关信息如下表
| Linux 发行版 | 推荐存储驱动 |
|-------------|-------------|
| Ubuntu 16.04+ | overlay2 |
@@ -119,8 +117,6 @@ Docker 可使用多种联合文件系统实现:
#### 查看当前存储驱动
运行以下命令
```bash
$ docker info | grep "Storage Driver"
Storage Driver: overlay2
@@ -152,14 +148,8 @@ flowchart TD
- **workdir**OverlayFS 的工作目录
- **merged**联合挂载后的视图
#### 概述
总体概述了以下内容
#### 文件操作行为
相关信息如下表
| 操作 | 行为 |
|------|------|
| **读取** | 从上到下查找第一个匹配的文件 |
@@ -171,8 +161,6 @@ flowchart TD
### 12.4.6 查看镜像层
运行以下命令
```bash
## 查看镜像的层信息

View File

@@ -1,7 +1,5 @@
## 12.7 本章小结
相关信息如下表
| Namespace | 隔离内容 | 一句话说明 |
|-----------|---------|-----------|
| PID | 进程 ID | 容器有自己的进程树 |

View File

@@ -32,8 +32,6 @@ Kubernetes 完美解决了这些问题。
### 13.1.3 核心概念
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Pod (豆荚)
Kubernetes 的最小调度单位一个 Pod 可以包含一个或多个紧密协作的容器 (共享网络和存储)就像豌豆荚里的豌豆一样

View File

@@ -1,4 +1,4 @@
# Kubernetes
# 第十三章 容器编排基础
`Kubernetes` Google 发起的开源容器编排系统它支持多种云平台与私有数据中心

View File

@@ -234,8 +234,6 @@ oom_score = 0
#### Ubuntu/Debian
运行以下命令
```bash
$ K8S_MINOR="v1.35"
@@ -256,8 +254,6 @@ $ sudo apt-mark hold kubelet kubeadm kubectl
#### CentOS/Fedora
运行以下命令
```bash
$ K8S_MINOR="v1.35"
@@ -276,12 +272,8 @@ $ sudo yum install -y kubelet kubeadm kubectl cri-tools kubernetes-cni
### 14.1.4 修改内核的运行参数
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 加载内核模块
运行以下命令
```bash
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
@@ -303,8 +295,6 @@ $ sudo swapoff -a
```
运行以下命令
```bash
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
@@ -321,10 +311,6 @@ $ sysctl --system
为了让 kubelet 正确运行我们需要对其进行一些必要的配置
#### 概述
总体概述了以下内容
#### 修改 `kubelet.service`
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
@@ -351,8 +337,6 @@ $ sudo systemctl daemon-reload
#### master
运行以下命令
```bash
$ systemctl enable cri-containerd
@@ -448,10 +432,6 @@ CONTAINER_RUNTIME_ENDPOINT=/run/cri-containerd/cri-containerd.sock crictl ps -a
这里以 `flannel` 为例进行介绍
#### 概述
总体概述了以下内容
#### flannel
检查 podCIDR 设置

View File

@@ -16,8 +16,6 @@
#### Ubuntu/Debian
运行以下命令
```bash
$ K8S_MINOR="v1.35"
@@ -38,8 +36,6 @@ $ sudo apt-mark hold kubelet kubeadm kubectl
#### CentOS/Fedora
运行以下命令
```bash
$ K8S_MINOR="v1.35"
@@ -58,12 +54,8 @@ $ sudo yum install -y kubelet kubeadm kubectl
### 14.2.3 修改内核的运行参数
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 加载内核模块
运行以下命令
```bash
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
@@ -85,8 +77,6 @@ $ sudo swapoff -a
```
运行以下命令
```bash
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
@@ -103,10 +93,6 @@ $ sysctl --system
为了让 kubelet 正确运行我们需要对其进行一些必要的配置
#### 概述
总体概述了以下内容
#### 修改 `kubelet.service`
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
@@ -133,8 +119,6 @@ $ sudo systemctl daemon-reload
#### master
运行以下命令
```bash
$ sudo kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--pod-network-cidr 10.244.0.0/16 \
@@ -214,10 +198,6 @@ $ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \
这里以 `flannel` 为例进行介绍
#### 概述
总体概述了以下内容
#### flannel
检查 podCIDR 设置

View File

@@ -12,8 +12,6 @@
### 14.3.2 测试
运行以下命令
```bash
$ kubectl version
```

View File

@@ -17,8 +17,6 @@ Kind 是一个二进制文件,并在 PATH 中即可使用。以下是不同系
#### macOS
运行以下命令
```bash
brew install kind
```
@@ -83,8 +81,6 @@ kind create cluster --config kind-config.yaml
### 14.4.6 删除集群
运行以下命令
```bash
kind delete cluster
```

View File

@@ -25,8 +25,6 @@ curl -sfL https://get.k3s.io | sh -
#### 查看状态
运行以下命令
```bash
sudo k3s kubectl get nodes
```
@@ -53,8 +51,6 @@ kubectl get pods -A
### 14.5.4 清理卸载
运行以下命令
```bash
/usr/local/bin/k3s-uninstall.sh
```

View File

@@ -1,4 +1,4 @@
# 部署 Kubernetes
# 第十四章 部署 Kubernetes
目前Kubernetes 支持在多种环境下使用包括本地主机 (UbuntuDebianCentOSFedora )云服务 ([腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=10058&cps_key=3a5255852d5db99dcd5da4c72f05df61)、[阿里云](https://www.aliyun.com/product/kubernetes?source=5176.11533457&userCode=8lx5zmtu&type=copy)、[百度云](https://cloud.baidu.com/product/cce.html)等)。

View File

@@ -91,8 +91,6 @@ quay.io/coreos/etcd:v3.4.0 \
### 15.2.3 macOS 中运行
运行以下命令
```bash
$ brew install etcd

View File

@@ -91,8 +91,6 @@ etcd 在键的组织上采用了层次化的空间结构 (类似于文件系统
#### put
运行以下命令
```bash
$ etcdctl put /testdir/testkey "Hello world"
OK
@@ -127,8 +125,6 @@ $ etcdctl del testkey
### 15.4.2 非数据库操作
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### watch
监测一个键值的变化一旦键值发生更新就会输出最新的值

View File

@@ -1,3 +1,3 @@
# etcd
# 第十五章 Etcd 项目
`etcd` `CoreOS` 团队发起的一个管理配置信息和服务发现 (`Service Discovery`) 的项目在这一章里面我们将基于 `etcd 3.x` 版本介绍该项目的目标安装和使用以及实现的技术

View File

@@ -1,10 +1,8 @@
## 16.6 多云部署策略比较
## 16.5 多云部署策略比较
企业在选择容器云平台时通常会在 AWS EKSAzure AKSGoogle GKE 以及国内的阿里云 ACK腾讯云 TKE 之间进行权衡
### 16.6.1 三大公有云 Kubernetes 服务对比
相关信息如下表
### 16.5.1 三大公有云 Kubernetes 服务对比
| 特性 | Google GKE | AWS EKS | Azure AKS |
| :--- | :--- | :--- | :--- |
@@ -14,7 +12,7 @@
| **网络模型** | VPC-native, 性能优秀 | AWS VPC CNI, Pod 直接获取 VPC IP | Azure CNI (消耗 IP ) Kubenet |
| **集成度** | GCP 数据分析AI 服务集成紧密 | AWS IAM, ALB, CloudWatch 集成深度高 | Active Directory, Azure DevOps 集成好 |
### 16.6.2 多云部署策略
### 16.5.2 多云部署策略
随着企业业务的扩展单一云平台可能无法满足所有需求多云部署成为趋势
@@ -38,7 +36,7 @@
* **工具**Google AnthosAWS OutpostsAzure Arc 都是为了解决混合云统一管理而生
### 16.6.3 建议
### 16.5.3 建议
* **技术选型**尽量使用标准的 Kubernetes API避免过度依赖特定云厂商的 CRD 或专有服务以保持应用的可移植性
* **IaC 管理**使用 Terraform Pulumi 等工具统一管理多云基础设施

View File

@@ -1,4 +1,4 @@
# 容器与云计算
# 第十六章 容器与云计算
Docker 目前已经得到了众多公有云平台的支持并成为除虚拟机之外的核心云业务

View File

@@ -1,4 +1,4 @@
## 16.5 本章小结
## 16.6 本章小结
本章介绍了公有云服务对 Docker 的积极支持以及新出现的容器云平台

View File

@@ -4,8 +4,6 @@
### 17.1.1 FCOS 特性
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 一个最小化操作系统
FCOS 被设计成一个基于容器的最小化的现代操作系统它比现有的 Linux 安装平均节省 40% RAM (大约 114M) 并允许从 PXE iPXE 非常快速的启动

View File

@@ -1,7 +1,5 @@
## 17.2 安装 Fedora CoreOS
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 17.2.1 下载 ISO
[下载页面](https://getfedora.org/coreos/download/) `Bare Metal & Virtualized` 标签页下载 ISO。
@@ -26,8 +24,6 @@ passwd:
### 17.2.3 转换 FCC Ignition
运行以下命令
```bash
$ docker run -i --rm quay.io/coreos/fcct:v0.5.0 --pretty --strict < example.fcc > example.ign
```
@@ -46,8 +42,6 @@ $ sudo coreos-installer install /dev/sda --ignition-file example.ign
### 17.2.5 使用
运行以下命令
```bash
$ ssh core@虚拟机IP

View File

@@ -19,8 +19,6 @@ Podman 支持多种操作系统,安装过程也相对简单。
### 17.3.1 CentOS / RHEL
运行以下命令
```bash
$ sudo yum -y install podman
```
@@ -41,8 +39,6 @@ $ podman machine start
### 17.3.1 运行容器
运行以下命令
```bash
## $ docker run -d -p 80:80 nginx:alpine
@@ -51,16 +47,12 @@ $ podman run -d -p 80:80 nginx:alpine
### 17.3.2 列出容器
运行以下命令
```bash
$ podman ps
```
### 17.3.3 构建镜像
运行以下命令
```bash
$ podman build -t myimage .
```
@@ -89,8 +81,6 @@ $ alias docker=podman
### 17.3.1 进阶用法
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Systemd 集成
Podman 可以生成 systemd 单元文件让容器像普通系统服务一样管理

View File

@@ -12,7 +12,7 @@ Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。
那么内核中实现命名空间和私有网络的代码是否足够成熟
内核命名空间从 2.6.15 版本 (2008 7 月发布) 之后被引入数年间这些机制的可靠性在诸多大型生产系统中被实践验证
内核命名空间从 2.6.15 版本 (2006 1 月发布) 之后被引入数年间这些机制的可靠性在诸多大型生产系统中被实践验证
实际上命名空间的想法和设计提出的时间要更早最初是为了在内核中引入一种机制来实现 [OpenVZ](https://en.wikipedia.org/wiki/OpenVZ) 的特性。
OpenVZ 项目早在 2005 年就发布了其设计和实现都已经十分成熟

View File

@@ -1,4 +1,4 @@
# 安全
# 第十八章 安全
容器安全是生产环境部署的核心考量本章介绍 Docker 的安全机制和最佳实践
@@ -28,8 +28,6 @@ flowchart LR
## 核心安全机制
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 1. 命名空间
提供进程网络文件系统等资源的隔离
@@ -89,12 +87,8 @@ $ docker exec myapp cat /proc/1/status | grep Cap
## 镜像安全
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 使用可信镜像
运行以下命令
```bash
## ✅ 使用官方镜像
@@ -153,8 +147,6 @@ $ cosign verify --key cosign.pub $IMAGE
## 运行时安全
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 1. root 用户运行
> 笔者强调这是最重要的安全实践之一
@@ -187,8 +179,6 @@ $ docker run -u 1001:1001 myapp
### 2. 只读文件系统
运行以下命令
```bash
## 根文件系统只读
@@ -201,8 +191,6 @@ $ docker run --read-only --tmpfs /tmp --tmpfs /var/run myapp
### 3. 禁用特权模式
运行以下命令
```bash
## ❌ 绝对不要在生产环境使用
@@ -215,8 +203,6 @@ $ docker run --cap-add=SYS_TIME myapp
### 4. 限制资源
运行以下命令
```bash
$ docker run \
-m 512m \ # 内存限制
@@ -228,8 +214,6 @@ $ docker run \
### 5. 网络隔离
运行以下命令
```bash
## 禁用网络(适用于不需要网络的任务)
@@ -245,12 +229,8 @@ $ docker run --network=isolated_net myapp
## Dockerfile 安全实践
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 1. 使用精简基础镜像
Dockerfile 内容如下
```dockerfile
## ✅ 好:使用精简镜像
@@ -265,8 +245,6 @@ FROM ubuntu:24.04 # ~78MB
### 2. 多阶段构建
Dockerfile 内容如下
```dockerfile
## 构建阶段
@@ -285,8 +263,6 @@ CMD ["node", "/app/server.js"]
### 3. 不存储敏感信息
Dockerfile 内容如下
```dockerfile
## ❌ 错误:敏感信息写入镜像
@@ -302,8 +278,6 @@ COPY .env /app/
### 4. 固定依赖版本
Dockerfile 内容如下
```dockerfile
## ✅ 固定版本
@@ -337,8 +311,6 @@ RUN apk add curl
## 高级安全方案
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### Seccomp 系统调用过滤
限制容器可以使用的系统调用
@@ -406,8 +378,6 @@ $ cosign verify --key cosign.pub $IMAGE
## 本章小结
相关信息如下表
| 安全措施 | 重要程度 | 实现方式 |
|---------|---------|---------|
| root 运行 | | `USER` 指令 |

View File

@@ -109,8 +109,6 @@ volumes:
#### 3. 启动服务
运行以下命令
```bash
$ docker compose up -d
```

View File

@@ -1,7 +1,5 @@
# 20.2 Busybox
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 20.2.1 简介
下图直观地展示了本节内容

View File

@@ -1,7 +1,5 @@
# 20.3 Alpine
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 20.3.1 简介
下图直观地展示了本节内容

Some files were not shown because too many files have changed in this diff Show More