Compare commits

..
66 Commits
Author SHA1 Message Date
yeasy 6080b09a83 Complete Dockerfile instruction reference list 2026-04-27 23:17:39 +00:00
yeasy 11ad9720bc Add ipvlan driver and update EKS pricing 2026-04-27 22:45:17 +00:00
yeasy cb117e017f Refresh image CLI docs 2026-04-27 09:15:19 -07:00
yeasy 2bed4cdb09 Fix mongosh, DCA price, compose healthcheck and cleanup 2026-04-27 14:17:57 +00:00
yeasy 31c2a515dd Update Docker image tags and etcd commands 2026-04-27 11:18:08 +00:00
yeasy b9901aaa1c Fix Docker Hub rate limits and etcdctl API version 2026-04-27 05:13:02 +00:00
yeasy be6f77231e Fix Docker Hub rate limits, DCT timeline, image tags, etcd and Alertmanager 2026-04-27 01:15:52 +00:00
yeasy 5929053959 Update Gateway API docs and image security practices 2026-04-26 00:18:39 +00:00
yeasy 8c438f000f Add nftables support and Time namespace documentation 2026-04-26 00:18:39 +00:00
yeasy 78f52701b0 更新 Namespace/Gateway API/nftables/DCT 退役时间线
- ch12: 添加 TIME namespace (Linux 5.6+),内核 namespace 类型从 7 更新为 8
- ch12: 补充 Docker Engine v29.x 实���性 nftables 支持
- ch13: Ingress-NGINX 退役通知,添加 Gateway API 推荐方案和示例
- ch13: 添加 Pod Security Standards 章节(替代已移除的 PSP)
- ch18: 补充 DCT 退役时间线(2028-03-31 完全移除)和迁移建议
2026-04-26 00:12:59 +00:00
yeasy b409945aea Update Prometheus to v3.11.2, fix etcdctl version 2026-04-25 22:39:33 +00:00
yeasy d667936a87 Fix network IPs, compose healthcheck, update GH Actions versions 2026-04-25 21:11:50 +00:00
yeasy 693124672f Add official doc links to install guides 2026-04-25 21:11:50 +00:00
yeasy 619883f87e Add version notes and image tag best practices 2026-04-25 21:11:50 +00:00
yeasy cff1476270 Update docker0 default subnet to 172.17.0.0/16 2026-04-25 21:03:39 +00:00
yeasy dfb5d3fec3 Document depends_on condition and healthcheck 2026-04-25 21:03:39 +00:00
yeasy c4fac49ae7 Accurate cgroup v2 description, update Actions versions 2026-04-25 20:42:35 +00:00
yeasy aa7ab1f20d Fix broken code block in laravel multistage Dockerfile 2026-04-25 20:42:18 +00:00
yeasy 7a826d56dd Add version notes and official doc links 2026-04-25 15:58:42 +00:00
Baohua Yang 016539c86a chore: lint cleanup and version corrections
- Accept benign linter changes (version notes, explicit tags, formatting)
- Fix incorrect version downgrades introduced by linter:
  - golang:1.22→1.26 (restored)
  - rust:1.82→1.95 (restored)
