mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-08-10 08:27:25 +00:00
fix(content): harden Docker examples
This commit is contained in:
@@ -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. 关注镜像漏洞
|
||||
|
||||
@@ -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。
|
||||
|
||||
核心组件如下:
|
||||
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
容器的网络访问规则如下:
|
||||
|
||||
- **容器之间**:可以通过 IP 或容器名 (自定义网络) 互通。
|
||||
- **宿主机访问容器**:可以通过容器 IP 访问。
|
||||
- **宿主机访问容器**:原生 Linux 环境下可按网络配置访问容器 IP;Docker Desktop 上不能依赖容器 IP,应通过端口映射、容器名(容器间)或 `host.docker.internal` 等机制访问。
|
||||
- **外部网络访问容器**:❌ 默认无法直接访问。
|
||||
|
||||
为了让外部 (如你的浏览器、其他局域网机器) 访问容器内的服务,我们需要将容器的端口 **映射** 到宿主机的端口。
|
||||
|
||||
@@ -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`、命令行或 Git。Compose 官方建议敏感值使用 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. 数据持久化
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
### 13.2.1 节点
|
||||
|
||||
在 `Kubernetes` 中,节点是实际工作的点,节点可以是虚拟机或者物理机器,依赖于一个集群环境。每个节点都有一些必要的服务以运行容器组,并且它们都可以通过主节点来管理。必要服务包括 Docker,kubelet 和代理服务。
|
||||
在 `Kubernetes` 中,节点是实际工作的点,节点可以是虚拟机或者物理机器,依赖于一个集群环境。每个节点都有一些必要的组件以运行容器组,并且它们都可以通过控制平面来管理。必要组件包括 kubelet、容器运行时(如 containerd 或 CRI-O)和 kube-proxy;Docker 不再是 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])
|
||||
|
||||
Reference in New Issue
Block a user