diff --git a/01_introduction/1.2_what.md b/01_introduction/1.2_what.md index f088213..f97fe0d 100644 --- a/01_introduction/1.2_what.md +++ b/01_introduction/1.2_what.md @@ -94,8 +94,8 @@ flowchart LR end ``` - **LXC** (2013):Docker 最初基于 Linux Containers -- **libcontainer** (2014,v0.7):Docker 自研的容器运行时 -- **runC** (2015,v1.11):捐献给 OCI 的标准容器运行时 +- **libcontainer** (2014,Docker 0.9):Docker 自研的容器运行时 +- **runC** (2015,Docker 1.11 整合):捐献给 OCI 的标准容器运行时 - **containerd**:高级容器运行时,管理容器生命周期 ![Docker 架构](../_images/docker-on-linux.png) diff --git a/03_install/3.1_ubuntu.md b/03_install/3.1_ubuntu.md index 9a0c0f4..b2d4ee1 100644 --- a/03_install/3.1_ubuntu.md +++ b/03_install/3.1_ubuntu.md @@ -27,7 +27,7 @@ Docker 支持诸多版本的 [Ubuntu](https://ubuntu.com/server) 操作系统。 * Ubuntu Noble 24.04 (LTS),Docker v29.x * Ubuntu Jammy 22.04 (LTS), Docker v29.x -> **注意**:Ubuntu 20.04 LTS 已于 2025 年 5 月 31 日结束标准支持,不再推荐用于新部署。 +> **警告**:Ubuntu 20.04 LTS 已于 2025 年 5 月 31 日结束标准支持。对于生产系统,建议升级至 Ubuntu 22.04 LTS 或 Ubuntu 24.04 LTS,以获得长期维护支持。若必须继续使用 20.04,可通过 Ubuntu Pro 订阅获得扩展安全维护(ESM)。 在 Ubuntu LTS 版本上,目前 Docker 支持 amd64、arm64、armhf、ppc64el、s390x 等 5 个平台;而非 LTS 版本支持的平台通常较少。同时,LTS 版本会获得 5 年的升级维护支持,这样的系统会获得更长期的安全保障,因此在生产环境中推荐使用 LTS 版本。 diff --git a/03_install/3.2_debian.md b/03_install/3.2_debian.md index efea45a..1e8e896 100644 --- a/03_install/3.2_debian.md +++ b/03_install/3.2_debian.md @@ -16,9 +16,11 @@ Debian 以其稳定性著称,是 Docker 的理想宿主系统。本节将指 Docker 支持以下版本的 [Debian](https://www.debian.org/intro/about) 操作系统: -* Debian Trixie 13 (stable) -* Debian Bookworm 12 (oldstable) -* Debian Bullseye 11 (LTS) +* Debian Trixie 13 (stable,2025 年 8 月发布,当前活跃版本) +* Debian Bookworm 12 (oldstable,全面支持至 2026 年 6 月,LTS 至 2028 年 6 月) +* Debian Bullseye 11 (LTS 长期支持,支持至 2026 年 8 月 31 日) + +> **注意**:Debian Bullseye 11 将于 2026 年 8 月底结束长期支持。建议新部署使用 Bookworm 12 或 Trixie 13。 #### 卸载旧版本 diff --git a/03_install/3.3_fedora.md b/03_install/3.3_fedora.md index 44fc41c..920c6c3 100644 --- a/03_install/3.3_fedora.md +++ b/03_install/3.3_fedora.md @@ -16,8 +16,8 @@ Fedora 的快速发布周期(每 6 个月发布新版本)决定了它的用 Docker 支持以下版本的 [Fedora](https://getfedora.org/) 操作系统: -* 42 -* 43 +* Fedora 42 (支持至 2026 年 5 月) +* Fedora 43 (支持至 2026 年 12 月) #### 卸载旧版本 diff --git a/03_install/3.4_centos.md b/03_install/3.4_centos.md index 58ce5da..011c2e6 100644 --- a/03_install/3.4_centos.md +++ b/03_install/3.4_centos.md @@ -14,7 +14,7 @@ CentOS (及其替代品 Rocky Linux、AlmaLinux) 是企业级服务器常用的 #### 系统要求 -> ⚠️ **重要提示**:CentOS 8 已于 2021 年 12 月 31 日停止维护,CentOS 7 已于 2024 年 6 月 30 日结束支持。建议新项目使用 **Rocky Linux** 或 **AlmaLinux** 作为替代。 +> **严重警告**:CentOS 7 已于 2024 年 6 月 30 日结束所有支持,不再接收任何安全更新。CentOS 8 已于 2021 年 12 月 31 日停止维护。强烈建议新项目使用 **Rocky Linux** 或 **AlmaLinux** 替代,这两个项目由社区维护,提供长期支持承诺。 Docker 支持 64 位版本 CentOS Stream 9、Rocky Linux 8/9、AlmaLinux 8/9,并且要求内核版本不低于 3.10。 diff --git a/03_install/3.9_mirror.md b/03_install/3.9_mirror.md index 567277d..adc6c81 100644 --- a/03_install/3.9_mirror.md +++ b/03_install/3.9_mirror.md @@ -8,13 +8,13 @@ 针对不同的使用场景,我们推荐以下几种镜像加速配置方案,以确保最佳的拉取速度。 -1. **云服务器用户**:优先使用所在云平台提供的内部加速器 (见本页末尾) -2. **本地开发用户**:使用阿里云个人加速器或其他可用的公共加速器 +> ⚠️ **重要提示**:国内大多数 Docker Hub 加速服务已于 2024 年中旬关闭(包括阿里云、腾讯云、网易云、百度云等)。如下推荐的镜像源可用性因人而异,建议先测试可用性再配置。 + +1. **云服务器用户**:优先使用所在云平台提供的内部加速器(见本页末尾"云服务商"部分) +2. **本地开发用户**:从以下社区维护的镜像中选择,推荐 `docker.1ms.run`、`dockerproxy.net` 或 DaoCloud 的 `docker.m.daocloud.io` 3. **代理方案**:如有条件,可配置 HTTP 代理直接访问 Docker Hub -* [阿里云加速器](https://cr.console.aliyun.com/cn-hangzhou/instances) (需登录获取个人加速地址) - -本节以 [毫秒镜像](https://docker.1ms.run) 镜像服务 `https://docker.1ms.run` 为例进行介绍。由于镜像加速服务经常变动,建议查阅上方的镜像测试仓库获取最新可用地址。 +本节以 [毫秒镜像](https://docker.1ms.run) 镜像服务 `https://docker.1ms.run` 为例进行介绍。由于镜像加速服务可用性经常变动,建议查阅 [docker-practice/docker-registry-cn-mirror-test](https://github.com/docker-practice/docker-registry-cn-mirror-test) 获取最新实时状态。 ### 3.9.2 Ubuntu 22.04+、Debian 12+、Rocky/Alma/CentOS Stream 9+ @@ -90,18 +90,19 @@ Kubernetes 社区已将官方镜像地址从 `k8s.gcr.io` 迁移到 `registry.k8 $ docker pull registry.k8s.io/xxx ``` -### 3.9.7 不再提供服务的镜像 +### 3.9.7 已停止服务的镜像列表 -某些镜像不再提供服务,添加无用的镜像加速器,会拖慢镜像拉取速度,你可以从镜像配置列表中删除它们。 +以下镜像源已停止服务,添加无用的镜像加速器会拖慢拉取速度,请从配置中删除: -* https://hub.atomgit.com **已于 2024 年底关闭** -* https://dockerhub.azk8s.cn **已转为私有** -* https://reg-mirror.qiniu.com -* https://registry.docker-cn.com -* https://hub-mirror.c.163.com -* https://mirror.baidubce.com +* https://hub.atomgit.com (已于 2024 年底关闭) +* https://registry.cn-hangzhou.aliyuncs.com (阿里云 Docker 加速已于 2024 年关闭) +* https://dockerhub.azk8s.cn (已转为私有) +* https://reg-mirror.qiniu.com (已停止服务) +* https://registry.docker-cn.com (已停止服务) +* https://hub-mirror.c.163.com (网易云镜像已于 2024 年关闭) +* https://mirror.baidubce.com (百度云镜像已停止) -建议 **watch (页面右上角)** [镜像测试](https://github.com/docker-practice/docker-registry-cn-mirror-test)这个 GitHub 仓库,我们会在此更新各个镜像地址的状态。 +建议 **watch (页面右上角)** [镜像测试仓库](https://github.com/docker-practice/docker-registry-cn-mirror-test) 这个 GitHub 仓库,我们会实时更新各镜像源的可用状态。 ### 3.9.8 云服务商 diff --git a/06_repository/6.1_dockerhub.md b/06_repository/6.1_dockerhub.md index b55ea7e..adc1ac1 100644 --- a/06_repository/6.1_dockerhub.md +++ b/06_repository/6.1_dockerhub.md @@ -67,13 +67,15 @@ $ docker push username/myapp:v1 #### 镜像拉取限制 -自 2020 年 11 月起,Docker Hub 对匿名和免费用户实施了拉取速率限制: +Docker Hub 对不同类型用户实施拉取速率限制(2025 年 4 月起更新): | 用户类型 | 限制 | |---------|------| -| **匿名用户** (未登录) | 每 6 小时 100 次请求 | -| **免费账户** (已登录) | 每 6 小时 200 次请求 | -| **Pro/Team 账户** | 无限制 | +| **匿名用户** (未登录) | 每小时 10 次请求 | +| **免费账户** (已登录) | 每小时 100 次请求 | +| **Pro/Team/Business 账户** | 无限制(公平使用政策) | + +> **注意**:2025 年 4 月前的旧限制为匿名用户每 6 小时 100 次、免费账户每 6 小时 200 次。新政策大幅收紧了匿名拉取额度,建议在 CI/CD 环境中始终配置 `docker login`。 #### 滥用限流 diff --git a/06_repository/6.2_registry.md b/06_repository/6.2_registry.md index b41e82b..f9f6b8e 100644 --- a/06_repository/6.2_registry.md +++ b/06_repository/6.2_registry.md @@ -104,15 +104,14 @@ REPOSITORY TAG IMAGE ID CREAT ```json { "registry-mirrors": [ - "https://hub-mirror.c.163.com", - "https://mirror.baidubce.com" + "https://docker.your-mirror.example.com" ], "insecure-registries": [ "192.168.199.100:5000" ] } ``` -> 注意:该文件必须符合 `json` 规范,否则 Docker 将不能启动。 +> 注意:该文件必须符合 `json` 规范,否则 Docker 将不能启动。镜像加速器地址请替换为实际可用的源,具体配置参见 [3.9 镜像加速器](../03_install/3.9_mirror.md)。 ### 6.2.4 其他 diff --git a/07_dockerfile/7.18_multistage_builds_laravel.md b/07_dockerfile/7.18_multistage_builds_laravel.md index a5d52ac..a62188e 100644 --- a/07_dockerfile/7.18_multistage_builds_laravel.md +++ b/07_dockerfile/7.18_multistage_builds_laravel.md @@ -193,7 +193,7 @@ RUN set -x ; cd /app \ FROM composer as composer COPY database/ /app/database/ -COPY composer.json /app/ +COPY composer.json composer.lock /app/ RUN set -x ; cd /app \ && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \ diff --git a/07_dockerfile/7.1_run.md b/07_dockerfile/7.1_run.md index 327c552..7f7d3d9 100644 --- a/07_dockerfile/7.1_run.md +++ b/07_dockerfile/7.1_run.md @@ -84,7 +84,7 @@ RUN apt-get update && \ #### 3. 使用 `set -e` 和 `pipefail` -默认情况下,管道命令 `cmd1 | cmd2` 只要 `cmd2` 成功,整个 `RUN` 就视为成功。 +默认情况下,管道命令 `cmd1 | cmd2` 的返回值由最后一个命令 (`cmd2`) 决定,即使前面的命令失败了,整个 `RUN` 仍可能视为成功。 **❌ 隐蔽的错误**: @@ -193,6 +193,6 @@ wget http://example.com/file.tar.gz EOF ``` -> 💡 使用 heredoc 需要在 Dockerfile 首行声明 BuildKit 语法版本:`# syntax=docker/dockerfile:1` +> 使用 heredoc 需要在 Dockerfile 首行声明 BuildKit 语法版本:`# syntax=docker/dockerfile:1` --- diff --git a/07_dockerfile/7.4_cmd.md b/07_dockerfile/7.4_cmd.md index 3176a6e..2cfb09f 100644 --- a/07_dockerfile/7.4_cmd.md +++ b/07_dockerfile/7.4_cmd.md @@ -63,7 +63,9 @@ CMD echo $HOME CMD ["sh", "-c", "echo $HOME"] ``` -**优点**:可以使用环境变量、管道等 shell 特性 **缺点**:主进程是 sh,信号无法正确传递给应用 +**优点**:可以使用环境变量、管道等 shell 特性 + +**缺点**:主进程是 sh,信号无法正确传递给应用 --- diff --git a/12_implementation/12.6_network.md b/12_implementation/12.6_network.md index ba5af58..cd549c1 100644 --- a/12_implementation/12.6_network.md +++ b/12_implementation/12.6_network.md @@ -22,12 +22,12 @@ Docker 创建一个容器的时候,会执行如下操作: 完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。 -可以在 `docker run` 的时候通过 `--net` 参数来指定容器的网络配置,有 4 个可选值: +可以在 `docker run` 的时候通过 `--network` 参数来指定容器的网络配置,有 4 个可选值: -* `--net=bridge` 这个是默认值,连接到默认的网桥。 -* `--net=host` 告诉 Docker 不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 `--privileged=true`,容器会被允许直接配置主机的网络堆栈。 -* `--net=container:NAME_or_ID` 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 `lo` 环回接口通信。 -* `--net=none` 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。 +* `--network=bridge` 这个是默认值,连接到默认的网桥。 +* `--network=host` 告诉 Docker 不要将容器网络放到隔离的命名空间中,即不要容器化容器内的网络。此时容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus,还可以让容器做一些影响整个主机系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 `--privileged=true`,容器会被允许直接配置主机的网络堆栈。 +* `--network=container:NAME_or_ID` 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容器进程有自己的文件系统、进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资源,两者进程可以直接通过 `lo` 环回接口通信。 +* `--network=none` 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进行配置。 ### 12.6.3 网络配置细节 diff --git a/14_kubernetes_setup/14.1_kubeadm.md b/14_kubernetes_setup/14.1_kubeadm.md index f082d12..558ed2a 100644 --- a/14_kubernetes_setup/14.1_kubeadm.md +++ b/14_kubernetes_setup/14.1_kubeadm.md @@ -96,6 +96,16 @@ $ sudo modprobe overlay $ sudo modprobe br_netfilter ``` +#### cgroup v2 要求:必须 + +Kubernetes v1.35 要求节点使用 cgroup v2(不再支持 cgroup v1)。kubelet 在 cgroup v1 节点上会拒绝启动。验证节点是否支持 cgroup v2: + +```bash +$ mount | grep cgroup2 +``` + +如果输出包含 `cgroup2`,则系统已支持 cgroup v2。对于仍在使用 cgroup v1 的系统(如较旧的 RHEL 8),需要升级内核或更新系统配置。 + #### 禁用 swap:必须 kubelet 默认要求禁用 swap,否则可能导致初始化失败或节点无法加入集群。 @@ -147,9 +157,9 @@ $ sudo systemctl daemon-reload #### master ```bash -$ systemctl enable containerd +$ sudo systemctl enable containerd -$ systemctl start containerd +$ sudo systemctl start containerd $ sudo kubeadm init \ --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \ diff --git a/14_kubernetes_setup/14.2_kubeadm-docker.md b/14_kubernetes_setup/14.2_kubeadm-docker.md index da5a9fb..a6d50dc 100644 --- a/14_kubernetes_setup/14.2_kubeadm-docker.md +++ b/14_kubernetes_setup/14.2_kubeadm-docker.md @@ -60,6 +60,7 @@ $ sudo mv cri-dockerd/cri-dockerd /usr/local/bin/ $ wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service $ wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket +$ sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' cri-docker.service $ sudo mv cri-docker.service cri-docker.socket /etc/systemd/system/ # 启动 cri-dockerd @@ -113,6 +114,16 @@ $ sudo yum install -y kubelet kubeadm kubectl ### 14.2.4 修改内核的运行参数 +#### cgroup v2 要求:必须 + +Kubernetes v1.35 要求节点使用 cgroup v2(不再支持 cgroup v1)。kubelet 在 cgroup v1 节点上会拒绝启动。验证节点是否支持 cgroup v2: + +```bash +$ mount | grep cgroup2 +``` + +如果输出包含 `cgroup2`,则系统已支持 cgroup v2。对于仍在使用 cgroup v1 的系统(如较旧的 RHEL 8),需要升级内核或更新系统配置。 + #### 加载内核模块 ```bash diff --git a/14_kubernetes_setup/14.8_kubectl.md b/14_kubernetes_setup/14.8_kubectl.md index 6a5aee0..1fd1fdb 100644 --- a/14_kubernetes_setup/14.8_kubectl.md +++ b/14_kubernetes_setup/14.8_kubectl.md @@ -2,80 +2,309 @@ [kubectl](https://github.com/kubernetes/kubernetes) 是 Kubernetes 自带的客户端,可以用它来直接操作 Kubernetes。 -使用格式有两种: +kubectl 的基本用法格式为: + ```bash -kubectl [flags] -kubectl [command] +kubectl [command] [resource] [name] [flags] ``` +其中 `command` 是操作命令(如 get、apply、delete),`resource` 是资源类型(如 pod、deployment、service),`name` 是资源名称(可选),`flags` 是各种选项参数。 + ### 14.8.1 get -显示一个或多个资源 +显示一个或多个资源。最常用的命令之一,用于查询集群中的资源状态。 + +```bash +# 查看所有 Pod +$ kubectl get pods + +# 查看指定命名空间中的 Deployment +$ kubectl get deployment -n kube-system + +# 查看所有资源 +$ kubectl get all + +# 使用更详细的输出格式 +$ kubectl get pods -o wide + +# 输出为 YAML 格式 +$ kubectl get pod my-pod -o yaml + +# 根据标签选择资源 +$ kubectl get pods -l app=nginx +``` ### 14.8.2 describe -显示资源详情 +显示资源的详细信息,包括事件、状态、配置等。用于调试和查看资源的完整信息。 -### 14.8.3 create +```bash +# 查看特定 Pod 的详情 +$ kubectl describe pod my-pod -从文件或标准输入创建资源 +# 查看 Node 的详情 +$ kubectl describe node node-1 -### 14.8.4 update +# 查看 Deployment 的详情 +$ kubectl describe deployment nginx-deployment +``` -从文件或标准输入更新资源 +### 14.8.3 apply + +从文件或标准输入应用配置。这是声明式资源管理的标准方式,可用于创建或更新资源。 + +```bash +# 应用 YAML 文件 +$ kubectl apply -f deployment.yaml + +# 应用目录中的所有 YAML 文件 +$ kubectl apply -f ./manifests/ + +# 从标准输入应用配置 +$ cat deployment.yaml | kubectl apply -f - +``` + +### 14.8.4 create + +从文件或标准输入创建资源。与 apply 不同,create 仅用于创建新资源,如果资源已存在会报错。 + +```bash +# 创建资源 +$ kubectl create -f pod.yaml + +# 从标准输入创建 +$ kubectl create -f - < deployment.yaml +``` ### 14.8.5 delete -通过文件名、标准输入、资源名或者 label selector 删除资源 +删除一个或多个资源。支持按名称、标签、资源类型等多种方式删除。 + +```bash +# 按名称删除 +$ kubectl delete pod my-pod + +# 删除整个 Deployment(同时删除其管理的 Pod) +$ kubectl delete deployment nginx-deployment + +# 按标签删除 +$ kubectl delete pods -l app=nginx + +# 从文件删除 +$ kubectl delete -f deployment.yaml +``` ### 14.8.6 logs -输出 pod 中一个容器的日志 +查看 Pod 中容器的日志。用于调试应用和查看容器输出。 -### 14.8.7 rollout +```bash +# 查看 Pod 的日志 +$ kubectl logs my-pod -对 Deployment 等资源执行滚动更新/回滚 +# 查看 Pod 中特定容器的日志 +$ kubectl logs my-pod -c container-name -### 14.8.8 exec +# 实时跟踪日志(类似 tail -f) +$ kubectl logs -f my-pod -在容器内部执行命令 +# 查看最近 100 行日志 +$ kubectl logs my-pod --tail=100 -### 14.8.9 port-forward +# 查看 Pod 启动前的日志(适用于已崩溃的容器) +$ kubectl logs my-pod --previous +``` -将本地端口转发到 Pod +### 14.8.7 exec -### 14.8.10 proxy +在运行中的容器内部执行命令。用于调试、排查问题或执行应用内的操作。 -为 Kubernetes API server 启动代理服务器 +```bash +# 进入容器的交互式 shell +$ kubectl exec -it my-pod -- /bin/sh -### 14.8.11 run +# 在容器中执行命令 +$ kubectl exec my-pod -- ls -la /app -在集群中使用指定镜像启动容器 +# 在 Pod 中的特定容器执行命令 +$ kubectl exec -it my-pod -c container-name -- /bin/bash +``` -### 14.8.12 expose +### 14.8.8 port-forward -将 replication controller service 或 pod 暴露为新的 Kubernetes service +将本地端口转发到 Pod 的端口。用于本地访问集群内的服务,无需暴露 Service。 -### 14.8.13 label +```bash +# 将本地 8080 端口转发到 Pod 的 80 端口 +$ kubectl port-forward pod/my-pod 8080:80 -更新资源的 label +# 使用随机本地端口 +$ kubectl port-forward pod/my-pod :80 -### 14.8.14 config +# 转发到 Service +$ kubectl port-forward svc/my-service 8080:80 +``` -修改 Kubernetes 配置文件 +### 14.8.9 rollout -### 14.8.15 cluster-info +对 Deployment、DaemonSet、StatefulSet 等资源执行滚动更新、暂停、继续或回滚操作。 -显示集群信息 +```bash +# 查看滚动更新状态 +$ kubectl rollout status deployment/nginx-deployment + +# 暂停滚动更新 +$ kubectl rollout pause deployment/nginx-deployment + +# 继续滚动更新 +$ kubectl rollout resume deployment/nginx-deployment + +# 查看更新历史 +$ kubectl rollout history deployment/nginx-deployment + +# 回滚到前一个版本 +$ kubectl rollout undo deployment/nginx-deployment + +# 回滚到特定版本 +$ kubectl rollout undo deployment/nginx-deployment --to-revision=2 +``` + +### 14.8.10 label + +向资源添加、修改或删除标签。标签用于组织和选择资源。 + +```bash +# 为 Pod 添加标签 +$ kubectl label pod my-pod env=production + +# 修改已有标签 +$ kubectl label pod my-pod env=staging --overwrite + +# 删除标签 +$ kubectl label pod my-pod env- + +# 为多个资源添加标签 +$ kubectl label pods -l app=nginx version=v1 +``` + +### 14.8.11 annotate + +向资源添加或修改注解。注解用于存储任意元数据,不用于资源选择。 + +```bash +# 添加注解 +$ kubectl annotate pod my-pod description=”Production pod” + +# 修改注解 +$ kubectl annotate pod my-pod description=”Staging pod” --overwrite + +# 删除注解 +$ kubectl annotate pod my-pod description- +``` + +### 14.8.12 edit + +直接编辑 Kubernetes 资源。编辑器由 `EDITOR` 环境变量指定。 + +```bash +# 编辑 Pod +$ kubectl edit pod my-pod + +# 编辑 Deployment +$ kubectl edit deployment nginx-deployment +``` + +### 14.8.13 config + +管理 kubectl 的配置文件(通常位于 `~/.kube/config`)。 + +```bash +# 查看当前配置 +$ kubectl config view + +# 切换上下文 +$ kubectl config use-context my-cluster + +# 查看所有上下文 +$ kubectl config get-contexts + +# 设置默认命名空间 +$ kubectl config set-context --current --namespace=my-namespace +``` + +### 14.8.14 cluster-info + +显示集群的连接信息和组件状态。 + +```bash +# 显示集群信息 +$ kubectl cluster-info + +# 显示完整的集群状态(包括所有组件) +$ kubectl get componentstatuses +``` + +### 14.8.15 version + +显示 kubectl 客户端和 Kubernetes API server 的版本信息。 + +```bash +# 显示版本 +$ kubectl version + +# 仅显示客户端版本 +$ kubectl version --client + +# 以 JSON 格式输出 +$ kubectl version --output=json +``` ### 14.8.16 api-versions -以 “组/版本” 的格式输出服务端支持的 API 版本 +列出 API server 支持的所有 API 版本,格式为 “组/版本”。 -### 14.8.17 version +```bash +$ kubectl api-versions +``` -输出服务端和客户端的版本信息 +### 14.8.17 explain -### 14.8.18 help +解释资源的字段含义。用于了解 YAML 配置文件中各字段的作用。 -显示各个命令的帮助信息 +```bash +# 查看 Pod 资源的字段说明 +$ kubectl explain pod + +# 查看 Pod 下 spec 字段的说明 +$ kubectl explain pod.spec + +# 查看具体字段的详细说明 +$ kubectl explain pod.spec.containers +``` + +### 14.8.18 auth + +检查用户权限,用于验证 RBAC 配置。 + +```bash +# 检查当前用户是否有权限执行操作 +$ kubectl auth can-i create pods + +# 检查特定用户的权限 +$ kubectl auth can-i create pods --as=other-user +``` + +### 14.8.19 help + +显示任何命令的帮助信息。 + +```bash +# 显示 kubectl 的一般帮助 +$ kubectl help + +# 显示特定命令的帮助 +$ kubectl get --help + +# 显示资源的 API 文档 +$ kubectl explain deployment +``` diff --git a/15_etcd/15.4_etcdctl.md b/15_etcd/15.4_etcdctl.md index cf639a0..f147cd3 100644 --- a/15_etcd/15.4_etcdctl.md +++ b/15_etcd/15.4_etcdctl.md @@ -14,10 +14,10 @@ USAGE: etcdctl VERSION: - 3.4.0 + 3.5.21 API VERSION: - 3.4 + 3.5 COMMANDS: @@ -145,5 +145,5 @@ testkey ```bash $ etcdctl member list -422a74f03b622fef, started, node1, http://172.16.238.100:2380, http://172.16.238.100:23 +422a74f03b622fef, started, node1, http://172.16.238.100:2380, http://172.16.238.100:2379 ``` diff --git a/16_cloud/16.5_multicloud.md b/16_cloud/16.5_multicloud.md index 5af1396..6430a71 100644 --- a/16_cloud/16.5_multicloud.md +++ b/16_cloud/16.5_multicloud.md @@ -7,7 +7,7 @@ | 特性 | Google GKE | AWS EKS | Azure AKS | | :--- | :--- | :--- | :--- | | **版本更新** | 最快,通常是 K8s 新特性的首发地 | 相对保守,注重稳定性 | 跟随社区,更新速度适中 | -| **控制平面管理** | 全托管,自动升级,免费 (部分区域)| 托管,每小时收费 | 全托管,控制平面免费 | +| **控制平面管理** | 全托管,自动升级,$0.10/h(有 Free Tier 抵扣)| 托管,$0.10/h | 全托管,控制平面免费 | | **节点管理** | GKE Autopilot 模式完全托管节点 | Managed Node Groups 简化管理 | Virtual Machine Scale Sets | | **网络模型** | VPC-native, 性能优秀 | AWS VPC CNI, Pod 直接获取 VPC IP | Azure CNI (消耗 IP 多) 或 Kubenet | | **集成度** | 与 GCP 数据分析、AI 服务集成紧密 | 与 AWS IAM, ALB, CloudWatch 集成深度高 | 与 Active Directory, Azure DevOps 集成好 | diff --git a/17_ecosystem/17.6_containerd.md b/17_ecosystem/17.6_containerd.md index 1f76a38..ee7edd3 100644 --- a/17_ecosystem/17.6_containerd.md +++ b/17_ecosystem/17.6_containerd.md @@ -35,7 +35,7 @@ Kubernetes 作为一个容器编排系统,为了屏蔽底层不同容器运行 - 早期版本中,Kubernetes 默认使用 docker 作为运行时,通过一个名为 `dockershim` 的桥接组件对接 Docker,Docker 再对接 containerd。 - 随着 containerd 原生支持了 CRI 插件,Kubernetes 开始直接与 containerd 通信,去掉了 `dockershim` 和 `dockerd` 的中间层。这就是为什么从 Kubernetes v1.24 开始”弃用 Docker”引发了广泛关注,实际上 Kubernetes 只是弃用 `dockershim`,底层依然在使用从 Docker 基因中诞生的 containerd。 -- containerd 2.0 移除了已弃用的 CRI v1alpha2 接口,仅保留 CRI v1(Kubernetes 自 v1.26 起仅支持 CRI v1)。如果集群中仍有依赖 CRI v1alpha2 的组件,升级 containerd 2.x 前需先完成迁移。 +- containerd 2.0 移除了已弃用的 CRI v1alpha2 接口,仅保留 CRI v1(Kubernetes 自 v1.26 起仅支持 CRI v1)。如果集群中仍有依赖 CRI v1alpha2 的组件,升级 containerd 2.x 前需先完成迁移。containerd 2.3(2026 年 4 月)是首个 LTS 版本,支持从 1.7 LTS 直接升级,生产环境推荐使用。 ### 为什么直接使用 containerd? @@ -50,7 +50,7 @@ Kubernetes 作为一个容器编排系统,为了屏蔽底层不同容器运行 - **ctr**:containerd 自带的调试用客户端。它功能比较基础,主要用于开发者在开发 containerd 时进行快速调试,一般不作为最终用户的日常管理工具。 - **crictl**:Kubernetes 提供的 CRI 命令行工具。它用于排查 Kubernetes 节点上的容器和沙箱(Pod)问题。 -- **nerdctl**:这是一个由系统社区成员(主要是 containerd 项目的维护者)开发的,完全兼容 Docker CLI 体验的 containerd 命令行客户端。对于习惯了 `docker run/ps/build` 命令的用户来说,`nerdctl` 可以作为直接操作 containerd 的理想替代品,并且它还支持直接构建镜像(依赖 BuildKit)。 +- **nerdctl**:这是一个由 containerd 项目维护者开发的,完全兼容 Docker CLI 体验的 containerd 命令行客户端。对于习惯了 `docker run/ps/build` 命令的用户来说,`nerdctl` 可以作为直接操作 containerd 的理想替代品,并且它还支持直接构建镜像(依赖 BuildKit)。 #### nerdctl 使用示例 diff --git a/18_security/18.6_image_security.md b/18_security/18.6_image_security.md index 952b339..7bf08db 100644 --- a/18_security/18.6_image_security.md +++ b/18_security/18.6_image_security.md @@ -413,6 +413,7 @@ jobs: - name: Run Trivy vulnerability scan # 安全提醒:2026 年 3 月 Trivy GitHub Actions 遭受供应链攻击, # 76 个版本标签被劫持。务必使用不可变的 commit SHA 引用,而非可变标签。 + # 使用前请到 https://github.com/aquasecurity/trivy-action/releases 核实 SHA 对应正确版本。 uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0 with: image-ref: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest diff --git a/19_observability/19.1_prometheus.md b/19_observability/19.1_prometheus.md index 8e9862e..daaf814 100644 --- a/19_observability/19.1_prometheus.md +++ b/19_observability/19.1_prometheus.md @@ -89,7 +89,7 @@ services: - monitoring cadvisor: - image: ghcr.io/google/cadvisor:latest + image: ghcr.io/google/cadvisor:v0.56.2 ports: - "8080:8080" volumes: @@ -115,7 +115,7 @@ $ docker compose up -d 启动后,访问以下地址: * Prometheus: `http://localhost:9090` -* Grafana:`http://localhost:3000` (默认账号密码:admin/admin) +* Grafana:`http://localhost:3000` (默认账号密码:admin/admin,首次登录后务必立即修改密码) ### 19.1.3 配置 Grafana 面板 diff --git a/20_cases_os/20.2_alpine.md b/20_cases_os/20.2_alpine.md index 5d4fb4a..de61329 100644 --- a/20_cases_os/20.2_alpine.md +++ b/20_cases_os/20.2_alpine.md @@ -12,7 +12,7 @@ `Alpine` 由非商业组织维护的,支持广泛场景的 `Linux` 发行版,它特别为资深/重度 `Linux` 用户而优化,关注安全,性能和资源效能。`Alpine` 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。 -`Alpine` Docker 镜像也继承了 `Alpine Linux` 发行版的这些优势。相比于其他 `Docker` 镜像,它的容量非常小,压缩后仅约 **3.6 MB**(对比 `Ubuntu` 系列镜像约 `28 MB`),且拥有非常友好的包管理机制。官方镜像来自 `docker-alpine` 项目。 +`Alpine` Docker 镜像也继承了 `Alpine Linux` 发行版的这些优势。相比于其他 `Docker` 镜像,它的容量非常小,压缩后仅约 **5 MB**(对比 `Ubuntu` 系列镜像约 `28 MB`),且拥有非常友好的包管理机制。官方镜像来自 `docker-alpine` 项目。 目前 Docker 官方已开始推荐使用 `Alpine` 替代之前的 `Ubuntu` 做为基础镜像环境。这样会带来多个好处。包括镜像下载速度加快,镜像安全性提高,主机之间的切换更方便,占用更少磁盘空间等。 @@ -20,7 +20,7 @@ ```bash REPOSITORY TAG COMPRESSED SIZE -alpine latest ~3.6 MB +alpine latest ~5 MB debian latest ~30 MB ubuntu latest ~28 MB ``` @@ -69,4 +69,4 @@ RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories * `Alpine` 官网:https://www.alpinelinux.org/ * `Alpine` 官方仓库:https://github.com/alpinelinux * `Alpine` 官方镜像:https://hub.docker.com/\_/alpine/ -* `Alpine` 官方镜像仓库:https://github.com/gliderlabs/docker-alpine +* `Alpine` 官方镜像仓库:https://github.com/alpinelinux/docker-alpine diff --git a/20_cases_os/20.3_debian.md b/20_cases_os/20.3_debian.md index 1fdc569..50d64cb 100644 --- a/20_cases_os/20.3_debian.md +++ b/20_cases_os/20.3_debian.md @@ -17,7 +17,7 @@ #### 使用 Debian 官方镜像 -Debian 是一个也是一个常用的基础镜像。 +Debian 是一个常用的基础镜像。 官方提供了大家熟知的 `debian` 镜像以及面向科研领域的 `neurodebian` 镜像。可以使用 `docker run` 直接运行 `Debian` 镜像。 @@ -25,7 +25,7 @@ Debian 是一个也是一个常用的基础镜像。 ```bash $ docker run -it debian bash root@668e178d8d69:/# cat /etc/issue -Debian GNU/Linux 8 +Debian GNU/Linux 12 ``` `Debian` 镜像很适合作为基础镜像,构建自定义镜像。 diff --git a/21_case_devops/21.2_github_actions.md b/21_case_devops/21.2_github_actions.md index bc9bd60..15c2c3d 100644 --- a/21_case_devops/21.2_github_actions.md +++ b/21_case_devops/21.2_github_actions.md @@ -24,8 +24,8 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: docker/setup-buildx-action@v3 + - uses: actions/checkout@v6 + - uses: docker/setup-buildx-action@v4 - uses: docker/build-push-action@v6 with: context: . diff --git a/21_case_devops/21.7_practical_examples.md b/21_case_devops/21.7_practical_examples.md index dca17d8..382c50b 100644 --- a/21_case_devops/21.7_practical_examples.md +++ b/21_case_devops/21.7_practical_examples.md @@ -171,7 +171,7 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ -o app . # 最终镜像 -FROM alpine:3.17 +FROM alpine:3.21 RUN apk add --no-cache ca-certificates tzdata @@ -233,7 +233,7 @@ name = "rust-app" path = "src/main.rs" [dependencies] -actix-web = "4.4" +actix-web = "4.13" tokio = { version = "1.35", features = ["full"] } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" @@ -242,7 +242,7 @@ serde_json = "1.0" ```dockerfile # Stage 1: 编译 -FROM rust:1.75-alpine AS builder +FROM rust:1.95-alpine AS builder RUN apk add --no-cache musl-dev @@ -255,7 +255,7 @@ COPY src ./src RUN cargo build --release # Stage 2: 运行镜像 -FROM alpine:3.17 +FROM alpine:3.21 RUN apk add --no-cache ca-certificates @@ -499,7 +499,7 @@ binlog_format = ROW #### Redis 缓存部署 ```dockerfile -FROM redis:7-alpine +FROM redis:8-alpine # 复制 Redis 配置 COPY redis.conf /usr/local/etc/redis/redis.conf @@ -632,7 +632,7 @@ services: # Redis 缓存 redis: - image: redis:7-alpine + image: redis:8-alpine container_name: redis command: redis-server --appendonly yes --requirepass redispass volumes: @@ -848,7 +848,7 @@ services: - postgres_data:/var/lib/postgresql/data redis: - image: redis:7-alpine + image: redis:8-alpine volumes: postgres_data: diff --git a/appendix/learning_roadmap.md b/appendix/learning_roadmap.md index 025e304..ca91e33 100644 --- a/appendix/learning_roadmap.md +++ b/appendix/learning_roadmap.md @@ -403,7 +403,7 @@ Kubernetes 进阶 (Week 24-36) - 《Docker 深入浅出》- 本书的原版 - 《Kubernetes 权威指南》- 深入 Kubernetes 的必读书 - 《容器技术核心技术与应用》- 理解底层实现 -- 《SRE Google 运维之道》- 生产环保最佳实践 +- 《SRE Google 运维之道》- 生产环境最佳实践 #### 博客和社区 diff --git a/book.json b/book.json index 1125eb2..74b6f87 100644 --- a/book.json +++ b/book.json @@ -7,6 +7,30 @@ "GitHub": "https://github.com/yeasy/docker_practice" } }, + "plugins": [ + "-livereload", + "mermaid-gb3", + "github", + "page-treeview", + "editlink" + ], + "pluginsConfig": { + "mermaid-gb3": { + "theme": "default" + }, + "github": { + "url": "https://github.com/yeasy/docker_practice" + }, + "editlink": { + "base": "https://github.com/yeasy/docker_practice/blob/master/", + "label": "编辑本页" + }, + "page-treeview": { + "copyright": "Copyright © yeasy", + "minHeaderCount": "2", + "minHeaderDeep": "2" + } + }, "pdf": { "pageNumbers": true, "fontSize": 12,