fix(content): harden Docker examples

This commit is contained in:
yeasy
2026-05-23 21:28:59 -07:00
parent 6a55219310
commit 28c23d003e
6 changed files with 42 additions and 19 deletions
+3 -2
View File
@@ -107,10 +107,11 @@ Docker Hub 对不同类型用户实施拉取速率限制(基于 6 小时周期
> ** 警告**绝不要在脚本或 CI/CD 系统中直接使用 `-p` 参数传递密码或 Token (类似 `docker login -p xxx`)这会导致凭证直接暴露在系统的命令历史进程列表和终端输出中
1. Docker Hub -> Account Settings -> Security -> Access Tokens 创建 Token (PAT)
2. Token 通过标准输入 (stdin) 安全传递给 Docker:
2. Token 保存在权限受限的本地文件或 CI secret 通过标准输入 (stdin) 传递给 Docker避免把真实 Token 写进脚本命令历史或日志
```bash
$ echo "dckr_pat_xxxxxxx" | docker login --username username --password-stdin
$ chmod 600 "$HOME/.dockerhub-token"
$ cat "$HOME/.dockerhub-token" | docker login --username username --password-stdin
```
#### 3. 关注镜像漏洞
+1 -1
View File
@@ -25,7 +25,7 @@ ghi789... none null local
### 9.2.2 Bridge 网络默认
Bridge Docker 默认使用的网络模式Docker 启动时会自动创建 `docker0` 虚拟网桥所有未指定网络的容器会连接到这个网桥上
Bridge Docker 默认使用的网络模式在原生 Linux Docker Engine Docker 启动时通常会创建 `docker0` 虚拟网桥未指定网络的容器会连接到这个网桥上Docker Desktop 运行在虚拟机内宿主机上不会直接看到 `docker0`也不能假设宿主机可直接访问每个容器 IP
核心组件如下
+1 -1
View File
@@ -7,7 +7,7 @@
容器的网络访问规则如下
- **容器之间**可以通过 IP 或容器名 (自定义网络) 互通
- **宿主机访问容器**可以通过容器 IP 访问
- **宿主机访问容器**原生 Linux 环境下可按网络配置访问容器 IPDocker Desktop 上不能依赖容器 IP应通过端口映射容器名容器间 `host.docker.internal` 等机制访问
- **外部网络访问容器** 默认无法直接访问
为了让外部 (如你的浏览器其他局域网机器) 访问容器内的服务我们需要将容器的端口 **映射** 到宿主机的端口
+27 -10
View File
@@ -13,7 +13,10 @@ WordPress 是全球最流行的内容管理系统 (CMS)。使用 Docker Compose
```bash
wordpress/
├── compose.yaml
├── .env # 环境变量(敏感信息
├── .env # 非敏感环境变量(如版本、端口
├── secrets/ # 本地密钥文件,生产环境应由密钥管理系统提供
│ ├── db_root_password.txt
│ └── db_password.txt
└── nginx/ # 可选:反向代理配置
└── nginx.conf
```
@@ -38,10 +41,13 @@ services:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
environment:
MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: ${DB_PASSWORD}
MYSQL_PASSWORD_FILE: /run/secrets/db_password
secrets:
- db_root_password
- db_password
volumes:
- db_data:/var/lib/mysql
networks:
@@ -60,8 +66,10 @@ services:
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: ${DB_PASSWORD}
WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password
WORDPRESS_DB_NAME: wordpress
secrets:
- db_password
volumes:
- wp_data:/var/www/html
# 增加上传文件大小限制
@@ -78,20 +86,29 @@ volumes:
networks:
wp_net:
secrets:
db_root_password:
file: ./secrets/db_root_password.txt
db_password:
file: ./secrets/db_password.txt
```
---
### 11.8.3 配置文件详解
#### 1. 环境变量文件 .env
#### 1. 密钥文件
为了安全不要在 `compose.yaml` 中直接写密码创建 `.env` 文件
不要把数据库密码写入 `compose.yaml``.env`命令行或 GitCompose 官方建议敏感值使用 secrets本地练习可用只读密钥文件模拟
```ini
DB_ROOT_PASSWORD=somestrongrootpassword
DB_PASSWORD=somestronguserpassword
```bash
mkdir -p secrets
printf '%s\n' 'somestrongrootpassword' > secrets/db_root_password.txt
printf '%s\n' 'somestronguserpassword' > secrets/db_password.txt
chmod 600 secrets/*.txt
```
Compose 会自动读取此同级目录下的文件
`secrets/` 加入 `.gitignore`生产环境应改用平台密钥管理能力而不是把真实密码放在项目目录
#### 2. 数据持久化
+1 -1
View File
@@ -19,7 +19,7 @@
### 13.2.1 节点
`Kubernetes` 节点是实际工作的点节点可以是虚拟机或者物理机器依赖于一个集群环境每个节点都有一些必要的服务以运行容器组并且它们都可以通过主节点来管理必要服务包括 Dockerkubelet 和代理服务
`Kubernetes` 节点是实际工作的点节点可以是虚拟机或者物理机器依赖于一个集群环境每个节点都有一些必要的组件以运行容器组并且它们都可以通过控制平面来管理必要组件包括 kubelet容器运行时 containerd CRI-O kube-proxyDocker 不再是 Kubernetes 节点的默认基线运行时
#### 容器状态
@@ -66,8 +66,11 @@ docker stats nginx redis
# 一次性输出不进入交互模式
docker stats --no-stream
# 指定刷新间隔单位默认 1
docker stats --no-stream --interval 2
# 2 秒采样一次docker stats 没有 --interval 选项
while true; do
docker stats --no-stream
sleep 2
done
# 格式化输出使用 Go 模板
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" --no-stream
@@ -182,6 +185,8 @@ services:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=30d'
extra_hosts:
- "host.docker.internal:host-gateway"
networks:
- monitoring
@@ -258,7 +263,7 @@ scrape_configs:
- job_name: 'docker'
static_configs:
- targets: ['localhost:9323']
- targets: ['host.docker.internal:9323']
```
**常用的 Prometheus 查询PromQL**
@@ -276,7 +281,7 @@ rate(container_network_receive_bytes_total[5m]) / 1024 / 1024
rate(container_network_transmit_bytes_total[5m]) / 1024 / 1024
# 容器磁盘读取速率MB/s
rate(container_fs_io_current[5m]) / 1024 / 1024
rate(container_fs_reads_bytes_total[5m]) / 1024 / 1024
# CPU 限流情况
rate(container_cpu_cfs_throttled_seconds_total[5m])