13 Commits

Author SHA1 Message Date
yeasy
40ded62baa Clean gitignore 2026-03-09 20:04:22 -07:00
yeasy
89b0dc4425 Add details for cloud images 2026-03-09 20:04:22 -07:00
yeasy
330e084e00 Improve READMEs and add contribution prompts 2026-03-09 20:04:21 -07:00
yeasy
e62b203f1a Expand Tencent Cloud and Alibaba Cloud docs 2026-03-09 20:04:20 -07:00
yeasy
cb6bf74a2e Add pitfall notes to COPY and networking docs 2026-03-09 20:04:19 -07:00
yeasy
a980e34276 Fix cgroups, VOLUME, and tmpfs descriptions 2026-03-09 20:04:19 -07:00
yeasy
3d33e00802 Bump Compose to v5.1.0 and drop deprecated version field 2026-03-09 20:04:18 -07:00
yeasy
1a820c8c8b Bump Flannel to v0.28.1 2026-03-09 20:04:17 -07:00
yeasy
585b364574 Add etcd 3.4 end-of-life warning 2026-03-09 20:04:17 -07:00
yeasy
a0a5de7f11 Upgrade EFK stack and cAdvisor versions 2026-03-09 20:04:16 -07:00
yeasy
83ba6b7b47 Upgrade GitHub Actions and Cosign in security docs 2026-03-09 20:04:16 -07:00
yeasy
53f20dede7 Minor fix 2026-03-09 20:04:15 -07:00
baohua
48c8b50cf7 Fix typography 2026-03-09 20:04:13 -07:00
61 changed files with 751 additions and 96 deletions

12
.gitignore vendored
View File

@@ -21,11 +21,7 @@ docker-compose.override.yml
__pycache__/
# Check scripts
check_project_rules.py
check_dashes.py
checker.py
find_lists_no_space.py
fix_missing_spaces.py
fix_project_rules.py
fixer.py
format_headings.py
check*.py
find*.py
fix*.py
format*.py

View File

@@ -102,7 +102,7 @@ $ docker compose up
Docker 容器共享宿主机内核无需为每个应用运行完整的操作系统以一台 64GB 内存的物理服务器为例
- **传统虚拟机方案**每个虚拟机都需要运行完整的操作系统每个额外占用如 2GB 内存产生大量资源开销实际可用于应用的内存可能只有约 18GB
- **Docker 方案**容器直接共享宿主机系统只需付出很少的基础开销OS及引擎约 4GB即可将约 60GB 的内存全部用于实际应用
- **Docker 方案**容器直接共享宿主机系统只需付出很少的基础开销OS 及引擎约 4GB即可将约 60GB 的内存全部用于实际应用
```mermaid
flowchart TD

View File

@@ -6,3 +6,6 @@
- Docker 推动了容器技术的标准化 (OCI) 和生态发展
Docker 的核心价值可以用一句话概括**让应用的开发测试部署保持一致同时极大提高资源利用效率** 笔者认为对于现代软件开发者来说Docker 已经不是 要不要学 的问题而是 **必备技能**无论你是前端后端运维还是全栈开发者掌握 Docker 都能让你的工作更高效
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -56,7 +56,7 @@ flowchart TB
一个完整的 Docker 镜像名称由 Registry 地址用户名/组织名仓库名和标签组成了解其结构有助于我们更准确地定位镜像基本格式如下
```bash
[registry地址/][用户名/]仓库名[:标签]
[registry 地址/][用户名/]仓库名[:标签]
```
示例

View File

@@ -28,10 +28,13 @@
- [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.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)配置镜像加速
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -17,7 +17,7 @@
下载好之后双击 `Docker Desktop Installer.exe` 开始安装
**使用** [**winget**](https://docs.microsoft.com/zh-cn/windows/package-manager/) **安装**
**使用**[**winget**](https://docs.microsoft.com/zh-cn/windows/package-manager/)**安装**
```powershell
$ winget install Docker.DockerDesktop

Binary file not shown.

View File

@@ -25,3 +25,6 @@ $ docker run --rm hello-world
- [镜像加速器](3.9_mirror.md)解决国内拉取镜像慢的问题
- [开启实验特性](3.10_experimental.md)使用最新功能
- [Docker Hub](../06_repository/6.1_dockerhub.md)官方镜像仓库
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -31,3 +31,6 @@
- [镜像](../02_basic_concept/2.1_image.md)理解镜像概念
- [删除容器](../05_container/5.6_rm.md)清理容器
- [数据卷](../08_data/8.1_volume.md)清理数据卷
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -28,3 +28,6 @@
- [数据管理](../08_data/README.md)数据持久化方案
- [删除镜像](../04_image/4.3_rm.md)清理镜像
- [数据卷](../08_data/8.1_volume.md)数据卷管理
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -77,9 +77,9 @@ $ docker push username/myapp:v1
| **免费账户** (已登录) | 6 小时 200 次请求 |
| **Pro/Team 账户** | 无限制 |
#### 滥用限流 (Abuse Rate Limit)
#### 滥用限流
除了上述针对特定账号拉取镜像数量的 Pull Rate Limit 之外Docker Hub 对所有用户包含已认证及付费用户还实施了**滥用保护限流 (Abuse Rate Limiting)**它是根据网络出口 IP (IPv4 IPv6 /64 子网) 计算整体请求频率阈值动态触发通常为每分钟数千级别请求
除了上述针对特定账号拉取镜像数量的 Pull Rate Limit 之外Docker Hub 对所有用户包含已认证及付费用户还实施了 **滥用保护限流 (Abuse Rate Limiting)**它是根据网络出口 IP (IPv4 IPv6 /64 子网) 计算整体请求频率阈值动态触发通常为每分钟数千级别请求
**两类的差异与排查方法**
- **Pull Rate Limit**针对拉取量达到上限报错返回 `429 Too Many Requests`并且 HTTP 返回体/CLI 错误提示中会带有明确的 `toomanyrequests: You have reached your pull rate limit` 提示常附有账户升级链接
@@ -102,6 +102,7 @@ $ docker push username/myapp:v1
Account Settings -> Security 中启用 2FA保护账号安全启用后CLI 登录需要使用 **Access Token** 而非密码
#### 2. 使用 Access Token
> ** 警告**绝不要在脚本或 CI/CD 系统中直接使用 `-p` 参数传递密码或 Token (类似 `docker login -p xxx`)这会导致凭证直接暴露在系统的命令历史进程列表和终端输出中
1. Docker Hub -> Account Settings -> Security -> Access Tokens 创建 Token (PAT)

Binary file not shown.

Binary file not shown.

View File

