From 1cdd3c582a7a56e299bedcae0ecd36b1beaf24e9 Mon Sep 17 00:00:00 2001 From: yeasy Date: Mon, 1 Jun 2026 10:33:50 -0700 Subject: [PATCH] fix(content): harden Docker examples --- 04_image/demo/multistage-builds/Dockerfile | 4 ---- .../demo/multistage-builds/Dockerfile.build | 5 +---- 04_image/demo/multistage-builds/Dockerfile.one | 5 ++--- 06_repository/6.1_dockerhub.md | 6 +++--- 11_compose/demo/wordpress/docker-compose.yml | 17 ++++++++++++++--- .../19.3_performance_optimization.md | 16 +++++++++++----- 21_case_devops/21.2_github_actions.md | 2 +- 21_case_devops/drone_docker-compose.yml | 4 ++-- 8 files changed, 34 insertions(+), 25 deletions(-) diff --git a/04_image/demo/multistage-builds/Dockerfile b/04_image/demo/multistage-builds/Dockerfile index d1492bc..9dcf57e 100644 --- a/04_image/demo/multistage-builds/Dockerfile +++ b/04_image/demo/multistage-builds/Dockerfile @@ -1,11 +1,7 @@ FROM golang:alpine as builder -RUN apk --no-cache add git - WORKDIR /go/src/github.com/go/helloworld/ -RUN go get -d -v github.com/go-sql-driver/mysql - COPY app.go . RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . diff --git a/04_image/demo/multistage-builds/Dockerfile.build b/04_image/demo/multistage-builds/Dockerfile.build index 48d620a..112595b 100644 --- a/04_image/demo/multistage-builds/Dockerfile.build +++ b/04_image/demo/multistage-builds/Dockerfile.build @@ -1,10 +1,7 @@ FROM golang:alpine -RUN apk --no-cache add git - WORKDIR /go/src/github.com/go/helloworld COPY app.go . -RUN go get -d -v github.com/go-sql-driver/mysql \ - && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . diff --git a/04_image/demo/multistage-builds/Dockerfile.one b/04_image/demo/multistage-builds/Dockerfile.one index ed996af..e2fe420 100644 --- a/04_image/demo/multistage-builds/Dockerfile.one +++ b/04_image/demo/multistage-builds/Dockerfile.one @@ -1,13 +1,12 @@ FROM golang:alpine -RUN apk --no-cache add git ca-certificates +RUN apk --no-cache add ca-certificates WORKDIR /go/src/github.com/go/helloworld/ COPY app.go . -RUN go get -d -v github.com/go-sql-driver/mysql \ - && CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . \ +RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app . \ && cp /go/src/github.com/go/helloworld/app /root WORKDIR /root/ diff --git a/06_repository/6.1_dockerhub.md b/06_repository/6.1_dockerhub.md index 83914d9..d684243 100644 --- a/06_repository/6.1_dockerhub.md +++ b/06_repository/6.1_dockerhub.md @@ -11,7 +11,7 @@ Docker Hub 是 Docker 的中央镜像仓库,通过它您可以轻松地分享 - **官方镜像**:由 Docker 官方和软件厂商 (如 Nginx,MySQL,Node.js) 维护的高质量镜像。 - **个人/组织仓库**:用户可以上传自己的镜像。 -- **自动构建**:与 GitHub/Bitbucket 集成 (需付费)。 +- **自动构建**:与 GitHub/Bitbucket 集成的历史功能,Docker 已标记为 deprecated,并计划于 2027-04-01 完全退役。 - **Webhooks**:镜像更新时触发回调。 --- @@ -131,8 +131,8 @@ Docker Hub 提供 Docker Scout 安全扫描功能。官方镜像的漏洞扫描 ### 6.1.6 自动构建 -> ⚠️ 目前仅限付费用户 (Pro/Team) 使用。 +> ⚠️ Docker Hub Automated Builds 已被 Docker 标记为 deprecated,并计划于 2027-04-01 完全退役;新项目应优先使用 GitHub Actions、Buildx 或自有 CI 构建并推送镜像。 -链接 GitHub/Bitbucket 仓库后,当代码有提交或打标签时,Docker Hub 会自动运行构建。这保证了镜像总是与代码同步,且由可信的官方环境构建。 +对于仍在迁移期内的旧仓库,链接 GitHub/Bitbucket 仓库后,当代码有提交或打标签时,Docker Hub 会自动运行构建。不要把它作为新架构的默认方案。 --- diff --git a/11_compose/demo/wordpress/docker-compose.yml b/11_compose/demo/wordpress/docker-compose.yml index c3e8a81..a4bb50b 100644 --- a/11_compose/demo/wordpress/docker-compose.yml +++ b/11_compose/demo/wordpress/docker-compose.yml @@ -11,10 +11,13 @@ services: - db_data:/var/lib/mysql restart: always environment: - MYSQL_ROOT_PASSWORD: somewordpress + MYSQL_ROOT_PASSWORD_FILE: /run/secrets/db_root_password MYSQL_DATABASE: wordpress MYSQL_USER: wordpress - MYSQL_PASSWORD: wordpress + MYSQL_PASSWORD_FILE: /run/secrets/db_password + secrets: + - db_root_password + - db_password wordpress: depends_on: @@ -26,6 +29,14 @@ services: environment: WORDPRESS_DB_HOST: db:3306 WORDPRESS_DB_USER: wordpress - WORDPRESS_DB_PASSWORD: wordpress + WORDPRESS_DB_PASSWORD_FILE: /run/secrets/db_password + secrets: + - db_password volumes: db_data: + +secrets: + db_root_password: + file: ./secrets/db_root_password.txt + db_password: + file: ./secrets/db_password.txt diff --git a/19_observability/19.3_performance_optimization.md b/19_observability/19.3_performance_optimization.md index 88ab93b..768e16d 100644 --- a/19_observability/19.3_performance_optimization.md +++ b/19_observability/19.3_performance_optimization.md @@ -96,7 +96,7 @@ done ```bash # CPU % 超过 80%:需要增加 CPU 限制或优化应用 # MEM % 接近 100%:容器即将 OOM,需要增加内存或排查内存泄漏 -# 如果 NET I/O 中 dropped 为非零:网络拥塞或丢包 +# NET I/O 只显示收发字节;丢包要看 ip -s link、cAdvisor/Prometheus 或主机网卡计数器 ``` ### 19.3.3 cAdvisor 容器监控系统 @@ -376,7 +376,8 @@ docker run -m 512m --memory-swap 1g myapp:latest # 参数说明: # -m / --memory:内存限制(这里是 512MB) # --memory-swap:内存+SWAP 总额(这里是 1GB,意味着 SWAP 为 512MB) -# 如果不设置 --memory-swap,则等于 --memory 值 +# 如果设置 --memory 但不设置 --memory-swap,有主机 swap 时容器总量可达内存限制的 2 倍; +# 要禁用 swap,应把 --memory-swap 设置为与 --memory 相同 # Docker Compose 配置 services: @@ -606,10 +607,15 @@ docker run -m 512m --memory-swap 1g myapp:latest 症状:应用性能突然下降,但 CPU 使用率不高 诊断: ```bash -# 查看 CPU 限流统计 -docker exec cat /sys/fs/cgroup/cpu/cpu.stat +# 查看 CPU 限流统计;现代发行版多为 cgroup v2,具体路径需先定位容器 cgroup +docker inspect --format '{{.State.Pid}}' +grep cgroup /proc//mountinfo +docker exec cat /sys/fs/cgroup/cpu.stat -# 如果 throttled_time > 0,说明发生了 CPU 限流 +# cgroup v1 主机可能仍使用: +# docker exec cat /sys/fs/cgroup/cpu/cpu.stat + +# 如果 nr_throttled / throttled_usec > 0,说明发生了 CPU 限流 # 解决方案:增加 CPU 限制 docker update --cpus 2 ``` diff --git a/21_case_devops/21.2_github_actions.md b/21_case_devops/21.2_github_actions.md index 7adcbb0..92815ab 100644 --- a/21_case_devops/21.2_github_actions.md +++ b/21_case_devops/21.2_github_actions.md @@ -82,7 +82,7 @@ jobs: ### 21.2.3 最佳实践 -* 固定 action 的主版本(例如 `@v4` / `@v6`),避免使用 `@master` 这类浮动引用。 +* 生产流水线要按完整 commit SHA 固定第三方 action;示例中使用 `@v4` / `@v6` 只是为了可读性,仍属于信任 tag 维护者的取舍,不能等同于不可变引用。 * 设置最小权限(例如 `contents: read`),需要写入权限时再打开。 * 需要依赖缓存时,优先使用官方支持的缓存方案(例如针对语言包管理器的 cache 或 BuildKit cache)。 * 敏感凭据(Registry 密码、Deploy Key 等)一律通过 `secrets` 注入,禁止硬编码。 diff --git a/21_case_devops/drone_docker-compose.yml b/21_case_devops/drone_docker-compose.yml index 358e973..3b8a100 100644 --- a/21_case_devops/drone_docker-compose.yml +++ b/21_case_devops/drone_docker-compose.yml @@ -14,7 +14,7 @@ services: environment: - DRONE_SERVER_HOST=${DRONE_SERVER_HOST:-drone.domain.com} - DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO:-https} - - DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret} + - DRONE_RPC_SECRET=${DRONE_RPC_SECRET:?set DRONE_RPC_SECRET} - DRONE_GITHUB_SERVER=https://github.com - DRONE_GITHUB_CLIENT_ID=${DRONE_GITHUB_CLIENT_ID} - DRONE_GITHUB_CLIENT_SECRET=${DRONE_GITHUB_CLIENT_SECRET} @@ -29,7 +29,7 @@ services: environment: - DRONE_RPC_PROTO=http - DRONE_RPC_HOST=drone-server - - DRONE_RPC_SECRET=${DRONE_RPC_SECRET:-secret} + - DRONE_RPC_SECRET=${DRONE_RPC_SECRET:?set DRONE_RPC_SECRET} - DRONE_RUNNER_NAME=${HOSTNAME:-demo} - DRONE_RUNNER_CAPACITY=2 dns: 114.114.114.114