Use a better structure

This commit is contained in:
Baohua Yang
2026-02-09 09:32:05 -08:00
parent fdb879dcf2
commit e669ee0fe8
167 changed files with 2462 additions and 2462 deletions

View File

@@ -1,4 +1,4 @@
# 运维管理
# 第十章 运维管理
本章将介绍 Docker 的运维管理包括监控日志与安全

View File

@@ -1,8 +1,8 @@
# 日志管理
## 日志管理
在容器化环境中日志管理比传统环境更为复杂容器是短暂的意味着容器内的日志文件可能会随着容器的销毁而丢失因此我们需要一种集中式的日志管理方案来收集存储和分析容器日志
## Docker 日志驱动
### Docker 日志驱动
Docker 提供了多种日志驱动Log Driver机制允许我们将容器日志转发到不同的后端
@@ -15,7 +15,7 @@ Docker 提供了多种日志驱动Log Driver机制允许我们将容器
* `gelf`: 支持 GELF 协议的日志后端 Graylog
* `awslogs`: 发送到 Amazon CloudWatch Logs
## 日志管理方案
### 日志管理方案
对于大规模的容器集群我们通常会采用 EFK (Elasticsearch + Fluentd + Kibana) ELK (Elasticsearch + Logstash + Kibana) 方案

View File

@@ -1,8 +1,8 @@
# ELK/EFK 堆栈
## ELK/EFK 堆栈
ELK (Elasticsearch, Logstash, Kibana) 是目前业界最流行的开源日志解决方案而在容器领域由于 Fluentd 更加轻量级且对容器支持更好EFK (Elasticsearch, Fluentd, Kibana) 组合也变得非常流行
## 方案架构
### 方案架构
我们将采用以下架构
@@ -11,9 +11,9 @@ ELK (Elasticsearch, Logstash, Kibana) 是目前业界最流行的开源日志解
3. **Elasticsearch**: 存储从 Fluentd 接收到的日志数据
4. **Kibana**: Elasticsearch 读取数据并进行可视化展示
## 部署流程
### 部署流程
### 1. 编写 docker-compose.yml
#### 1. 编写 docker-compose.yml
```yaml
version: '3'
@@ -68,7 +68,7 @@ networks:
logging:
```
### 2. 配置 Fluentd
#### 2. 配置 Fluentd
创建 `fluentd/conf/fluent.conf`:
@@ -99,7 +99,7 @@ networks:
</match>
```
### 3. 配置应用容器使用 fluentd 驱动
#### 3. 配置应用容器使用 fluentd 驱动
启动一个测试容器指定日志驱动为 `fluentd`:
@@ -114,7 +114,7 @@ docker run -d \
**注意**: 确保 `fluentd` 容器已经启动并监听在 `localhost:24224`在生产环境中如果你是在不同机器上需要将 `localhost` 替换为运行 fluentd 的主机 IP
### 4. Kibana 中查看日志
#### 4. Kibana 中查看日志
1. 访问 `http://localhost:5601`
2. 进入 **Management** -> **Kibana** -> **Index Patterns**
@@ -122,6 +122,6 @@ docker run -d \
4. 选择 `@timestamp` 作为时间字段
5. **Discover** 页面你就能看到 Nginx 容器的日志了
## 总结
### 总结
通过 Docker 的日志驱动机制结合 ELK/EFK 强大的收集和分析能力我们可以轻松构建一个能够处理海量日志的监控平台这对于排查生产问题至关重要

View File

@@ -1,10 +1,10 @@
# 容器监控
## 容器监控
容器化技术的普及使得应用部署变得更加灵活和高效但也给监控带来了新的挑战
在传统架构中我们通常关注主机的 CPU内存磁盘 IO 等指标而在容器环境下除了主机层面的监控我们更关注容器级别的资源使用情况服务的运行状态以及编排系统的健康状况
## 常见的监控方案
### 常见的监控方案
目前主流的容器监控方案包括

View File