@@ -5,7 +5,7 @@
| 功能 | 说明 |
|------|------|
| **官方镜像** | 优先使用的基础镜像 |
| **拉取限制** | 匿名 100/6h登录 200/6h |
| **拉取限制** | 匿名 100 /6h登录 200 /6h |
| **安全** | 推荐开启 2FA 并使用 Access Token |
| **自动化** | 支持 Webhooks 和自动构建 |
@@ -13,3 +13,6 @@
- [私有仓库](6.2_registry.md)搭建自己的 Registry
- [镜像加速器](../03_install/3.9_mirror.md)加速下载
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -1,7 +1,36 @@
## 7.16 参考文档
* `Dockerfile` 官方文档https://docs.docker.com/engine/reference/builder/
### 官方文档
* `Dockerfile` 最佳实践文档https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
* `Dockerfile` 官方参考手册https://docs.docker.com/engine/reference/builder/
* `Docker` 官方镜像 `Dockerfile`https://github.com/docker-library/docs
* `Dockerfile` 最佳实践指南https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
* `Docker` 官方镜像 `Dockerfile` https://github.com/docker-library/docs
### 常用指令总结
Dockerfile 中的常用指令包括
- **FROM**: 指定基础镜像必须是第一条指令
- **RUN**: 在镜像中执行命令用于安装软件包等
- **WORKDIR**: 设置工作目录
- **COPY/ADD**: 复制文件到镜像中
- **EXPOSE**: 声明容器监听的端口
- **ENV**: 设置环境变量
- **ENTRYPOINT**: 容器启动时的入口点
- **CMD**: 容器默认执行的命令
### 最佳实践建议
1. 使用具体的基础镜像版本标签而非 latest
2. 最小化镜像层数合并 RUN 指令
3. 使用 .dockerignore 文件排除不必要的文件
4. 安装必要的软件包后清理缓存
5. 使用多阶段构建减小最终镜像体积
6. 避免以 root 身份运行容器应用
### 相关资源
- Docker 官方镜像库https://hub.docker.com/
- Docker 镜像构建最佳实践https://docs.docker.com/build/building/best-practices/

View File

@@ -268,3 +268,7 @@ COPY . .
```
---
> **🔥 踩坑实录**
>
> 某公司在优化 Node.js 应用的 Docker 镜像时发现构建出来的镜像体积超过了 2GB远远超过生产部署的需求排查发现Dockerfile 中使用了 `COPY . .` 把整个构建上下文复制进镜像导致 `node_modules/``.git/` 目录和大量测试数据全部被打包进镜像最初他们没有创建 `.dockerignore` 文件默认会复制所有文件解决方案是添加一个 `.dockerignore` 文件排除这些不必要的目录使镜像缩小到了 200MB这个教训深刻地说明了`.dockerignore` `.gitignore` 一样重要应该在项目初始化时就创建而不是等到出现问题时才想起来建议的标准做法是先复制 `package.json` `package-lock.json` 安装依赖再复制应用代码同时在 `.dockerignore` 中明确列出 `node_modules``.git`test 目录等

View File

@@ -103,7 +103,7 @@ VOLUME /data
RUN echo "hello" > /data/test.txt
```
**原因**VOLUME 指令之后Docker 将该目录视为外部挂载点不再记录对它的修改
**原因**在构建过程中VOLUME 指令会为该目录创建一个临时的匿名卷后续 RUN 指令对该目录的写入实际发生在这个临时卷中而非镜像层当该 RUN 指令结束后临时卷被丢弃因此写入的内容不会保存到最终镜像中注意这与容器运行时创建的匿名卷是不同的运行时创建的卷会在容器生命周期内持续存在
#### 正确做法

View File

@@ -28,3 +28,6 @@
- [Dockerfile 最佳实践](../appendix/best_practices.md)编写指南
- [安全](../18_security/README.md)容器安全实践
- [Compose 模板文件](../11_compose/11.5_compose_file.md)Compose 中的配置
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -139,10 +139,10 @@ $ docker run -d \
|------|---------|-----|
| 语法 | 键值对更清晰 | 冒号分隔更简洁 |
| **数据卷 (Volume)** 挂载行为 | 卷不存在会自动创建 `-v` 结果一致 | 卷不存在会自动创建 |
| **绑定挂载 (Bind Mount)** 行为 | **宿主机路径不存在会报错**不会自动创建 | 宿主机路径不存在会**自动创建为目录** |
| **绑定挂载 (Bind Mount)** 行为 | **宿主机路径不存在会报错**不会自动创建 | 宿主机路径不存在会 **自动创建为目录** |
| 推荐程度 | 推荐 (更明确安全避免误创建)| 常用 (更简洁)|
> **提示**官方更推荐使用 `--mount`除了语法格式可读性更好之外最重要的行为差异发生在 **绑定挂载 (Bind Mount)** 如果挂载的宿主机源路径尚未存在`-v` 会擅自将其自动创建为一个空目录 `--mount` 则会严格检查并直接报错这能有效避免因路径拼写错误而在宿主机上留下垃圾目录以及导致的容器访问空目录问题而对于本节的**数据卷 (Volume)** 挂载而言两者在目标指定的卷不存在时皆会自动创建卷产生的结果是**完全一致**
> **提示**官方更推荐使用 `--mount`除了语法格式可读性更好之外最重要的行为差异发生在 **绑定挂载 (Bind Mount)** 如果挂载的宿主机源路径尚未存在`-v` 会擅自将其自动创建为一个空目录 `--mount` 则会严格检查并直接报错这能有效避免因路径拼写错误而在宿主机上留下垃圾目录以及导致的容器访问空目录问题而对于本节的 **数据卷 (Volume)** 挂载而言两者在目标指定的卷不存在时皆会自动创建卷产生的结果是 **完全一致**
#### 只读挂载

View File

@@ -74,10 +74,10 @@ $ docker run -d \
| 特性 | --mount | -v |
|------|---------|-----|
| 语法 | 键值对更清晰 | 冒号分隔更简洁 |
| 路径不存在时 | 直接报错 (Fail Fast) | 静默自动创建**目录** |
| 路径不存在时 | 直接报错 (Fail Fast) | 静默自动创建 **目录** |
| 推荐程度 | 推荐 | 常用 |
> ** 陷阱**如果不小心挂载了一个不存在的宿主机路径使用 `-v` 会在宿主机上静默创建一个**空目录**即使你本来想挂载的是一个文件这常常会导致权限错误或应用无法正常读取这也正是为什么 Docker 官方更推荐使用 `--mount` 的原因它会遵循Fail Fast原则直接报错避免弄巧成拙
> ** 陷阱**如果不小心挂载了一个不存在的宿主机路径使用 `-v` 会在宿主机上静默创建一个 **空目录**即使你本来想挂载的是一个文件这常常会导致权限错误或应用无法正常读取这也正是为什么 Docker 官方更推荐使用 `--mount` 的原因它会遵循Fail Fast原则直接报错避免弄巧成拙
---

View File

@@ -10,16 +10,20 @@
### 8.3.2 基本用法
```bash
$ docker run --tmpfs /run:rw,noexec,nosuid,size=64m nginx
```
也可以使用 `--mount` 语法
使用 `--mount` 语法推荐
```bash
$ docker run --mount type=tmpfs,destination=/run,tmpfs-size=67108864 nginx
$ docker run --mount type=tmpfs,destination=/run,tmpfs-size=67108864,tmpfs-mode=1770 nginx
```
也可以使用 `--tmpfs` 简写语法
```bash
$ docker run --tmpfs /run:size=64m nginx
```
> **注意**`--tmpfs` 支持的选项有限主要为 `size` `mode`如果需要更精细的控制 `noexec``nosuid`推荐使用 `--mount` 语法并通过 `tmpfs-mode` 参数设置权限
### 8.3.3 注意事项
- 容器停止后`tmpfs` 数据会丢失

View File

