diff --git a/06_repository/6.1_dockerhub.md b/06_repository/6.1_dockerhub.md index 74e6870..83914d9 100644 --- a/06_repository/6.1_dockerhub.md +++ b/06_repository/6.1_dockerhub.md @@ -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. 关注镜像漏洞 diff --git a/09_network/9.2_network_types.md b/09_network/9.2_network_types.md index 048b206..0b9f48f 100644 --- a/09_network/9.2_network_types.md +++ b/09_network/9.2_network_types.md @@ -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。 核心组件如下: diff --git a/09_network/9.5_port_mapping.md b/09_network/9.5_port_mapping.md index 38b4a1a..c85b22d 100644 --- a/09_network/9.5_port_mapping.md +++ b/09_network/9.5_port_mapping.md @@ -7,7 +7,7 @@ 容器的网络访问规则如下: - **容器之间**:可以通过 IP 或容器名 (自定义网络) 互通。 -- **宿主机访问容器**:可以通过容器 IP 访问。 +- **宿主机访问容器**:原生 Linux 环境下可按网络配置访问容器 IP;Docker Desktop 上不能依赖容器 IP,应通过端口映射、容器名(容器间)或 `host.docker.internal` 等机制访问。 - **外部网络访问容器**:❌ 默认无法直接访问。 为了让外部 (如你的浏览器、其他局域网机器) 访问容器内的服务,我们需要将容器的端口 **映射** 到宿主机的端口。 diff --git a/11_compose/11.8_wordpress.md b/11_compose/11.8_wordpress.md index 1c95dd3..e1aaa36 100644 --- a/11_compose/11.8_wordpress.md +++ b/11_compose/11.8_wordpress.md @@ -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. 数据持久化 diff --git a/13_kubernetes_concepts/13.2_concepts.md b/13_kubernetes_concepts/13.2_concepts.md index 20e88cd..3faee36 100644 --- a/13_kubernetes_concepts/13.2_concepts.md +++ b/13_kubernetes_concepts/13.2_concepts.md @@ -19,7 +19,7 @@ ### 13.2.1 节点 -在 `Kubernetes` 中,节点是实际工作的点,节点可以是虚拟机或者物理机器,依赖于一个集群环境。每个节点都有一些必要的服务以运行容器组,并且它们都可以通过主节点来管理。必要服务包括 Docker,kubelet 和代理服务。 +在 `Kubernetes` 中,节点是实际工作的点,节点可以是虚拟机或者物理机器,依赖于一个集群环境。每个节点都有一些必要的组件以运行容器组,并且它们都可以通过控制平面来管理。必要组件包括 kubelet、容器运行时(如 containerd 或 CRI-O)和 kube-proxy;Docker 不再是 Kubernetes 节点的默认基线运行时。 #### 容器状态 diff --git a/19_observability/19.3_performance_optimization.md b/19_observability/19.3_performance_optimization.md index d73de93..88ab93b 100644 --- a/19_observability/19.3_performance_optimization.md +++ b/19_observability/19.3_performance_optimization.md @@ -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])