- 23 files updated
2026-04-25 15:58:27 +00:00
yeasy ec4ab5232b Update Grafana to v13, add version notes 2026-04-25 15:50:13 +00:00
yeasy 81b49cb00c Add blank lines before lists per CommonMark 2026-04-25 15:13:27 +00:00
yeasy 1069a8562a Update Kubernetes to v1.36, build-push-action to v7 2026-04-25 15:10:51 +00:00
yeasy d2ae7f3a78 Update versions and fix formatting issues 2026-04-25 15:10:43 +00:00
yeasy 1752249b38 Add Docker Scout, remove deprecated type_name 2026-04-25 15:02:24 +00:00
yeasy f23900a526 Update etcd to v3.5.29 2026-04-25 15:00:47 +00:00
yeasy 83744eec32 Update node-exporter to v1.11.1, fcct to butane 2026-04-25 14:58:40 +00:00
yeasy db2f015ba7 Add blank lines before lists per CommonMark 2026-04-25 14:57:09 +00:00
yeasy 28864a3349 Update containerd config path for 2.x 2026-04-25 14:22:55 +00:00
yeasy ef78056e41 Update content and fix issues 2026-04-25 02:14:58 +00:00
yeasy b2218f7728 Clarify image build semantics 2026-04-24 10:51:49 -07:00
yeasy 2e7f7d7227 Fix straight quotes to curly quotes in mirror doc 2026-04-24 13:24:52 +00:00
yeasy 7781e53725 Fix Ubuntu codenames and containerd LTS description 2026-04-24 03:16:05 +00:00
yeasy d9f49e55fe Fix apt cache cleanup path in Dockerfile example 2026-04-23 13:16:21 -07:00
yeasy ae7aaaab1b Pin Prometheus and Grafana image versions 2026-04-22 12:24:31 -07:00
yeasy 4b4fe377dc Add runC CVEs and AuthZ plugin guidance 2026-04-22 12:24:31 -07:00
yeasy 985a9fa8b3 Add section numbers to ecosystem headings 2026-04-22 12:24:30 -07:00
yeasy adbb6f4406 Update nginx version and K8s dashboard date 2026-04-22 12:24:30 -07:00
yeasy 0ba22eb779 Fix Debian dates and FAQ template syntax 2026-04-22 08:43:48 -07:00
yeasy e42b004bdd Refresh install guidance
# Conflicts:
#	03_install/3.1_ubuntu.md
#	03_install/3.2_debian.md
#	03_install/3.3_fedora.md
#	03_install/3.9_mirror.md
2026-04-22 08:24:38 -07:00
yeasy 9a06a18f92 Refresh k8s docker versions and references 2026-04-21 20:57:33 -07:00
yeasy 318de33fd4 Refine Docker concepts 2026-04-21 14:39:41 -07:00
yeasy 56645ca150 Add new content and update versions 2026-04-19 22:35:33 -07:00
yeasy 0435cfb90f Drop legacy plugins 2026-04-19 20:14:36 -07:00
yeasy 292ce02df2 Clarify intro chapter 2026-04-18 20:25:29 -07:00
yeasy c6e1485798 Update software versions and fix security refs 2026-04-18 19:04:14 -07:00
yeasy c6f91f987c Fix mermaid syntax and update K8s taint labels 2026-04-18 15:17:56 -07:00
yeasy 139057640e Update Kind v0.31.0 and Flannel v0.28.2 2026-04-18 13:31:43 -07:00
yeasy fc2212044c Restructure README with badges and cover 2026-04-17 21:51:38 -07:00
yeasy 808afe5b4d Add Ubuntu 20.04 EOL exact date 2026-04-17 21:19:32 -07:00
yeasy 618a808989 Update versions and fix stale data 2026-04-17 21:17:12 -07:00
github-actions[bot]andGitHub 0befead941 Merge pull request #564 from yeasy/dependabot/github_actions/dependencies-8fe05ed821
chore(deps): bump the dependencies group with 2 updates
2026-04-15 18:46:57 +00:00
dependabot[bot]andGitHub 8999830f87 chore(deps): bump the dependencies group with 2 updates
Bumps the dependencies group with 2 updates: [softprops/action-gh-release](https://github.com/softprops/action-gh-release) and [dependabot/fetch-metadata](https://github.com/dependabot/fetch-metadata).


Updates `softprops/action-gh-release` from 2 to 3
- [Release notes](https://github.com/softprops/action-gh-release/releases)
- [Changelog](https://github.com/softprops/action-gh-release/blob/master/CHANGELOG.md)
- [Commits](https://github.com/softprops/action-gh-release/compare/v2...v3)

Updates `dependabot/fetch-metadata` from 2 to 3
- [Release notes](https://github.com/dependabot/fetch-metadata/releases)
- [Commits](https://github.com/dependabot/fetch-metadata/compare/v2...v3)

---
updated-dependencies:
- dependency-name: softprops/action-gh-release
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: dependencies
- dependency-name: dependabot/fetch-metadata
  dependency-version: '3'
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: dependencies
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-04-15 18:46:44 +00:00
yeasy cb2287376b Fix Chinese curly quotes in prose text 2026-04-14 20:29:35 -07:00
yeasy f788740f47 Fix figure caption punctuation and table formatting 2026-04-13 18:37:00 -07:00
yeasy 8a1801f89e Fix figure caption format 2026-04-09 09:02:44 -07:00
yeasy 69dd935053 Add section numbering and archive notice 2026-04-08 22:40:15 -07:00
yeasy d1399c2fa5 Fix bash comment style to single hash 2026-04-08 22:39:51 -07:00
yeasy a699ab2e44 Fix mdpress port 4000 to 9000 2026-04-05 13:39:46 -07:00
yeasy 0cbd7cf712 Fix typo in offline install image alt text 2026-04-05 12:59:09 -07:00
yeasy 9c65552931 Remove time annotation in install docs 2026-04-05 12:58:42 -07:00
yeasy 5add3d1918 Remove duplicate release-pdf workflow 2026-04-05 08:55:52 -07:00
yeasy de330b0c8a Add release-pdf CI workflow for automated PDF builds 2026-04-05 08:29:11 -07:00
yeasy 41819cb474 Replace defunct AtomHub mirror with docker.1ms.run 2026-04-05 08:16:08 -07:00
yeasy a5c1d25127 ci: add auto-release.yml, remove release-pdf.yml, limit CI trigger to master 2026-04-05 07:57:56 -07:00
Baohua Yang a9caffe7d8 Add recommended reading paths table to README 2026-04-04 22:31:23 -07:00
53 changed files with 109 additions and 116 deletions
+1 -1
View File
@@ -172,7 +172,7 @@ registry.example.com/myproject/myapp:v1.2.3
## 简写(使用 Docker Hub
nginx:1.30
nginx:1.25
ubuntu:24.04
## 省略标签(默认使用 latest)
+6 -6
View File
@@ -1,6 +1,6 @@
## 2.3 仓库
> **版本说明**本节示例基于 Docker v29.x 和常见镜像版本编写示例中的版本号 `nginx:1.30``mysql:8.4``mysql:5.7` 为演示用途实际使用时请访问 [Docker Hub 官方页面](https://hub.docker.com) 或相应镜像的发布页确认最新可用版本和标签。
> **版本说明**本节示例基于 Docker v29.x 和常见镜像版本编写示例中的版本号 `nginx:1.25``mysql:8.0``mysql:5.7` 为演示用途实际使用时请访问 [Docker Hub 官方页面](https://hub.docker.com) 或相应镜像的发布页确认最新可用版本和标签。
Docker Registry 是镜像分发和管理的核心组件本节将介绍 Registry 的基本概念公共和私有服务的选择以及镜像的安全管理
@@ -73,7 +73,7 @@ registry.example.com/mycompany/myapp:v1.2.3
## Docker Hub 官方镜像(省略 registry 和用户名)
nginx:1.30
nginx:1.25
ubuntu:24.04
## Docker Hub 用户镜像
@@ -217,7 +217,7 @@ $ docker login registry.example.com # 登录其他 Registry
## 拉取镜像
$ docker pull nginx:1.30
$ docker pull nginx:1.25
## 标记镜像(准备推送)
@@ -261,9 +261,9 @@ someuser/myapp # ⚠️ 需要评估
```bash
## 准备一个你有写权限的镜像地址
$ export IMAGE=<你的仓库名>/nginx:1.30
$ docker pull nginx:1.30
$ docker tag nginx:1.30 $IMAGE
$ export IMAGE=<你的仓库名>/nginx:1.27
$ docker pull nginx:1.27
$ docker tag nginx:1.27 $IMAGE
$ docker push $IMAGE
## 生成签名密钥(会生成 cosign.key / cosign.pub
+1 -1
View File
@@ -4,7 +4,7 @@
> **版本号最佳实践**
>
> - **永远指定版本号**避免使用 `latest` 标签应指定具体的版本 `ubuntu:24.04``nginx:1.30`以确保镜像内容稳定一致
> - **永远指定版本号**避免使用 `latest` 标签应指定具体的版本 `ubuntu:24.04``nginx:1.27`以确保镜像内容稳定一致
> - **在生产环境使用摘要**优先使用镜像摘要SHA256而非标签 `nginx@sha256:abc123...`因为摘要不可变
> - **定期评估依赖**即使指定了版本号仍应定期检查依赖的基础镜像是否有安全更新
+3 -3
View File
@@ -10,7 +10,7 @@
现在让我们以定制一个 Web 服务器为例子来讲解镜像是如何构建的
> **版本提示**以下示例中 `nginx` 镜像使用默认 `latest` 标签生产环境建议指定具体版本号 `nginx:1.30`以避免镜像更新带来的不兼容性
> **版本提示**以下示例中 `nginx` 镜像使用默认 `latest` 标签生产环境建议指定具体版本号 `nginx:1.27`以避免镜像更新带来的不兼容性
```bash
$ docker run --name webserver -d -p 8080:80 nginx
@@ -89,11 +89,11 @@ sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 07e334659748 9 seconds ago 181.5 MB
nginx 1.30 05a60462f8ba 12 days ago 181.5 MB
nginx 1.27 05a60462f8ba 12 days ago 181.5 MB
nginx latest e43d811ce2f4 4 weeks ago 181.5 MB
```
> **版本说明**上面示例中 `nginx:1.30` 代表 1.30 系列的最新 patch 版本际应用中应根据需求选择确切的版本号而不是盲目使用 `latest`
> **版本说明**上面示例中 `nginx:1.27` 代表 1.27 系列的最新 patch 版本际应用中应根据需求选择确切的版本号而不是盲目使用 `latest`
我们还可以用 `docker history` 具体查看镜像内的历史记录例如先执行 `docker history nginx:v2`再对比 `docker history nginx:latest`就能看到我们刚刚提交出来的新层
+1 -1
View File
@@ -26,7 +26,7 @@ $ touch Dockerfile
```
其内容为
> **版本提示**下面示例中 `FROM nginx` 使用的是 `latest` 标签在实际应用中应使用明确的版本号 `FROM nginx:1.30`以确保 Dockerfile 的可重现性和稳定性
> **版本提示**下面示例中 `FROM nginx` 使用的是 `latest` 标签在实际应用中应使用明确的版本号 `FROM nginx:1.27`以确保 Dockerfile 的可重现性和稳定性
```docker
FROM nginx
+1 -1
View File
@@ -60,7 +60,7 @@ Docker 镜像的每一层都有一个唯一的 ID,这个 ID 是根据该层的
Docker 使用联合文件系统 (Union FS) 与写时复制思路来实现这种分层挂载传统的实现方式常见于 `overlay2``aufs``btrfs``zfs` 等存储驱动而在 Docker Engine 29.0 及之后的全新安装中默认镜像后端已经变为 containerd image store它使用 snapshotter 来管理这些层
> **版本背景**Docker Engine 29.0发布于 2026 1 是一个重要版本分界点在全新安装场景下默认启用 containerd image store 作为镜像存储后端这对镜像管理OCI 合规性和供应链安全都有深远影响如果你的 Docker 版本低于 29.0镜像存储仍使用传统的 classic store 路径
> **版本背景**Docker Engine 29.0发布于 2024 2 是一个重要版本分界点引入了 containerd image store 作为默认镜像存储后端这对镜像管理OCI 合规性和供应链安全都有深远影响如果你的 Docker 版本低于 29.0镜像存储仍使用传统的 classic store 路径
虽然底层实现细节不同但它们都遵循上述的 **分层 + CoW** 模型因此无论你看到的是 `overlay2` 还是 containerd snapshotter理解镜像层容器层和写时复制的方式都是一样重要的
+2 -2
View File
@@ -126,14 +126,14 @@ $ docker run -d -p 80:80 nginx:latest
## 数据库
$ docker run -d -p 3306:3306 mysql:8.4
$ docker run -d -p 3306:3306 mysql:8.0
## 缓存服务
$ docker run -d -p 6379:6379 redis:latest
```
> **版本说明**示例使用常见的标签如 `latest` 或稳定大版本号如 `mysql:8.4`具体版本可根据需求调整生产环境建议明确指定版本号 `mysql:8.4.4`而非使用 `latest`
> **版本说明**示例使用常见的标签如 `latest` 或稳定大版本号如 `mysql:8.0`具体版本可根据需求调整生产环境建议明确指定版本号 `mysql:8.0.35`而非使用 `latest`
#### 2. 调试时先用前台模式
+1 -1
View File
@@ -212,7 +212,7 @@ FROM node:22-alpine
CMD ["node", "server.js"]
```
> **版本说明**示例使用 `node:22-alpine`这是一个精简的 Node.js 22 版本镜像可根据需求替换为其他版本 `node:24-alpine``node:latest`
> **版本说明**示例使用 `node:22-alpine`这是一个精简的 Node.js 22 版本镜像可根据需求替换为其他版本 `node:20-alpine``node:latest`
#### Q容器无法停止
+3 -3
View File
@@ -10,11 +10,11 @@
本章示例涉及多个 Docker 镜像遵循以下版本号最佳实践
- **官方镜像** `ubuntu``nginx``mysql`使用具体大版本号 `ubuntu:24.04``mysql:8.4`而非 `latest`确保示例的可重复性
- **官方镜像** `ubuntu``nginx``mysql`使用具体大版本号 `ubuntu:24.04``mysql:8.0`而非 `latest`确保示例的可重复性
- **镜像标签约定**
- `latest` `v1.0.0` 带标签的自定义镜像示例中指定具体版本
- `24.04``8.4`官方镜像的稳定版本分支
- 生产环境建议指定确版本号 `nginx:1.30.0``mysql:8.4.4`而非仅大版本号
- `24.04``8.0`官方镜像的稳定版本分支
- 生产环境建议指定确版本号 `nginx:1.24.0``mysql:8.0.35`而非仅大版本号
* [启动容器](5.1_run.md)
* [守护态运行](5.2_daemon.md)
+4 -4
View File
@@ -82,9 +82,9 @@ RUN pwd # 输出 /app
```docker
## 构建阶段
## 建议使用 node:22 node: 等具体版本标签避免使用 latest
## 建议使用 node:20 node: 等具体版本标签避免使用 latest
FROM node:22 AS builder
FROM node:20 AS builder
WORKDIR /build
COPY package*.json ./
RUN npm install
@@ -105,8 +105,8 @@ COPY --from=builder /build/dist .
#### 1. 尽早设置 WORKDIR
```docker
# 建议使用 node:22 等主/次版本号标签
FROM node:22
# 建议使用 node:20 等主/次版本号标签
FROM node:20
WORKDIR /app # 尽早设置
COPY package*.json ./
+4 -4
View File
@@ -35,7 +35,7 @@ flowchart LR
#### 创建并切换用户
```docker
FROM node:22-alpine
FROM node:20-alpine
## 1. 创建用户和组
@@ -173,7 +173,7 @@ $ docker run -u root myimage
切换用户后确保应用有权访问文件
```docker
FROM node:22-alpine
FROM node:20-alpine
## 创建用户
@@ -229,14 +229,14 @@ USER 1000:1000
```docker
## 构建阶段可以用 root
FROM node:22 AS builder
FROM node:20 AS builder
WORKDIR /app
COPY . .
RUN npm install && npm run build
## 生产阶段用非 root
FROM node:22-alpine
FROM node:20-alpine
RUN adduser -D appuser
WORKDIR /app
COPY --from=builder --chown=appuser:appuser /app/dist .
+1 -1
View File
@@ -34,7 +34,7 @@ Starting ──成功──> Healthy ──失败N次──> Unhealthy
#### Web 服务检查
```docker
# nginx 镜像推荐使用具体的版本标签 nginx:1.30-alpine
# nginx 镜像推荐使用具体的版本标签 nginx:1.25-alpine
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
+2 -2
View File
@@ -30,7 +30,7 @@ ONBUILD <其它指令>
**基础镜像 (my-node-base)**
```docker
FROM node:22-alpine
FROM node:20-alpine
WORKDIR /app
## 这些指令将在子镜像构建时执行
@@ -126,7 +126,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
建议在镜像标签中添加 `-onbuild` 后缀明确告知使用者该镜像包含触发器
```bash
node:22-onbuild
node:20-onbuild
python:3.12-onbuild
```
+1 -1
View File
@@ -176,5 +176,5 @@ $ docker build --target builder -t username/imagename:tag .
上面例子中我们使用 `COPY --from=0 /go/src/github.com/go/helloworld/app .` 从上一阶段的镜像中复制文件我们也可以复制任意镜像中的文件
```docker
COPY --from=nginx:1.30-alpine /etc/nginx/nginx.conf /nginx.conf
COPY --from=nginx:1.25-alpine /etc/nginx/nginx.conf /nginx.conf
```
@@ -60,8 +60,8 @@ server {
第一阶段进行前端构建
```docker
# node 镜像推荐使用具体的版本标签 node:22-alpine
FROM node:22-alpine as frontend
# node 镜像推荐使用具体的版本标签 node:20-alpine
FROM node:20-alpine as frontend
COPY package.json /app/
@@ -128,8 +128,8 @@ RUN set -x ; cd ${LARAVEL_PATH} \
### 7.18.5 最后一个阶段构建 NGINX 镜像
```docker
# nginx 镜像推荐使用具体的版本标签 nginx:1.30-alpine
FROM nginx:1.30-alpine as nginx
# nginx 镜像推荐使用具体的版本标签 nginx:1.25-alpine
FROM nginx:1.25-alpine as nginx
ARG LARAVEL_PATH=/app/laravel
@@ -179,8 +179,8 @@ $ docker run -dit --rm --network=laravel -p 8080:80 my/nginx
完整的 `Dockerfile` 文件如下
```docker
# 生产环境推荐使用具体的版本标签 node:22-alpinecomposer:2.xphp:8.3-fpm-alpinenginx:1.30-alpine
FROM node:22-alpine as frontend
# 生产环境推荐使用具体的版本标签 node:20-alpinecomposer:2.xphp:8.3-fpm-alpinenginx:1.25-alpine
FROM node:20-alpine as frontend
COPY package.json /app/
@@ -229,7 +229,7 @@ RUN set -x ; cd ${LARAVEL_PATH} \
&& chmod -R 777 storage \
&& php artisan package:discover
FROM nginx:1.30-alpine as nginx
FROM nginx:1.25-alpine as nginx
ARG LARAVEL_PATH=/app/laravel
+1 -1
View File
@@ -178,7 +178,7 @@ ADD app.tar.gz /app/
```docker
## 构建阶段
FROM node:22 AS builder
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
+2 -2
View File
@@ -6,8 +6,8 @@
这是 Dockerfile 使用中最常见的困惑之一简单的答案是
- **CMD**定义容器的默认命令如果用户在 `docker run` 时提供命令CMD 会被覆盖
- **ENTRYPOINT**定义容器的入口脚本通常用于启动应用的某个特定部分
- **CMD**定义容器的默认命令如果用户在 `docker run` 时提供命令CMD 会被覆盖
- **ENTRYPOINT**定义容器的入口脚本通常用于启动应用的某个特定部分
**决策树**
+3 -3
View File
@@ -158,15 +158,15 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
```docker
## 版本集中管理
ENV NGINX_VERSION=1.30 \
NODE_VERSION=22 \
ENV NGINX_VERSION=1.25 \
NODE_VERSION=20 \
PYTHON_VERSION=3.12
RUN apt-get install nginx=${NGINX_VERSION}
## 版本分散在各处
RUN apt-get install nginx=1.30
RUN apt-get install nginx=1.25
```
#### 2. 不要存储敏感信息
+4 -4
View File
@@ -93,14 +93,14 @@ RUN echo "Node version: $NODE_VERSION"
```docker
ARG BASE_VERSION=alpine
FROM node:22-${BASE_VERSION} AS builder
FROM node:20-${BASE_VERSION} AS builder
## 需要重新声明
ARG NODE_VERSION=20
RUN echo "Building with Node $NODE_VERSION"
FROM node:22-${BASE_VERSION}
FROM node:20-${BASE_VERSION}
## 每个阶段都需要重新声明
@@ -125,8 +125,8 @@ $ docker build --build-arg ALPINE_VERSION=3.19 .
#### 2. 设置软件版本
```docker
# 使用次版本号 (1.30) 而非完整版本号 (1.30.0)以便自动更新到最新补丁版本
ARG NGINX_VERSION=1.30
# 使用次版本号 (1.25) 而非完整版本号 (1.25.0)以便自动更新到最新补丁版本
ARG NGINX_VERSION=1.25
RUN curl -fsSL https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz | tar -xz
```
+7 -7
View File
@@ -44,7 +44,7 @@ flowchart LR
#### 定义单个卷
```docker
FROM mysql:8.4
FROM mysql:8.0
VOLUME /var/lib/mysql
```
@@ -63,7 +63,7 @@ VOLUME ["/data", "/logs", "/config"]
如果运行时未指定挂载Docker 会自动创建匿名卷
```bash
$ docker run mysql:8.4
$ docker run mysql:8.0
$ docker volume ls
DRIVER VOLUME NAME
local a1b2c3d4e5f6... # 自动创建的匿名卷
@@ -74,7 +74,7 @@ local a1b2c3d4e5f6... # 自动创建的匿名卷
```bash
## 使用命名卷替代匿名卷
$ docker run -v mysql_data:/var/lib/mysql mysql:8.4
$ docker run -v mysql_data:/var/lib/mysql mysql:8.0
```
#### 3. 可被 Bind Mount 覆盖
@@ -82,7 +82,7 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.4
```bash
## 使用宿主机目录替代
$ docker run -v /my/data:/var/lib/mysql mysql:8.4
$ docker run -v /my/data:/var/lib/mysql mysql:8.0
```
---
@@ -145,7 +145,7 @@ VOLUME /app/uploads
```bash
## 查看镜像定义的 VOLUME
$ docker inspect mysql:8.4 --format '{{json .Config.Volumes}}' | jq
$ docker inspect mysql:8.0 --format '{{json .Config.Volumes}}' | jq
{
"/var/lib/mysql": {}
}
@@ -196,7 +196,7 @@ volumes:
```bash
## 使用 --rm 运行的容器匿名卷会在容器删除时一起删除
$ docker run --rm mysql:8.4
$ docker run --rm mysql:8.0
## 容器停止后数据丢失
@@ -205,7 +205,7 @@ $ docker run --rm mysql:8.4
**解决**始终使用命名卷
```bash
$ docker run -v mysql_data:/var/lib/mysql mysql:8.4
$ docker run -v mysql_data:/var/lib/mysql mysql:8.0
```
---
+1 -1
View File
@@ -80,7 +80,7 @@ docker build -t my-image:1.0 .
本章中的 Dockerfile 示例使用的基础镜像标签遵循以下原则
- **通用标签** `ubuntu:24.04``alpine``nginx`保持原样无需修改
- **基础镜像版本号** `node:22``python:3.12`使用主或次版本号而非完整版本号patch这样可以自动获取最新的补丁版本确保获得安全更新
- **基础镜像版本号** `node:20``python:3.12`使用主或次版本号而非完整版本号patch这样可以自动获取最新的补丁版本确保获得安全更新
- **避免**不建议使用 `latest` 标签和完整的 patch 版本号 `20.10.0`作为基础镜像因为这会导致构建的不可重现性或安全风险
读者在使用这些示例时应根据实际生产环境需求选择合适的版本号
@@ -1,4 +1,4 @@
FROM node:22-alpine as frontend
FROM node:20-alpine as frontend
COPY package.json /app/
@@ -47,7 +47,7 @@ RUN set -x ; cd ${LARAVEL_PATH} \
&& chmod -R 777 storage \
&& php artisan package:discover
FROM nginx:1.30-alpine as nginx
FROM nginx:1.25-alpine as nginx
ARG LARAVEL_PATH=/app/laravel
-1
View File
@@ -21,7 +21,6 @@ ghi789... none null local
| **none** | 禁用网络 | 完全隔离的容器 |
| **overlay** | 跨主机网络 | Docker Swarm 集群 |
| **macvlan** | 容器拥有独立 MAC 地址 | 需要直接接入物理网络 |
| **ipvlan** | 容器共享父接口 MAC独享 IP | 同网段大量容器 MAC 数量受限的网络 |
### 9.2.2 Bridge 网络默认
+1 -1
View File
@@ -39,7 +39,7 @@ $ docker buildx build --sbom=true -t myimage .
> ** 注意与失败模式**
> 要使 SBOM (或其它 attestation 元数据) 成功附着并可见对底层的存储格式有前置要求默认的 classic image store 不支持 manifest list/index 这种存放 attestation 的结构
>
> 如果只简单运行上述命令你可能会面临 **命令成功执行但本地镜像中看不到 SBOM** 的体会落差
> 如果只简单运行上述命令你可能会面临 **命令成功执行但本地镜像中看不到 SBOM** 的体会落差
>
> **正确的解决路径有两条**
> 1. **推送到远端仓库**使用 `docker buildx build --sbom=true --push -t myimage:tag` SBOM 会正确保存到远端仓库远端 OCI 兼容的镜像仓库能够完整存储这些元数据
+1 -1
View File
@@ -2,7 +2,7 @@
Docker Buildx 是一个 docker CLI 插件其扩展了 docker 命令支持 [Moby BuildKit](10.1_buildkit.md) 提供的功能提供了与 docker build 相同的用户体验并增加了许多新功能
> Buildx 需要 Docker v23.0+该版本起 BuildKit 成为默认构建引擎推荐使用 Docker v28 及以上版本以获得最完整的 Buildx 功能支持
> Buildx 需要 Docker v19.03+ Docker 19.03 及以上版本在较新版本中已更常用且功能更完整
## 本章内容
+1 -1
View File
@@ -490,7 +490,7 @@ volumes:
```yaml
services:
my_src:
image: mysql:8.4
image: mysql:8.0
volumes:
- mysql_data:/var/lib/mysql
+3 -3
View File
@@ -28,13 +28,13 @@ services:
# 数据库服务
db:
image: mysql:8.4
image: mysql:8.0
container_name: wordpress_db
restart: always
command:
# 用原生密码认证MySQL 8.4 默认禁用旧版 WP 兼容性需要
# 使用原生密码认证旧版 WP 兼容性
- --mysql-native-password=ON
- --default-authentication-plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
environment:
+2 -2
View File
@@ -2,9 +2,9 @@
services:
db:
image: mysql:8.4
image: mysql:8.0
command:
- --mysql-native-password=ON
- --default_authentication_plugin=mysql_native_password
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
+1 -1
View File
@@ -41,7 +41,7 @@ flowchart TD
每个 Dockerfile 指令创建一层只有变化的层需要重建
```docker
FROM node:22 # 层1基础镜像
FROM node:20 # 层1基础镜像
COPY package.json ./ # 层2依赖定义
RUN npm install # 层3安装依赖
COPY . . # 层4应用代码
+2 -2
View File
@@ -35,7 +35,7 @@
##### 节点状态
节点的状态通过一组条件Conditions来描述主要条件包括 `Ready`kubelet 健康且可以接收 Pod`MemoryPressure`内存不足`DiskPressure`磁盘不足 `PIDPressure`进程数过多其中 `Ready` 条件最为关键值为 `True` 表示节点健康可调度`False` 表示节点异常`Unknown` 表示节点控制器超过一定时间未收到心跳
节点的状态主要是用来描述处于 `Running` 的节点当前可用的有 `NodeReachable` `NodeReady`以后可能会增加其他状态`NodeReachable` 表示集群可达`NodeReady` 表示 kubelet 返回 Status Ok 并且 HTTP 状态检查健康
#### 节点管理
@@ -200,7 +200,7 @@ spec:
spec:
containers:
- name: mysql
image: mysql:8.4
image: mysql:8.0
volumeMounts:
- name: data
mountPath: /var/lib/mysql
+2 -4
View File
@@ -138,14 +138,12 @@ $ sysctl --system
为了让 kubelet 正确运行我们需要对其进行一些必要的配置
#### 修改 `kubelet.service`可选IPVS 模式
> **注意**kube-proxy IPVS 模式已在 Kubernetes 1.35 中被标记为弃用并计划在后续版本中移除新部署建议使用默认的 iptables 模式或 nftables 模式Kubernetes 1.31+ 可用以下 IPVS 配置仅供需要兼容旧环境的场景参考
#### 修改 `kubelet.service`
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
```bash
# 启用 ipvs 相关内核模块已弃用建议迁移至 nftables
# 启用 ipvs 相关内核模块
[Service]
ExecStartPre=-/sbin/modprobe ip_vs
+2 -4
View File
@@ -169,14 +169,12 @@ $ sysctl --system
为了让 kubelet 正确运行我们需要对其进行一些必要的配置
#### 修改 `kubelet.service`可选IPVS 模式
> **注意**kube-proxy IPVS 模式已在 Kubernetes 1.35 中被标记为弃用并计划在后续版本中移除新部署建议使用默认的 iptables 模式或 nftables 模式Kubernetes 1.31+ 可用以下 IPVS 配置仅供需要兼容旧环境的场景参考
#### 修改 `kubelet.service`
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
```bash
# 启用 ipvs 相关内核模块已弃用建议迁移至 nftables
# 启用 ipvs 相关内核模块
[Service]
ExecStartPre=-/sbin/modprobe ip_vs
+2 -2
View File
@@ -193,10 +193,10 @@ $ kubectl label pods -l app=nginx version=v1
```bash
# 添加注解
$ kubectl annotate pod my-pod description="Production pod"
$ kubectl annotate pod my-pod description=Production pod
# 修改注解
$ kubectl annotate pod my-pod description="Staging pod" --overwrite
$ kubectl annotate pod my-pod description=Staging pod --overwrite
# 删除注解
$ kubectl annotate pod my-pod description-
+1 -1
View File
@@ -1,6 +1,6 @@
## 15.1 简介
> **版本说明** 本章内容基于 etcd 3.5 系列版本编写官方维护最新两个次版本当前为 3.5 3.6请访问 [etcd 官方发布页](https://github.com/etcd-io/etcd/releases) 获取最新版本信息。
> **版本说明** 本章内容基于 etcd 3.5 系列版本编写当前最新 v3.5.x请访问 [etcd 官方发布页](https://github.com/etcd-io/etcd/releases) 获取最新版本信息。
如图 15-1 所示etcd 项目使用该标识
+1 -1
View File
@@ -4,7 +4,7 @@
`etcd` 基于 `Go` 语言实现因此用户可以从[项目主页](https://github.com/etcd-io/etcd)下载源代码自行编译,也可以下载编译好的二进制文件,甚至直接使用制作好的 `Docker` 镜像文件来体验。
> 注意etcd 官方仅维护最新两个次版本当前为 3.5 3.6etcd 3.4 已于 2026 5 月结束支持EOL仍在使用 3.4 的用户应尽快升级本章示例基于 etcd `3.5.x` 版本编写etcd 3.6.x 可用于新部署请访问 [etcd 官方发布页](https://github.com/etcd-io/etcd/releases) 获取最新版本。
> 注意etcd 官方仅维护最新两个次版本当前为 3.5 3.6本章示例基于 etcd `3.5.x` 版本编写etcd 3.6.x 可用于新部署请访问 [etcd 官方发布页](https://github.com/etcd-io/etcd/releases) 获取最新版本。
### 15.2.1 二进制文件方式下载
+2 -4
View File
@@ -111,11 +111,9 @@ hello
```
支持的选项为
`--sort-by` 指定排序字段CREATE / KEY / MODIFY / VALUE / VERSION
`--sort` 对结果进行排序
`--order` 指定排序顺序ASCEND / DESCEND
`--consistency` 指定一致性级别`l` 线性一致`s` 串行
`--consistent` 将请求发给主节点保证获取内容的一致性
#### del
+3 -3
View File
@@ -2,7 +2,7 @@ version: "3.6"
services:
node1:
image: quay.io/coreos/etcd:v3.5.29
image: quay.io/coreos/etcd:v3.5.17
volumes:
- node1-data:/etcd-data
expose:
@@ -34,7 +34,7 @@ services:
- docker-etcd
node2:
image: quay.io/coreos/etcd:v3.5.29
image: quay.io/coreos/etcd:v3.5.17
volumes:
- node2-data:/etcd-data
networks:
@@ -66,7 +66,7 @@ services:
- docker-etcd
node3:
image: quay.io/coreos/etcd:v3.5.29
image: quay.io/coreos/etcd:v3.5.17
volumes:
- node3-data:/etcd-data
networks:
+1 -1
View File
@@ -8,7 +8,7 @@
Skopeo 是一个由 Red Hat 赞助开源的命令行工具它可以在不需要运行容器守护进程 Docker Daemon的前提下对容器镜像进行极其高效的操作和管理包括检查复制删除和签名等操作
Skopeo 最大的特点是其可以在不将镜像拉取到本地的情况下直接在远端 Registry镜像仓库之间完成检查和搬运从而大幅度节省带宽和磁盘空间这也是它在容器运维和分发领域非常受欢迎的原因
Skopeo 最大的特点是其可以在不将镜像拉取到本地的情况下直接在远端 Registry镜像仓库之间完成检查和搬运从而大幅度节省带宽和磁盘空间这也是它在容器运维和分发领域非常受欢迎的原因
### 17.5.2 核心特性
+1 -1
View File
@@ -40,7 +40,7 @@
Kubernetes 作为一个容器编排系统为了屏蔽底层不同容器运行时的实现差异引入了 CRIContainer Runtime Interface标准
- 早期版本中Kubernetes 默认使用 docker 作为运行时通过一个名为 `dockershim` 的桥接组件对接 DockerDocker 再对接 containerd
- 随着 containerd 原生支持了 CRI 插件Kubernetes 开始直接与 containerd 通信去掉了 `dockershim` `dockerd` 的中间层这就是为什么从 Kubernetes 1.24+ 开始弃用 Docker引发了广泛关注实际上 Kubernetes 只是弃用 `dockershim`底层依然在使用从 Docker 基因中诞生的 containerd参见 [Kubernetes 官方文档](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd)。
- 随着 containerd 原生支持了 CRI 插件Kubernetes 开始直接与 containerd 通信去掉了 `dockershim` `dockerd` 的中间层这就是为什么从 Kubernetes 1.24+ 开始弃用 Docker引发了广泛关注实际上 Kubernetes 只是弃用 `dockershim`底层依然在使用从 Docker 基因中诞生的 containerd参见 [Kubernetes 官方文档](https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd)。
- containerd 2.0+ 移除了已弃用的 CRI v1alpha2 接口仅保留 CRI v1Kubernetes 1.26+ 仅支持 CRI v1如果集群中仍有依赖 CRI v1alpha2 的组件升级 containerd 2.x 前需先完成迁移containerd 2.3+ 2.x 系列首个 LTS 版本支持从 1.7 LTS 直接升级生产环境推荐使用详见 [containerd 发布说明](https://github.com/containerd/containerd/releases)。
### 17.6.3 为什么直接使用 containerd
+1 -1
View File
@@ -10,7 +10,7 @@
尽管这种方式在性能和启动速度上拥有巨大优势但也带来了一个显著的缺点**隔离性Isolation不足**如果某个容器内的恶意进程利用了宿主机内核的漏洞完成了越狱Privilege Escalation它将对整个宿主机以及其上运行的所有其他容器造成毁灭性威胁
如果在公有云环境多租户场景或运行不可信的第三方代码时共享内核显然是不够安全的为了解决这一问题社区推出了安全容器Secure Containers/Sandboxed Containers的概念安全容器的核心理念是提供类似虚拟机的强隔离性同时保持类似容器的轻量快速启动和标准化管理
如果在公有云环境多租户场景或运行不可信的第三方代码时共享内核显然是不够安全的为了解决这一问题社区推出了安全容器Secure Containers/Sandboxed Containers的概念安全容器的核心理念是提供类似虚拟机的强隔离性同时保持类似容器的轻量快速启动和标准化管理
### 17.7.2 什么是 Kata Containers
+1 -1
View File
@@ -14,7 +14,7 @@ Docker 守护进程在启动容器时,会在后台为容器创建一套独立
尽管命名空间提供了很好的隔离性但我们必须认识到**所有的容器依然共享同一个宿主机的 Linux 内核**
这意味着一旦宿主机的内核存在提权漏洞如著名的 Dirty COW 漏洞攻击者有可能通过突破 Namespace 的限制直接在内核层面执行恶意代码从而实现容器逃逸
这意味着一旦宿主机的内核存在提权漏洞如著名的 Dirty COW 漏洞攻击者有可能通过突破 Namespace 的限制直接在内核层面执行恶意代码从而实现容器逃逸
> [!WARNING]
> 为了缓解内核漏洞带来的威胁生产环境务必保持宿主机 Linux 内核的及时修补与更新或者借助诸如 gVisorKata Containers 等提供了独立内核的安全容器技术同时需要及时修补容器运行时 runC的漏洞2025 11 月披露的一系列 runC 容器逃逸漏洞CVE-2025-31133CVE-2025-52565CVE-2025-52881就表明即使内核保持更新运行时层的缺陷仍然可能导致容器隔离被突破
+1 -1
View File
@@ -8,7 +8,7 @@
一个普通的 Linux 内核提供了 300 多个系统调用而一个正常运行的容器化应用例如 Nginx 服务通常只会用到几十个调用这就给攻击者留下了大量的闲置入口点来进行内核层的缓冲区溢出攻击
Docker 默认启用了 Seccomp 并利用预置的 [默认配置文件](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) 将可以利用的系统调用缩减到了不足一半(默认禁用了 44 个危险的统调用,比如修改时区或重启系统)。
Docker 默认启用了 Seccomp 并利用预置的 [默认配置文件](https://github.com/moby/moby/blob/master/profiles/seccomp/default.json) 将可以利用的系统调用缩减到了不足一半(默认禁用了 44 个危险的统调用,比如修改时区或重启系统)。
如果你对应用的系统调用特征了如指掌你可以为容器定制专属规则
+2 -2
View File
@@ -434,8 +434,8 @@ jobs:
tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
- name: Run Trivy vulnerability scan
# 安全提醒2026 3 19 Trivy GitHub Actions 遭受供应链攻击
# 76 个版本标签被劫持务必使用不可变的 commit SHA 引用而非可变标签
# 安全提醒2026 3 Trivy GitHub Actions 遭受供应链攻击
# 75 个版本标签被劫持务必使用不可变的 commit SHA 引用而非可变标签
# 使用前请到 https://github.com/aquasecurity/trivy-action/releases 核实 SHA 对应正确版本。
uses: aquasecurity/trivy-action@57a97c7e7821a5776cebc9bb87c984fa69cba8f1 # v0.35.0
with:
+1 -1
View File
@@ -9,7 +9,7 @@
- **容器监控** Prometheus 为主讲解如何采集和展示容器性能指标
- **日志管理** ELK (Elasticsearch, Logstash, Kibana) 套件为例介绍集中式日志收集平台
为了让读者能够在生产环境中真正用起来本章会补齐以下最小闭环
为了让读者能够在生产环境中真正用起来本章会补齐以下最小闭环
* 关键指标与日志的验证方法
* 常见故障排查路径
+1 -1
View File
@@ -5,7 +5,7 @@
* **指标监控** Prometheus + Grafana 为主完成指标采集存储与可视化
* **日志管理** EFK/ELK 为例完成容器日志的集中采集检索与分析
生产环境中建议将可观测性当成一个完整闭环**采集 -> 存储 -> 展示 -> 告警 -> 排错 -> 容量治理**
生产环境中建议将可观测性当成一个完整闭环**采集 -> 存储 -> 展示 -> 告警 -> 排错 -> 容量治理**
## 扩展阅读Docker 日志驱动
+7 -7
View File
@@ -25,7 +25,7 @@ Debian 是一个常用的基础镜像。
```bash
$ docker run -it debian bash
root@668e178d8d69:/# cat /etc/issue
Debian GNU/Linux 13
Debian GNU/Linux 12
```
`Debian` 镜像很适合作为基础镜像构建自定义镜像
@@ -43,18 +43,18 @@ Debian GNU/Linux 13
Ubuntu 是目前最流行的 Linux 发行版之一
下面以 `ubuntu:26.04` 为例演示如何使用该镜像安装一些常用软件
下面以 `ubuntu:24.04` 为例演示如何使用该镜像安装一些常用软件
首先使用 `-ti` 参数启动容器登录 `bash`查看 `ubuntu` 的发行版本号
```bash
$ docker run -ti ubuntu:26.04 /bin/bash
$ docker run -ti ubuntu:24.04 /bin/bash
root@7d93de07bf76:/# cat /etc/os-release
PRETTY_NAME="Ubuntu 26.04 LTS"
PRETTY_NAME="Ubuntu 24.04 LTS"
NAME="Ubuntu"
VERSION_ID="26.04"
VERSION="26.04 LTS (Resolute Raccoon)"
VERSION_CODENAME=resolute
VERSION_ID="24.04"
VERSION="24.04 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
+1 -1
View File
@@ -50,7 +50,7 @@ latest: Pulling from library/fedora
Digest: sha256:64a02df6aac27d1200c2572fe4b9949f1970d05f74d367ce4af994ba5dc3669e
Status: Downloaded newer image for fedora:latest
[root@196ca341419b /]# cat /etc/redhat-release
Fedora release 43 (Forty Three)
Fedora release 39 (Thirty Nine)
```
### 20.4.3 相关资源
+1 -1
View File
@@ -8,7 +8,7 @@
本章示例中使用的操作系统镜像版本遵循以下原则
- **AlpineDebianUbuntuCentOS** 等操作系统镜像采用大版本或次版本标签 `alpine:3.21``ubuntu:26.04`避免使用 `latest` 标签确保构建的可再现性
- **AlpineDebianUbuntuCentOS** 等操作系统镜像采用大版本或次版本标签 `alpine:3.21``ubuntu:24.04`避免使用 `latest` 标签确保构建的可再现性
- **OS 大版本保留**以便获得最新的安全补丁和修复
- 在生产环境中建议根据实际需求选择合适的版本并定期更新以获得安全修复
+2 -2
View File
@@ -54,9 +54,9 @@ unit_test:
build_image:
stage: build
image: docker:29
image: docker:27
services:
- docker:29-dind
- docker:27-dind
script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA .
+1 -1
View File
@@ -12,7 +12,7 @@
## DevOps 背景介绍
DevOps 是一种重要的开发和运维文化强调开发团队和运维团队之间的协作和自动化它致力于通过自动化和流程优化加快软件交付速度同时提高系统的稳定性和可靠性Docker 作为容器化技术的领导者已成为现代 DevOps 工作流中不可或缺的工具通过容器化应用开发团队可以确保一次构建处处运行消除开发测试和生产环境的差异大大简化了部署流程
DevOps 是一种重要的开发和运维文化强调开发团队和运维团队之间的协作和自动化它致力于通过自动化和流程优化加快软件交付速度同时提高系统的稳定性和可靠性Docker 作为容器化技术的领导者已成为现代 DevOps 工作流中不可或缺的工具通过容器化应用开发团队可以确保一次构建处处运行消除开发测试和生产环境的差异大大简化了部署流程
## Docker DevOps 中的角色
+1 -1
View File
@@ -190,7 +190,7 @@ ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgres && …
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
```
+3 -3
View File
@@ -434,8 +434,8 @@ Kubernetes 进阶 (Week 24-36)
- 题目数55
- 时间限制90 分钟
- 及格分数73% 41 道题
- 费用$199 USD
- 有效期2
- 费用$165 USD
- 有效期3
考试内容比例
```text
@@ -587,7 +587,7 @@ A(要点):
A要点
```text
1. 选择合适的基础镜像
scratch < alpine:3.21 < python:3.14-slim < python:3.14
scratch < alpine:3.17 < python:3.14-slim < python:3.14
2. 多阶段构建
- 构建阶段只保留编译工具
+2 -2
View File
@@ -11,7 +11,7 @@
在项目中创建一个 Dockerfile
```docker
FROM node:22
FROM node:20
## replace this with your application's default port
@@ -32,7 +32,7 @@ $ docker run -it --rm \
--mount type=bind,src="$(pwd)",target=/usr/src/myapp \
-w /usr/src/myapp \
node:22-alpine \
node:20-alpine \
node your-daemon-or-script.js
```