@@ -24,3 +24,6 @@
- [tmpfs 挂载](8.3_tmpfs.md)内存中的临时存储
- [存储驱动](../12_implementation/12.4_ufs.md)Docker 存储的底层原理
- [Compose 数据管理](../11_compose/11.5_compose_file.md)Compose 中的挂载配置
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -9,7 +9,7 @@ Docker 1.10.0 以后,内建了一个 DNS 服务器,使得容器可以直接
Docker 容器的 DNS 配置有两种情况
1. **默认 Bridge 网络**继承宿主机的 DNS 配置 (`/etc/resolv.conf`)
2. **自定义网络** (推荐)使用 Docker 嵌入式 DNS 服务器 (Embedded DNS)支持通过 **容器名** 进行服务发现
2. **自定义网络**(推荐)使用 Docker 嵌入式 DNS 服务器 (Embedded DNS)支持通过 **容器名** 进行服务发现
---

View File

@@ -91,3 +91,9 @@ $ docker network rm mynet
$ docker network prune
```
---
> **🔥 踩坑实录**
>
> 一个新手开发者通过 `docker-compose` 部署了两个容器化服务服务 A 和服务 B他在服务 A 的代码中尝试用 `localhost:3000` 访问服务 B结果始终连接超时这个错误非常隐蔽在本地单机开发时看不出问题因为他可能在同一个进程中测试排查时他错误地认为是防火墙或网络配置问题实际原因是每个容器都有独立的网络命名空间`localhost` 在容器内部只指向容器自己不是宿主机也不是其他容器正确的做法是使用 docker-compose 自动创建的服务名作为主机名`http://service-b:3000``docker-compose` 会自动在网络中注册服务名的 DNS这样容器间通信才能正确解析改动仅需一行代码问题随之消失

View File

@@ -22,3 +22,6 @@
- [网络隔离](9.6_network_isolation.md)网络安全与隔离策略
- [EXPOSE 指令](../07_dockerfile/7.9_expose.md) Dockerfile 中声明端口
- [Compose 网络](../11_compose/11.5_compose_file.md)Compose 中的网络配置
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -41,11 +41,11 @@ $ docker buildx build --sbom=true -t myimage .
> ** 注意与失败模式**
> 要使 SBOM (或其它 attestation 元数据) 成功附着并可见对底层的存储格式有前置要求默认的 classic image store 不支持 manifest list/index 这种存放 attestation 的结构
>
> 如果只简单运行上述命令你可能会面临**命令成功执行但本地镜像中看不到 SBOM**的体会落差
> 如果只简单运行上述命令你可能会面临 **命令成功执行但本地镜像中看不到 SBOM** 的体会落差
>
> **正确的解决路径有两条**
> 1. Docker 守护进程中启用 `containerd image store` 特性现代 Docker Desktop 默认推荐
> 2. 或者使用 `docker-container` driver 的构建器并直接**加上 `--push` 参数**将产物推送到远端支持 OCI 的镜像仓库仓库会正确保存这些元数据
> 2. 或者使用 `docker-container` driver 的构建器并直接 **加上 `--push` 参数** 将产物推送到远端支持 OCI 的镜像仓库仓库会正确保存这些元数据
### 10.2.2 官方文档

View File

@@ -17,3 +17,6 @@ Docker Buildx 是 Docker 构建系统的重要进化,提供了高效、安全
- [Dockerfile 指令详解](../07_dockerfile/README.md)Dockerfile 编写基础
- [多阶段构建](../07_dockerfile/7.17_multistage_builds.md)优化镜像体积
- [Dockerfile 最佳实践](../appendix/best_practices.md)编写高效 Dockerfile
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -18,12 +18,12 @@ Linux 系统请使用以下介绍的方法安装。
> **提示**版本更新较快请访问上述链接获取最新版本号替换下方命令中的版本号
例如 Linux 64 位系统上直接下载对应的二进制包 ( v5.0.2 为例)
例如 Linux 64 位系统上直接下载对应的二进制包 ( v5.1.0 为例)
```bash
$ DOCKER_CONFIG=${DOCKER_CONFIG:-$HOME/.docker}
$ mkdir -p $DOCKER_CONFIG/cli-plugins
$ curl -SL https://github.com/docker/compose/releases/download/v5.0.2/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
$ curl -SL https://github.com/docker/compose/releases/download/v5.1.0/docker-compose-linux-x86_64 -o $DOCKER_CONFIG/cli-plugins/docker-compose
```
之后执行
@@ -36,13 +36,13 @@ $ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
```bash
$ docker compose version
Docker Compose version v5.0.2
Docker Compose version v5.1.0
```
### 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
$ curl -L https://raw.githubusercontent.com/docker/compose/v5.1.0/contrib/completion/bash/docker-compose | sudo tee /etc/bash_completion.d/docker-compose > /dev/null
```
### 11.2.4 卸载

View File

@@ -19,3 +19,6 @@ Docker Compose 是管理多容器应用的利器,通过 YAML 文件声明式
- [Compose 命令说明](11.4_commands.md)完整命令列表
- [网络配置](../09_network/README.md)Docker 网络基础
- [数据管理](../08_data/README.md)数据卷管理
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -35,10 +35,11 @@ flowchart LR
| 时间 | 事件 |
|------|------|
| 2006 | Google 工程师提出 cgroups 概念 |
| 2008 | Linux 2.6.24 正式支持 cgroups v1 |
| 2006 | Google 工程师提出 "process containers" 概念 |
| 2007 | 为避免与 Linux 容器概念混淆更名为 "control groups" (cgroups) |
| 2008 | Linux 2.6.242008年1月正式合并 cgroups v1 |
| 2016 | Linux 4.5 引入 cgroups v2 |
| 现在 | Docker 默认使用 cgroups v2 (如系统支持)|
| 现在 | Docker 在宿主机支持 cgroups v2 时会自动使用 v2否则回退到 v1 |
---
@@ -265,7 +266,7 @@ $ docker run -d --name cadvisor \
-v /var/run:/var/run:ro \
-v /sys:/sys:ro \
-v /var/lib/docker:/var/lib/docker:ro \
gcr.io/cadvisor/cadvisor
ghcr.io/google/cadvisor
```
---

View File

@@ -34,3 +34,6 @@
- [镜像](../02_basic_concept/2.1_image.md)理解镜像分层
- [容器](../02_basic_concept/2.2_container.md)容器存储层
- [构建镜像](../04_image/4.5_build.md)Dockerfile 层的创建
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -17,3 +17,6 @@ Kubernetes 是当前最主流的容器编排平台,其声明式管理模型和
- [部署 Kubernetes](../14_kubernetes_setup/README.md)搭建 Kubernetes 集群
- [Etcd](../15_etcd/README.md)Kubernetes 使用的分布式存储
- [底层实现](../12_implementation/README.md)容器技术原理
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -445,7 +445,7 @@ $ kubectl get node -o yaml | grep CIDR
```
```bash
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.26.1/Documentation/kube-flannel.yml
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.28.1/Documentation/kube-flannel.yml
```
### 14.1.10 master 节点默认不能运行 pod

View File

@@ -215,7 +215,7 @@ $ kubectl get node -o yaml | grep CIDR
```
```bash
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.26.1/Documentation/kube-flannel.yml
$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/v0.28.1/Documentation/kube-flannel.yml
```
### 14.2.9 master 节点默认不能运行 pod

View File