@@ -1,8 +1,8 @@
# Prometheus + Grafana
## Prometheus + Grafana
[Prometheus](https://prometheus.io/) 是一个开源的系统监控和报警工具包。它受 Google Borgmon 的启发,由 SoundCloud 在 2012 年创建。
## 架构简介
### 架构简介
Prometheus 的主要组件包括
@@ -11,11 +11,11 @@ Prometheus 的主要组件包括:
* **Alertmanager**: 处理报警发送
* **Pushgateway**: 用于支持短生命周期的 Job 推送数据
## 快速部署
### 快速部署
我们可以使用 Docker Compose 快速部署一套 Prometheus + Grafana 监控环境
### 1. 准备配置文件
#### 1. 准备配置文件
创建 `prometheus.yml`:
@@ -37,7 +37,7 @@ scrape_configs:
- targets: ['cadvisor:8080']
```
### 2. 编写 Docker Compose 文件
#### 2. 编写 Docker Compose 文件
创建 `docker-compose.yml`:
@@ -88,7 +88,7 @@ networks:
monitoring:
```
### 3. 启动服务
#### 3. 启动服务
```bash
$ docker-compose up -d
@@ -99,7 +99,7 @@ $ docker-compose up -d
* Prometheus: `http://localhost:9090`
* Grafana: `http://localhost:3000` (默认账号密码: admin/admin)
## 配置 Grafana 面板
### 配置 Grafana 面板
1. Grafana 中添加 Prometheus 数据源URL 填写 `http://prometheus:9090`
2. 导入现成的 Dashboard 模板例如 [Node Exporter Full](https://grafana.com/grafana/dashboards/1860) (ID: 1860) 和 [Docker Container](https://grafana.com/grafana/dashboards/193) (ID: 193)。

View File

@@ -1,8 +1,8 @@
# 安全
## 安全
容器安全是生产环境部署的核心考量本章介绍 Docker 的安全机制和最佳实践
## 容器安全的本质
### 容器安全的本质
> **核心问题**容器共享宿主机内核隔离性弱于虚拟机如何在便利性和安全性之间取得平衡
@@ -23,9 +23,9 @@
---
## 核心安全机制
### 核心安全机制
### 1. 命名空间Namespace
#### 1. 命名空间Namespace
提供进程网络文件系统等资源的隔离
@@ -38,24 +38,24 @@
| IPC | 进程通信 | 隔离共享内存 |
| UTS | 主机名 | 独立主机名 |
详见 [命名空间](../13_implementation/namespace.md) 章节
详见 [命名空间](../13_implementation/13.2_namespace.md) 章节
### 2. 控制组Cgroups
#### 2. 控制组Cgroups
限制容器的资源使用防止资源耗尽攻击
```bash
# 限制内存(超出会被 OOM Kill
## 限制内存(超出会被 OOM Kill
$ docker run -m 512m myapp
# 限制 CPU
## 限制 CPU
$ docker run --cpus=1.5 myapp
# 限制磁盘 I/O
## 限制磁盘 I/O
$ docker run --device-write-bps /dev/sda:10mb myapp
```
### 3. 能力机制Capabilities
#### 3. 能力机制Capabilities
Linux root 权限拆分为多个细粒度的能力Docker 默认禁用危险能力
@@ -68,78 +68,78 @@ Linux 将 root 权限拆分为多个细粒度的能力。Docker 默认禁用危
| `CAP_NET_BIND_SERVICE` | 绑定低端口 | 启用 |
```bash
# 删除所有能力,只添加需要的
## 删除所有能力,只添加需要的
$ docker run --cap-drop=all --cap-add=NET_BIND_SERVICE myapp
# 查看容器的能力
## 查看容器的能力
$ docker exec myapp cat /proc/1/status | grep Cap
```
---
## 镜像安全
### 镜像安全
### 使用可信镜像
#### 使用可信镜像
```bash
# ✅ 使用官方镜像
## ✅ 使用官方镜像
$ docker pull nginx
# ✅ 使用经过验证的镜像
## ✅ 使用经过验证的镜像
$ docker pull bitnami/nginx
# ⚠️ 谨慎使用未知来源镜像
## ⚠️ 谨慎使用未知来源镜像
$ docker pull randomuser/suspicious-image
```
### 漏洞扫描
#### 漏洞扫描
扫描镜像中的已知安全漏洞
```bash
# Docker Scout官方工具
## Docker Scout官方工具
$ docker scout cves nginx:latest
$ docker scout recommendations nginx:latest
# Trivy开源工具
## Trivy开源工具
$ trivy image nginx:latest
# Snyk商业工具
## Snyk商业工具
$ snyk container test nginx:latest
```
### 镜像签名验证
#### 镜像签名验证
使用 Docker Content Trust (DCT) 验证镜像来源
```bash
# 启用镜像签名验证
## 启用镜像签名验证
$ export DOCKER_CONTENT_TRUST=1
# 此后的 pull/push 会验证签名
## 此后的 pull/push 会验证签名
$ docker pull myregistry/myimage:latest
```
---
## 运行时安全
### 运行时安全
### 1. root 用户运行
#### 1. root 用户运行
> 笔者强调这是最重要的安全实践之一
```dockerfile
FROM node:22-alpine
# 创建非 root 用户
## 创建非 root 用户
RUN addgroup -g 1001 appgroup && \
adduser -u 1001 -G appgroup -D appuser
# 设置工作目录权限
## 设置工作目录权限
WORKDIR /app
COPY --chown=appuser:appgroup . .
# 切换用户
## 切换用户
USER appuser
CMD ["node", "server.js"]
@@ -151,27 +151,27 @@ CMD ["node", "server.js"]
$ docker run -u 1001:1001 myapp
```
### 2. 只读文件系统
#### 2. 只读文件系统
```bash
# 根文件系统只读
## 根文件系统只读
$ docker run --read-only myapp
# 需要写入的目录使用 tmpfs
## 需要写入的目录使用 tmpfs
$ docker run --read-only --tmpfs /tmp --tmpfs /var/run myapp
```
### 3. 禁用特权模式
#### 3. 禁用特权模式
```bash
# ❌ 绝对不要在生产环境使用
## ❌ 绝对不要在生产环境使用
$ docker run --privileged myapp
# ✅ 只添加必要的能力
## ✅ 只添加必要的能力
$ docker run --cap-add=SYS_TIME myapp
```
### 4. 限制资源
#### 4. 限制资源
```bash
$ docker run \
@@ -182,75 +182,75 @@ $ docker run \
myapp
```
### 5. 网络隔离
#### 5. 网络隔离
```bash
# 禁用网络(适用于不需要网络的任务)
## 禁用网络(适用于不需要网络的任务)
$ docker run --network=none myapp
# 使用自定义网络隔离
## 使用自定义网络隔离
$ docker network create --internal isolated_net
$ docker run --network=isolated_net myapp
```
---
## Dockerfile 安全实践
### Dockerfile 安全实践
### 1. 使用精简基础镜像
#### 1. 使用精简基础镜像
```dockerfile
# ✅ 好:使用精简镜像
## ✅ 好:使用精简镜像
FROM node:22-alpine # ~50MB
FROM gcr.io/distroless/nodejs # ~20MB
# ❌ 差:使用完整镜像
## ❌ 差:使用完整镜像
FROM node:22 # ~1GB
FROM ubuntu:24.04 # ~78MB
```
### 2. 多阶段构建
#### 2. 多阶段构建
```dockerfile
# 构建阶段
## 构建阶段
FROM node:22 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
# 生产阶段(不包含开发依赖和源码)
## 生产阶段(不包含开发依赖和源码)
FROM node:22-alpine
COPY --from=builder /app/dist /app
USER node
CMD ["node", "/app/server.js"]
```
### 3. 不存储敏感信息
#### 3. 不存储敏感信息
```dockerfile
# ❌ 错误:敏感信息写入镜像
## ❌ 错误:敏感信息写入镜像
ENV DB_PASSWORD=secret123
COPY .env /app/
# ✅ 正确:运行时传入
# docker run -e DB_PASSWORD=xxx 或使用 Docker Secrets
## ✅ 正确:运行时传入
## docker run -e DB_PASSWORD=xxx 或使用 Docker Secrets
```
### 4. 固定依赖版本
#### 4. 固定依赖版本
```dockerfile
# ✅ 固定版本
## ✅ 固定版本
FROM node:22.12.0-alpine3.21
RUN apk add --no-cache curl=8.5.0-r0
# ❌ 使用 latest
## ❌ 使用 latest
FROM node:latest
RUN apk add curl
```
---
## 安全扫描清单
### 安全扫描清单
部署前检查
@@ -267,9 +267,9 @@ RUN apk add curl
---
## 高级安全方案
### 高级安全方案
### Seccomp 系统调用过滤
#### Seccomp 系统调用过滤
限制容器可以使用的系统调用
@@ -277,7 +277,7 @@ RUN apk add curl
$ docker run --security-opt seccomp=/path/to/profile.json myapp
```
### AppArmor / SELinux
#### AppArmor / SELinux
使用强制访问控制
@@ -285,48 +285,48 @@ $ docker run --security-opt seccomp=/path/to/profile.json myapp
$ docker run --security-opt apparmor=docker-default myapp
```
### 安全容器gVisor / Kata
#### 安全容器gVisor / Kata
需要更强隔离时
```bash
# 使用 gVisor 运行时
## 使用 gVisor 运行时
$ docker run --runtime=runsc myapp
```
---
## 软件供应链安全
### 软件供应链安全
随着软件供应链攻击日益频繁仅保障运行时安全已不足够
### 1. SBOM (软件物料清单)
#### 1. SBOM (软件物料清单)
SBOM 类似于食品的配料表列出了容器镜像中包含的所有软件包及其版本
- **生成 SBOM**: 使用 `docker buildx build --sbom` `docker scout sbom`
- **管理 SBOM**: 确保持续监控 SBOM 中的组件是否存在新披露的漏洞
### 2. 镜像签名 (Sigstore / Notary v2)
#### 2. 镜像签名 (Sigstore / Notary v2)
确保镜像在构建后未被篡改且确实来自可信的发布者
- **Cosign**: Sigstore 项目的一部分用于签署和验证容器镜像
```bash
# 签署镜像
## 签署镜像
$ cosign sign --key cosign.key myimage:tag
# 验证镜像
## 验证镜像
$ cosign verify --key cosign.pub myimage:tag
```
### 3. SLSA (Supply-chain Levels for Software Artifacts)
#### 3. SLSA (Supply-chain Levels for Software Artifacts)
遵循 SLSA 框架确保构建过程的完整性例如使用 GitHub Actions 等受控环境进行构建而非在开发者本地机器上构建发布
---
## 本章小结
### 本章小结
| 安全措施 | 重要程度 | 实现方式 |
|---------|---------|---------|
@@ -337,8 +337,8 @@ $ cosign verify --key cosign.pub myimage:tag
| 最小能力 | | `--cap-drop=all` |
| 镜像签名 | | Docker Content Trust |
## 延伸阅读
### 延伸阅读
- [命名空间](../13_implementation/namespace.md)隔离机制详解
- [控制组](../13_implementation/cgroups.md)资源限制详解
- [最佳实践](../15_appendix/best_practices.md)Dockerfile 安全配置
- [命名空间](../13_implementation/13.2_namespace.md)隔离机制详解
- [控制组](../13_implementation/13.3_cgroups.md)资源限制详解
- [最佳实践](../15_appendix/15.1_best_practices.md)Dockerfile 安全配置

View File

@@ -1,4 +1,4 @@
# 控制组
## 控制组
控制组是 Linux 容器机制的另外一个关键组件负责实现资源的审计和限制

View File

@@ -1,4 +1,4 @@
# Docker服务端的防护
## Docker服务端的防护
运行一个容器或应用程序的核心是通过 Docker 服务端Docker 服务的运行目前需要 root 权限因此其安全性十分关键

View File

@@ -1,4 +1,4 @@
# 内核能力机制
## 内核能力机制
[能力机制Capability](https://man7.org/linux/man-pages/man7/capabilities.7.html) 是 Linux 内核一个强大的特性,可以提供细粒度的权限访问控制。
Linux 内核自 2.2 版本起就支持能力机制它将权限划分为更加细粒度的操作能力既可以作用在进程上也可以作用在文件上

View File

@@ -1,4 +1,4 @@
# 内核命名空间
## 内核命名空间
Docker 容器和 LXC 容器很相似所提供的安全特性也差不多当用 `docker run` 启动一个容器时在后台 Docker 为容器创建了一个独立的命名空间和控制组集合

View File

@@ -1,4 +1,4 @@
# 其它安全特性
## 其它安全特性
除了能力机制之外还可以利用一些现有的安全机制来增强使用 Docker 的安全性例如 TOMOYO, AppArmor, Seccomp, SELinux, GRSEC

View File

@@ -1,4 +1,4 @@
# 总结
## 总结
总体来看Docker 容器还是十分安全的特别是在容器内不使用 root 权限来运行进程的话