@@ -15,3 +15,6 @@
- [容器编排基础](../13_kubernetes_concepts/README.md)Kubernetes 核心概念
- [Dashboard](14.7_dashboard.md)部署可视化管理界面
- [kubectl](14.8_kubectl.md)命令行工具使用指南
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -4,7 +4,7 @@
`etcd` 基于 `Go` 语言实现因此用户可以从[项目主页](https://github.com/etcd-io/etcd)下载源代码自行编译,也可以下载编译好的二进制文件,甚至直接使用制作好的 `Docker` 镜像文件来体验。
>注意本章节内容基于 etcd `3.4.x` 版本
>注意本章节内容基于 etcd `3.4.x` 版本编写etcd 3.4 的官方支持将于 **2026 5 15 日结束**新部署建议使用 etcd `3.5` `3.6` 版本请访问 [etcd 官方发布页](https://github.com/etcd-io/etcd/releases) 获取最新版本。
### 15.2.1 二进制文件方式下载

View File

@@ -15,3 +15,6 @@ etcd 是 Kubernetes 的核心存储组件,为分布式系统提供可靠的键
- [容器编排基础](../13_kubernetes_concepts/README.md)Kubernetes 如何使用 etcd
- [部署 Kubernetes](../14_kubernetes_setup/README.md)在集群中部署 etcd
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -15,3 +15,199 @@
![腾讯云容器服务界面](https://mc.qcloudimg.com/static/img/0581dbeb97c869bbe6e62025dbc592d7/image.png)
13-6 腾讯云容器服务示意图
### 腾讯云容器服务 (TKE) 简介
腾讯云容器服务 (TKE, Tencent Kubernetes Engine) 是一款容器编排平台基于原生 Kubernetes 提供支持自动扩展负载均衡多可用区高可用等企业级功能TKE 帮助开发者快速部署和管理容器化应用消除集群运维的复杂度
### 基本使用步骤
#### 1. 创建集群
登录腾讯云控制台进入容器服务模块
- 选择 "创建集群"配置集群名称地域和网络
- 选择节点配置云服务器规格和数量
- 设置 Kubernetes 版本和安全组
- 完成创建后获得集群 kubeconfig 文件
```bash
# 下载 kubeconfig 文件后,配置本地环境
export KUBECONFIG=/path/to/kubeconfig.yaml
kubectl cluster-info
```
#### 2. 部署容器应用
创建 Deployment 部署应用
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-app
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
```
应用配置文件
```bash
kubectl apply -f deployment.yaml
kubectl get pods
kubectl get svc
```
#### 3. 管理镜像
通过腾讯云容器镜像服务 (TCR) 存储和管理私有镜像
```bash
# 登录腾讯云镜像仓库
docker login ccr.ccs.tencentyun.com -u <username>
# 标记本地镜像
docker tag my-app:latest ccr.ccs.tencentyun.com/namespace/my-app:latest
# 推送镜像到腾讯云
docker push ccr.ccs.tencentyun.com/namespace/my-app:latest
```
### 腾讯云 Docker 镜像加速器配置
为了加快镜像拉取速度腾讯云提供了镜像加速服务配置方法如下
#### Linux 系统配置
编辑 `/etc/docker/daemon.json` 文件如果不存在则创建
```bash
# 创建或编辑配置文件
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
```
添加以下内容
```json
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
],
"insecure-registries": []
}
```
重启 Docker 服务
```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
验证配置
```bash
# 查看镜像源是否生效
docker info | grep -A 5 "Registry Mirrors"
```
#### Windows/Mac 配置
对于 Docker Desktop在设置界面中
1. 打开 Docker Desktop 设置
2. 导航到 "Docker Engine"
3. JSON 配置中添加上述 `registry-mirrors` 字段
4. 点击 "Apply & Restart"
### 腾讯云容器镜像服务 (TCR)
腾讯云容器镜像服务 (TCR) 提供企业级容器镜像存储和分发能力
- **私有镜像仓库**支持命名空间隔离完整的访问权限控制
- **镜像扫描**自动扫描镜像漏洞提供安全建议
- **镜像加速**支持跨地域镜像分发和加速
- **Webhook 通知**镜像推送时自动触发 CI/CD 流程
- **镜像版本管理**标签管理镜像清理策略生命周期管理
#### 快速开始
1. 在腾讯云控制台创建个人版或企业版 TCR 实例
2. 创建命名空间和镜像仓库
3. 配置 Docker 登录凭证
4. 本地构建镜像并推送到 TCR
5. TKE 集群部署时引用 TCR 镜像地址
#### 完整推送/拉取示例
```bash
# 登录到腾讯云 TCR使用 API 密钥)
docker login ccr.ccs.tencentyun.com \
--username <腾讯云账号ID> \
--password <API_KEY>
# 拉取公开镜像
docker pull ccr.ccs.tencentyun.com/library/nginx:latest
# 构建本地镜像
docker build -t my-app:v1.0 .
# 标记镜像为 TCR 地址
docker tag my-app:v1.0 \
ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
# 推送镜像到 TCR
docker push ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
# 在 Dockerfile 中使用 TCR 镜像
FROM ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
RUN echo "使用腾讯云镜像作为基础镜像"
```
#### TKE 集群中使用 TCR 镜像
配置镜像拉取凭证后 Deployment 中直接引用 TCR 镜像
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app-deployment
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
imagePullSecrets:
- name: tcr-secret # 需提前创建该 Secret
containers:
- name: my-app
image: ccr.ccs.tencentyun.com/my-namespace/my-app:v1.0
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
```

View File

@@ -15,3 +15,256 @@
![阿里云容器服务界面](https://img.alicdn.com/tps/TB10yjtPpXXXXacXXXXXXXXXXXX-1531-1140.png)
13-4 阿里云容器服务示意图
### 阿里云容器服务 ACK 简介
阿里云容器服务 Kubernetes (ACK, Container Service for Kubernetes) 是一款托管式 Kubernetes 服务基于开源 Kubernetes 构建提供企业级的容器编排和管理能力ACK 集成了阿里云存储网络和安全能力支持多种应用部署模式和持续交付流程
### 基本使用步骤
#### 1. 创建集群
登录阿里云控制台进入容器服务 > Kubernetes 集群
- 点击 "创建集群"选择集群配置
- 配置集群名称地域可用区和节点类型
- 选择节点规格和数量支持弹性伸缩
- 配置网络参数和安全设置
- 完成创建下载 kubeconfig 文件
```bash
# 配置本地 kubectl
export KUBECONFIG=/path/to/kubeconfig.yaml
kubectl get nodes
```
#### 2. 部署容器应用
通过 Deployment 部署应用示例
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
replicas: 2
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web
image: registry.cn-hangzhou.aliyuncs.com/myapp/web:v1
ports:
- containerPort: 8080
resources:
limits:
memory: "512Mi"
cpu: "500m"
```
部署应用
```bash
kubectl apply -f deployment.yaml
kubectl get pods -o wide
kubectl logs <pod-name>
```
#### 3. 暴露服务
创建 Service 暴露应用
```yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: LoadBalancer
ports:
- port: 80
targetPort: 8080
selector:
app: web
```
应用
```bash
kubectl apply -f service.yaml
kubectl get svc web-service
```
### 阿里云 Docker 镜像加速器配置
为了加快从阿里云镜像源拉取官方镜像的速度可以配置镜像加速器阿里云为容器服务 ACK 用户提供了免费的镜像加速服务
#### 获取加速器地址
登录阿里云容器镜像服务控制台 "镜像工具" > "镜像加速器" 中可获取个人的加速器地址类似于 `https://xxxxxx.mirror.aliyuncs.com`
#### Linux 系统配置
编辑或创建 `/etc/docker/daemon.json` 文件
```bash
sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json
```
添加或修改以下内容替换为你的加速器地址
```json
{
"registry-mirrors": [
"https://xxxxxx.mirror.aliyuncs.com"
]
}
```
重新加载并重启 Docker
```bash
sudo systemctl daemon-reload
sudo systemctl restart docker
```
验证配置生效
```bash
docker info | grep -A 5 "Registry Mirrors"
```
#### Windows/Mac 配置
Docker Desktop Settings
1. 进入 "Docker Engine" 标签
2. 编辑 JSON 配置添加 `registry-mirrors` 字段
3. 点击 "Apply & Restart"
#### 测试加速效果
```bash
# 从加速器拉取镜像(速度应该明显提升)
docker pull nginx:latest
time docker pull alpine:latest
```
### 阿里云容器镜像服务 (ACR)
阿里云容器镜像服务 (ACR, Container Registry) 是企业级的容器镜像存储和分发平台
- **私有镜像仓库**支持多个命名空间细粒度权限控制
- **镜像构建**云端编译和构建支持自动化 CI/CD
- **镜像扫描**自动检测镜像中的漏洞和恶意代码
- **跨地域复制**支持镜像在多个地域的同步和加速
- **集成 ACK** ACK 无缝集成自动身份认证
- **镜像版本管理**标签管理镜像过期清理保留策略
#### 完整推送/拉取示例
```bash
# 登录阿里云镜像仓库(使用 Docker 登录)
# 使用阿里云账户 ID 和 RAM 访问密钥或密码
docker login registry.cn-hangzhou.aliyuncs.com \
--username=<阿里云账户ID>
# 拉取阿里云公开镜像
docker pull registry.cn-hangzhou.aliyuncs.com/library/nginx:latest
# 构建本地镜像
docker build -t my-app:v1.0 .
# 标记镜像为阿里云仓库地址
docker tag my-app:v1.0 \
registry.cn-hangzhou.aliyuncs.com/myapp/my-app:v1.0
# 推送镜像到阿里云 ACR
docker push registry.cn-hangzhou.aliyuncs.com/myapp/my-app:v1.0
# 在 Dockerfile 中使用 ACR 镜像
FROM registry.cn-hangzhou.aliyuncs.com/myapp/my-app:v1.0
COPY . /app
RUN echo "已成功使用阿里云镜像"
```
#### ACK 集群中使用 ACR 镜像
ACK 集群中需要先配置镜像拉取凭证Secret然后在 Deployment 中引用
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
namespace: default
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
# 如果是私有镜像,需配置镜像拉取凭证
imagePullSecrets:
- name: acr-secret
containers:
- name: web
image: registry.cn-hangzhou.aliyuncs.com/myapp/web:v2.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
resources:
requests:
memory: "256Mi"
cpu: "100m"
limits:
memory: "512Mi"
cpu: "500m"
affinity:
# 配置 Pod 反亲和性,分散到不同节点
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web
topologyKey: kubernetes.io/hostname
```
#### 创建镜像拉取凭证
ACK 集群中创建 Secret用于拉取私有镜像
```bash
# 创建镜像拉取 Secret
kubectl create secret docker-registry acr-secret \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username=<阿里云账户ID> \
--docker-password=<RAM访问密钥或密码> \
--docker-email=<邮箱地址>
# 查看创建的 Secret
kubectl get secret acr-secret
kubectl describe secret acr-secret
```
#### ACR 优势
- ACK 集群中与镜像仓库无缝集成简化身份认证
- 支持 Helm Chart 存储和版本管理方便应用交付
- 提供完整的图形化镜像仓库管理界面
- 完整的审计日志和操作追踪功能
- 支持镜像自动扫描和漏洞报告

View File

@@ -11,3 +11,6 @@
* 利用公有云和 Docker 的特性更加方便的迁移和扩展应用
同时容器将作为与虚拟机类似的业务直接提供给用户使用极大的丰富了应用开发和部署的场景
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -21,4 +21,3 @@ FCOS 使用 rpm-ostree 系统进行事务性升级。无需像 yum 升级那样
#### 容器工具
对于诸如构建复制和其他管理容器的任务FCOS 用一组容器工具代替了 **Docker CLI****podman CLI** 工具支持许多容器运行时功能例如运行启动停止列出和删除容器和镜像**skopeo CLI** 工具可以复制认证和签名镜像您还可以使用 **crictl CLI** 工具来处理 CRI-O 容器引擎中的容器和镜像

Binary file not shown.

View File

@@ -28,3 +28,6 @@ Docker 并非容器生态的唯一选择,了解其他工具有助于根据场
- [底层实现](../12_implementation/README.md)容器技术的内核基础
- [安全](../18_security/README.md)容器安全实践
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -1,6 +1,6 @@
## 18.1 内核命名空间
命名空间 (Namespace) Linux 容器隔离的基础它确保了容器内的进程无法直接干扰主机或其他容器虽然在本书第 12 章中我们已经从底层实现的角度介绍了 Namespace但在本节中我们将重点探讨其**安全意义**及相关配置
命名空间 (Namespace) Linux 容器隔离的基础它确保了容器内的进程无法直接干扰主机或其他容器虽然在本书第 12 章中我们已经从底层实现的角度介绍了 Namespace但在本节中我们将重点探讨其 **安全意义** 及相关配置
### 18.1.1 隔离的安全本质

View File

@@ -1,6 +1,6 @@
## 18.2 控制组
控制组 (Cgroups) Linux 容器机制的另外一个关键组件如果说命名空间 (Namespace) 决定了容器能**看到**什么那么控制组就决定了容器能**使用**多少资源
控制组 (Cgroups) Linux 容器机制的另外一个关键组件如果说命名空间 (Namespace) 决定了容器能 **看到** 什么那么控制组就决定了容器能 **使用** 多少资源
在安全领域中资源的不可用性本身就是一种安全威胁控制组负责实现资源的审计和限制这对于抵御资源耗尽型攻击如拒绝服务攻击 DoS至关重要
@@ -17,7 +17,7 @@
### 18.2.2 核心资源限制实战
为了确保多租户平台如公有或私有的 PaaS 平台的稳定性或者在生产环境防止服务级联故障我们要养成在启动容器时**显式声明资源上限**的习惯
为了确保多租户平台如公有或私有的 PaaS 平台的稳定性或者在生产环境防止服务级联故障我们要养成在启动容器时 **显式声明资源上限** 的习惯
#### 1. 内存限制

View File

@@ -83,4 +83,4 @@ $ docker version
### 18.3.4 结语
保障 Docker 服务端的安全主要是做减法关闭不必要的网络监听点严管 Socket 访问权限而一旦基础系统条件允许**毫不犹豫地在生产环境启用 Rootless 模式**将是一项划算的安全加固选择
保障 Docker 服务端的安全主要是做减法关闭不必要的网络监听点严管 Socket 访问权限而一旦基础系统条件允许**毫不犹豫地在生产环境启用 Rootless 模式** 将是一项划算的安全加固选择

View File

@@ -6,7 +6,7 @@
### 18.4.1 容器内置的 Capability 白名单
在默认情况下即便一个容器是在以 `root` 用户运行Docker 也只为其内核授予了所有可用能力中的**一小部分白名单能力**
在默认情况下即便一个容器是在以 `root` 用户运行Docker 也只为其内核授予了所有可用能力中的 **一小部分白名单能力**
常见的 Linux Capabilities 包含
- `CAP_CHOWN`: 修改文件所有者
@@ -14,7 +14,7 @@
- `CAP_NET_ADMIN`: 网络管理的最高权限例如调整路由配置设置防火墙规则等
- `CAP_SYS_ADMIN`: 被誉为Linux 内核的特权网管允许各种高危操作挂载磁盘访问敏感设备等
为了在**最小特权原则**的指导下加强安全Docker 默认**移除了**大量可能导致容器大范围破坏宿主机的能力例如
为了在 **最小特权原则** 的指导下加强安全Docker 默认 **移除了** 大量可能导致容器大范围破坏宿主机的能力例如
* 完全禁止了任何通过 `CAP_SYS_ADMIN` 进行的核心挂载或设备操作
* 禁止修改内核模块
* 禁止直接访问硬件套接字
@@ -27,7 +27,7 @@
#### 实战场景一构建极限安全的 Web 靶机
假设你正在提供一个公共的 Web 容器你不希望里面的任何恶意脚本修改进程权限或者创建设备节点你可以通过命令先移除**所有**默认能力然后再按需授权该守护进程一个仅仅能绑端口的能力
假设你正在提供一个公共的 Web 容器你不希望里面的任何恶意脚本修改进程权限或者创建设备节点你可以通过命令先移除 **所有** 默认能力然后再按需授权该守护进程一个仅仅能绑端口的能力
```bash
$ docker run -d \
@@ -56,7 +56,7 @@ $ docker run -it --rm \
我们只授予了所需的网络管理控制NET_ADMIN和侦听底层套接字的权限NET_RAW而免去了赋予整个容器终极杀器 `--privileged` 参数
> [!WARNING]
> 大量开发人员遇到了权限遭到拒绝的错误时往往习惯性图省事添加 `--privileged` 这个核选项但这将把**宿主机上一切特权和所有访问设备完全投射给容器内的根用户**其危险性等价于根本没有做隔离请务必查明进程出错的实际原因精准施加必要的隔离 `CAP_*` 能力
> 大量开发人员遇到了权限遭到拒绝的错误时往往习惯性图省事添加 `--privileged` 这个核选项但这将把 **宿主机上一切特权和所有访问设备完全投射给容器内的根用户**其危险性等价于根本没有做隔离请务必查明进程出错的实际原因精准施加必要的隔离 `CAP_*` 能力
### 18.4.3 总结

View File

@@ -85,4 +85,4 @@ Total: 2 (UNKNOWN: 0, LOW: 0, MEDIUM: 1, HIGH: 1, CRITICAL: 0)
### 18.5.4 容器核心层基石结语
到这里Docker 为保障宿主和容器界限安全的几个护城河**资源剥离限制** (`Cgroups`) **进程/网络/身份蒙蔽** (`Namespace`)**特权能力回收** (`Capabilities`) 再到**内核强制策略拦截管制** (`Seccomp`/`AppArmor`) 已悉数交代完毕虽然绝没有100% 免疫网络穿刺的防线只要开发者牢记 **权限最小化原则** 容器的堡垒就可以做到令攻击者望洋兴叹
到这里Docker 为保障宿主和容器界限安全的几个护城河 **资源剥离限制**(`Cgroups`) **进程/网络/身份蒙蔽**(`Namespace`) **特权能力回收**(`Capabilities`) 再到 **内核强制策略拦截管制**(`Seccomp`/`AppArmor`) 已悉数交代完毕虽然绝没有100% 免疫网络穿刺的防线只要开发者牢记 **权限最小化原则** 容器的堡垒就可以做到令攻击者望洋兴叹

View File

@@ -300,7 +300,7 @@ FROM ubuntu:latest
RUN apt-get update && apt-get install -y curl
# ✓ 推荐:固定基础镜像版本和摘要
FROM ubuntu:22.04@sha256:a6d2b38300ce017add71440577d5b0a90460d0e6...
FROM ubuntu:22.04@sha256:a6d2b38300ce017add71440577d5b0a90460d0e6e0e14...(完整 64 位哈希)
RUN apt-get update && apt-get install -y curl=7.68.0-1ubuntu1
```
@@ -320,7 +320,7 @@ RUN apk add --no-cache curl && \
RUN go build -o app .
FROM alpine:3.17@sha256:abcd...
FROM alpine:3.17@sha256:abcd1234...(请替换为实际完整的 64 位摘要哈希)
COPY --from=builder /app/app /app
```
@@ -405,13 +405,13 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v3
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
uses: docker/setup-buildx-action@v3
- name: Build Docker image
uses: docker/build-push-action@v4
uses: docker/build-push-action@v6
with:
context: .
push: false
@@ -427,7 +427,7 @@ jobs:
severity: 'HIGH,CRITICAL'
- name: Upload Trivy results to GitHub Security tab
uses: github/codeql-action/upload-sarif@v2
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: 'trivy-results.sarif'
@@ -439,28 +439,26 @@ jobs:
output-file: sbom-cyclonedx.json
- name: Upload SBOM
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: sbom
path: sbom-cyclonedx.json
- name: Sign image with Cosign
if: github.event_name == 'push'
env:
COSIGN_EXPERIMENTAL: 1
run: |
cosign sign --yes ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
- name: Login to Registry and Push
if: github.event_name == 'push'
uses: docker/login-action@v2
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push image
uses: docker/build-push-action@v4
uses: docker/build-push-action@v6
with:
context: .
push: true

View File

@@ -5,3 +5,6 @@ Docker 的安全性依赖于多层隔离机制的协同工作,同时需要用
总体来看Docker 容器还是十分安全的特别是在容器内不使用 root 权限来运行进程的话
另外用户可以使用现有工具比如 [Apparmor](https://docs.docker.com/engine/security/apparmor/)[Seccomp](https://docs.docker.com/engine/security/seccomp/)SELinuxGRSEC 来增强安全性;甚至自己在内核中实现更复杂的安全机制。
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -89,7 +89,7 @@ services:
- monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:latest
image: ghcr.io/google/cadvisor:latest
ports:
- "8080:8080"
volumes:

View File

@@ -22,10 +22,11 @@ ELK (ElasticsearchLogstashKibana) 是目前业界最流行的开源日志
```yaml
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:7.17.0
image: docker.elastic.co/elasticsearch/elasticsearch:8.17.0
container_name: elasticsearch
environment:
- "discovery.type=single-node"
- "xpack.security.enabled=false"
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ports:
- "9200:9200"
@@ -35,7 +36,7 @@ services:
- logging
kibana:
image: docker.elastic.co/kibana/kibana:7.17.0
image: docker.elastic.co/kibana/kibana:8.17.0
container_name: kibana
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
@@ -47,7 +48,7 @@ services:
- logging
fluentd:
image: fluent/fluentd-kubernetes-daemonset:v1.14.3-debian-elasticsearch7-1.0
image: fluent/fluentd-kubernetes-daemonset:v1.17-debian-elasticsearch8-1
container_name: fluentd
environment:
- "FLUENT_ELASTICSEARCH_HOST=elasticsearch"

View File

@@ -101,11 +101,9 @@ cAdvisor 是 Google 开发的容器监控工具,提供比 `docker stats` 更
**Docker Compose 部署 cAdvisor**
```yaml
version: '3.9'
services:
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
image: ghcr.io/google/cadvisor:v0.51.0
container_name: cadvisor
ports:
- "8080:8080"
@@ -165,8 +163,6 @@ scrape_configs:
**完整监控栈部署**
```yaml
version: '3.9'
services:
prometheus:
image: prom/prometheus:latest
@@ -200,7 +196,7 @@ services:
- monitoring
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.47.0
image: ghcr.io/google/cadvisor:v0.51.0
container_name: cadvisor
ports:
- "8080:8080"
@@ -376,7 +372,6 @@ docker run -m 512m --memory-swap 1g myapp:latest
# 如果不设置 --memory-swap则等于 --memory 值
# Docker Compose 配置
version: '3.9'
services:
app:
image: myapp:latest
@@ -395,7 +390,6 @@ services:
# limits绝不能超过的最大值
# reservationsCompose 排期时的参考值
version: '3.9'
services:
web:
memory: 512M # 限制

View File

@@ -5,9 +5,9 @@
* **指标监控** Prometheus + Grafana 为主完成指标采集存储与可视化
* **日志管理** EFK/ELK 为例完成容器日志的集中采集检索与分析
生产环境中建议将可观测性当成一个完整闭环**采集 -> 存储 -> 展示 -> 告警 -> 排错 -> 容量治理**
生产环境中建议将可观测性当成一个完整闭环**采集 -> 存储 -> 展示 -> 告警 -> 排错 -> 容量治理**
## 19.3 Docker 日志驱动
## 扩展阅读Docker 日志驱动
Docker 提供了多种日志驱动 (Log Driver)用于将容器标准输出的日志转发到不同后端
@@ -47,3 +47,6 @@ Docker 提供了多种日志驱动 (Log Driver),用于将容器标准输出的
* Elasticsearch 数据目录已持久化并有明确的日志保留周期与容量上限策略
* Kibana 能查询到最新日志 UI 异常时能用 Elasticsearch API 验证入库
* 可观测性组件未直接暴露到公网访问已加鉴权或置于内网
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -1,9 +1,45 @@
# 第二十章 实战案例 - 操作系统
本章将介绍 Docker 在不同操作系统镜像场景下的实战案例
## 章节概述
* [Busybox](20.1_busybox.md)
* [Alpine](20.2_alpine.md)
* [Debian Ubuntu](20.3_debian.md)
* [CentOS Fedora](20.4_centos.md)
本章将介绍 Docker 在不同操作系统镜像场景下的实战案例当你构建容器化应用时选择合适的基础镜像至关重要不同的操作系统镜像在大小功能和性能方面各有特点适用于不同的使用场景本章通过具体的案例详细讲解如何在 Docker 中使用主流操作系统镜像包括轻量级镜像 (BusyboxAlpine) 和完整功能镜像 (DebianUbuntuCentOS )
## 为什么选择合适的操作系统镜像很重要
在容器化应用开发中选择合适的基础操作系统镜像直接影响容器的大小启动速度安全性和运行性能不同的镜像提供了不同的功能集和资源占用
- **轻量级镜像** (BusyboxAlpine) - 镜像大小仅几 MB启动快速适合微服务IoT 设备和对资源敏感的环境Busybox 是最小的选择集成了常见的 Unix 工具Alpine 则提供了完整的包管理器方便安装额外工具
- **通用镜像** (DebianUbuntu) - 提供完整的 Linux 功能和丰富的软件生态镜像大小通常在 100-300 MB 之间适合需要灵活安装各种依赖和工具的应用场景
- **企业级镜像** (CentOSFedora) - 基于 Red Hat 生态广泛应用于企业环境和复杂系统应用提供了 yum 包管理器和强大的系统管理工具
选择镜像的关键原则是 "小而够用"选择满足应用需求的最小镜像这样可以减少安全漏洞表面积加快镜像拉取和推送速度降低存储成本同时也使容器更便于分发和部署
## 常用操作系统镜像对比
| 镜像 | 大小 | 包管理器 | 适用场景 | 优势 |
|------|------|--------|--------|------|
| **Busybox** | ~1 MB | | 最小化工具集initrd | 极致轻量启动秒级 |
| **Alpine** | ~5 MB | apk | 微服务静态应用 | 体积小有包管理器 |
| **Debian** | ~100 MB | apt-get | 通用应用开发环境 | 软件包丰富稳定性强 |
| **Ubuntu** | ~80 MB | apt-get | 类似 Debian现代化系统 | 更新频繁用户多 |
| **CentOS** | ~200 MB | yum | 企业应用兼容性需求 | 企业级支持稳定性高 |
| **Fedora** | ~200 MB | dnf | 新特性需求开发环境 | 最新技术栈创新性强 |
## 学习目标
通过学习本章内容你将能够
- 理解不同操作系统镜像的特点大小和适用场景
- 掌握在 Docker 中使用各类操作系统镜像的方法和最佳实践
- 学习如何根据实际需求选择合适的基础镜像实现镜像优化
- 了解如何在不同操作系统容器中安装配置和管理应用程序
- 掌握多阶段构建等高级技巧最小化最终镜像大小
- 学会使用 Docker Compose 编排多个操作系统容器环境
## 章节内容导航
* [Busybox](20.1_busybox.md) 超轻量级工具集镜像适合嵌入式和最小化容器
* [Alpine](20.2_alpine.md) 轻量级 Linux 镜像广泛用于生产环境微服务
* [Debian Ubuntu](20.3_debian.md) 功能完整的通用 Linux 镜像生态丰富
* [CentOS Fedora](20.4_centos.md) 企业级 Linux 镜像适合复杂系统应用
* [本章小结](summary.md)

View File

@@ -9,3 +9,6 @@
* 官方镜像体积都比较小只带有一些基本的组件精简的系统有利于安全稳定和高效的运行也适合进行个性化定制
* 出于安全考虑几乎所有官方制作的镜像都没有安装 SSH 服务无法通过用户名和密码直接登录到容器中
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -81,7 +81,7 @@ deploy_staging:
1. **不可变基础设施**一旦镜像构建完成在各个环境DevStagingProd中都应该使用同一个镜像 tag通常是 commit hash而不是重新构建
2. **配置分离**使用 ConfigMap Secret 管理环境特定的配置不要打包进镜像
3. **应对 Docker Hub 限额 (Rate Limits)**
- Docker Hub 对匿名拉取实施了严格的限制 (6小时内约100)若在 CI/CD 中频繁构建极易触发 `toomanyrequests` 错误
- Docker Hub 对匿名拉取实施了严格的限制 (6 小时内约 100 )若在 CI/CD 中频繁构建极易触发 `toomanyrequests` 错误
- **最佳策略**
- 在流水线开头始终执行安全的身份认证 (使用 PAT而非密码)
- 将常用的基础镜像缓存到自建的 Harbor/Nexus使用 Pull-Through Cache

View File

@@ -1,12 +1,43 @@
# 第二十一章 实战案例 - DevOps
本章将介绍 Docker DevOps 场景下的实战案例
## DevOps 背景介绍
* [DevOps 完整工作流](21.1_devops_workflow.md)
* [GitHub Actions](21.2_github_actions.md)
* [Drone](21.3_drone.md)
* [Drone Demo](21.4_drone_demo.md)
* [ IDE 中使用 Docker](21.5_ide.md)
* [VS Code](21.6_vsCode.md)
* [实战例子](21.7_practical_examples.md)
DevOps 是一种重要的开发和运维文化强调开发团队和运维团队之间的协作和自动化它致力于通过自动化和流程优化加快软件交付速度同时提高系统的稳定性和可靠性Docker 作为容器化技术的领导者已成为现代 DevOps 工作流中不可或缺的工具通过容器化应用开发团队可以确保"一次构建,处处运行"消除开发测试和生产环境的差异大大简化了部署流程
## Docker DevOps 中的角色
Docker DevOps 工作流中承担多个关键角色首先它标准化了应用的开发和部署环境使得团队成员在相同的 Docker 容器中工作避免了"在我的机器上可以运行"的问题其次Docker CI/CD 流程无缝集成通过自动化的镜像构建测试和部署实现快速的迭代周期此外Docker 还支持微服务架构和容器编排使团队能够更灵活地扩展应用和管理基础设施
## CI/CD 管道的重要性
持续集成与持续部署 (CI/CD) 是现代 DevOps 的核心通过自动化的代码检测测试构建和部署流程团队可以更加频繁地发布新版本同时保持系统的稳定性和可靠性Docker CI/CD 中扮演了重要角色
- **标准化构建环境** - Docker 确保开发测试和生产环境完全一致消除了环境差异带来的问题
- **加速流水线** - 容器的快速启动和轻量级特性大幅加快了 CI/CD 流程的执行效率
- **灵活的测试框架** - 可以轻松创建短生命周期的测试容器并行运行多个测试
- **自动化镜像发布** - CI/CD 工具可以自动构建扫描标记和推送 Docker 镜像到仓库
- **蓝绿部署和金丝雀发布** - 利用容器的隔离性和可重复性实现高级发布策略
本章将通过介绍 GitHub ActionsDrone 等流行的 CI/CD 工具展示如何在实际项目中构建完整的自动化流水线我们还将演示如何在本地开发环境中集成 Docker使用 IDE 的容器开发插件加快本地迭代周期
## 本章学习目标
通过学习本章内容你将能够
- 理解 DevOps 文化CI/CD 流程和容器化的紧密关系
- 掌握完整的 Docker 工作流从代码提交到线上部署的每一个环节
- 学习如何使用 GitHub Actions 实现自动化 CI/CD以及工作流的编写和优化
- 了解 Drone 等第三方 CI/CD 工具的架构部署和配置方式
- 学会在本地 IDE (VS Code) 中集成 Docker利用容器开发工具提升开发效率
- 掌握实战中常见的 DevOps 场景最佳实践和故障排查方法
## 章节内容导航
* [DevOps 完整工作流](21.1_devops_workflow.md) 从代码到部署的全流程
* [GitHub Actions](21.2_github_actions.md) 使用 GitHub Actions 实现 CI/CD
* [Drone](21.3_drone.md) Drone CI/CD 平台简介和配置
* [Drone Demo](21.4_drone_demo.md) Drone 实战演示和应用
* [ IDE 中使用 Docker](21.5_ide.md) IDE Docker 集成的好处
* [VS Code](21.6_vsCode.md) Visual Studio Code 容器开发指南
* [实战例子](21.7_practical_examples.md) 真实项目中的 DevOps 应用案例
* [本章小结](summary.md)

View File

@@ -14,3 +14,6 @@
* 已在用 GitHub优先补全 Actions 的缓存制品发布策略
* 自建体系结合私有 RegistryKubernetes GitOps 工具完善部署与审计
---
> 📝 **发现错误或有改进建议** 欢迎提交 [Issue](https://github.com/yeasy/docker_practice/issues) 或 [PR](https://github.com/yeasy/docker_practice/pulls)。

View File

@@ -2,7 +2,7 @@
[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![图](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![图](https://img.shields.io/badge/Based-Docker%20Engine%20v29.x-blue.svg)](https://docs.docker.com/engine/release-notes/) [![图](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1]
**v1.6.3**
**v1.6.4**
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松
@@ -17,6 +17,40 @@
* **深入原理** 12 ~ 17 章介绍其底层实现技术深入探讨容器编排体系 (KubernetesEtcd)并延伸涉及容器与云计算及其它关键生态项目 (Fedora CoreOSPodman )
* **实战扩展** 18 ~ 21 章重点讨论容器安全防护机制监控与日志聚合系统 (PrometheusELK)并展示操作系统CI/CD 自动化构建等典型实践案例
## 五分钟快速上手
"5分钟运行第一个容器"跟随以下步骤快速体验 Docker
1. **安装 Docker**第1章根据操作系统完成 Docker 的安装与验证
2. **第一个容器**执行 `docker run hello-world`体验最简单的容器运行
3. **交互式容器**执行 `docker run -it ubuntu bash`进入容器内部与系统交互
4. **镜像与仓库**第2-3理解镜像的概念查找镜像拉取和使用官方镜像
5. **自定义镜像**第5章学习如何编写 Dockerfile 创建自己的镜像
## 学习路线图
```mermaid
graph LR
Start[Docker 学习入口] --> Ch1[第1章基础安装]
Ch1 --> Role1["运维新手<br/>第1-4章"]
Ch1 --> Role2["开发者<br/>第1-3章 → 第5-8章"]
Ch1 --> Role3["DevOps 工程师<br/>第1章 → 第9-14章 → 第18章"]
Ch1 --> Role4["架构师<br/>第1章 → 第15-21章"]
Role1 --> End1["掌握基本操作"]
Role2 --> End2["构建与部署应用"]
Role3 --> End3["自动化与运维"]
Role4 --> End4["设计容器方案"]
```
| 读者角色 | 学习重点 | 核心成果 |
|---------|---------|---------|
| **运维新手** | 第1-4 | 掌握容器的基本概念与操作 |
| **开发者** | 第1-3 第5-8 | 学会容器化应用的构建与部署 |
| **DevOps 工程师** | 第1章 第9-14 第18章 | 实现容器编排与自动化部署流程 |
| **架构师** | 第1章 第15-21 | 设计高可用高性能的容器基础设施 |
## 阅读方式
本书按需提供多种阅读模式具体如下
@@ -78,13 +112,22 @@ npx honkit serve
* [京东图书][1]
* [天猫图书](https://detail.tmall.com/item.htm?id=997383773726&skuId=6143496614475)
## 推荐阅读
本书是技术丛书的一部分以下书籍与本书形成互补
| 书名 | 与本书的关系 |
|------|------------|
| [区块链技术指南](https://github.com/yeasy/blockchain_guide) | 利用 Docker 部署区块链节点 |
| [OpenClaw 从入门到精通](https://github.com/yeasy/openclaw_guide) | 利用 Docker 部署 AI 智能体 |
## 鼓励项目
<p align="center">
<img width="200" src="https://github.com/yeasy/docker_practice/raw/master/_images/donate.jpeg">
</p>
<p align="center"><strong>欢迎鼓励项目一杯 coffee~</strong></p>
<p align=center><strong>欢迎鼓励项目一杯 coffee~</strong></p>
## Star History

View File

@@ -4,7 +4,7 @@
## 1. 安全与凭据处理
任何示例文档中都**严禁出现将凭据以明文形式直接传递给命令参数**的做法
任何示例文档中都 **严禁出现将凭据以明文形式直接传递给命令参数** 的做法
* **错误示例**`docker login -u myuser -p mysecretpassword` (这会导致密码泄露到历史记录及进程列表中)
* **正确示例交互式**推荐读者直接使用 `docker login` (优先使用官方 Device Code Flow)
@@ -17,7 +17,7 @@
* **明确声明前置条件**例如此功能需要开启 containerd image store 需要额外配置 `--push`
* **描述失败现象**明确告诉读者如果你不这么配置命令仍会提示成功但产物将不可见/被丢弃
## 3. 统一使用 "docker compose" 命令
## 3. 统一使用 docker compose 命令
早期 Python 编写的 `docker-compose` (V1) 已停止支持