Add more content and fix format

This commit is contained in:
Baohua Yang
2026-02-25 21:06:21 -08:00
parent dd449bc84f
commit ecab788013
119 changed files with 566 additions and 496 deletions

View File

@@ -2,8 +2,6 @@
### 7.10.1 基本语法
如下代码块所示展示了相关示例
```docker
WORKDIR <工作目录路径>
```
@@ -14,8 +12,6 @@ WORKDIR <工作目录路径>
### 7.10.2 基本用法
如下代码块所示展示了相关示例
```docker
WORKDIR /app
@@ -30,8 +26,6 @@ COPY . . # 复制到 /app/
#### 常见错误
如下代码块所示展示了相关示例
```docker
## ❌ 错误cd 在下一个 RUN 中无效
@@ -41,8 +35,6 @@ RUN echo "hello" > world.txt # 文件在根目录!
#### 原因分析
如下代码块所示展示了相关示例
```dockerfile
RUN cd /app
@@ -58,8 +50,6 @@ RUN echo "hello" > world.txt
#### 正确做法
如下代码块所示展示了相关示例
```docker
## ✅ 正确:使用 WORKDIR
@@ -85,8 +75,6 @@ RUN pwd # 输出 /a/b/c
### 7.10.5 使用环境变量
如下代码块所示展示了相关示例
```docker
ENV APP_HOME=/app
WORKDIR $APP_HOME
@@ -98,8 +86,6 @@ RUN pwd # 输出 /app
### 7.10.6 多阶段构建中的 WORKDIR
如下代码块所示展示了相关示例
```docker
## 构建阶段
@@ -123,8 +109,6 @@ COPY --from=builder /build/dist .
#### 1. 尽早设置 WORKDIR
如下代码块所示展示了相关示例
```docker
FROM node:20
WORKDIR /app # 尽早设置
@@ -137,8 +121,6 @@ CMD ["node", "server.js"]
#### 2. 使用绝对路径
如下代码块所示展示了相关示例
```docker
## ✅ 推荐:绝对路径,意图明确
@@ -151,8 +133,6 @@ WORKDIR app
#### 3. 不要用 RUN cd
如下代码块所示展示了相关示例
```docker
## ❌ 避免
@@ -166,8 +146,6 @@ RUN echo "hello" > world.txt
#### 4. 适时重置 WORKDIR
如下代码块所示展示了相关示例
```docker
WORKDIR /app
## ... 应用相关操作 ...

View File

@@ -2,8 +2,6 @@
### 7.11.1 基本语法
如下代码块所示展示了相关示例
```docker
USER <用户名>[:<用户组>]
USER <UID>[:<GID>]
@@ -38,8 +36,6 @@ flowchart LR
#### 创建并切换用户
如下代码块所示展示了相关示例
```docker
FROM node:20-alpine
@@ -64,8 +60,6 @@ CMD ["node", "server.js"]
#### 使用 UID/GID
如下代码块所示展示了相关示例
```docker
## 也可以使用数字
@@ -213,8 +207,6 @@ CMD ["node", "server.js"]
#### 1. 始终使用非 root 用户
如下代码块所示展示了相关示例
```docker
## ✅ 推荐
@@ -241,8 +233,6 @@ USER 1000:1000
#### 3. 多阶段构建中的 USER
如下代码块所示展示了相关示例
```docker
## 构建阶段可以用 root

View File

@@ -2,8 +2,6 @@
### 7.12.1 基本语法
如下代码块所示展示了相关示例
```docker
HEALTHCHECK [选项] CMD <命令>
HEALTHCHECK NONE
@@ -37,8 +35,6 @@ Starting ──成功──> Healthy ──失败N次──> Unhealthy
#### Web 服务检查
如下代码块所示展示了相关示例
```docker
FROM nginx
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
@@ -93,8 +89,6 @@ HEALTHCHECK CMD wget -q --spider http://localhost/ || exit 1
#### 数据库
如下代码块所示展示了相关示例
```docker
## MySQL
@@ -107,8 +101,6 @@ HEALTHCHECK CMD redis-cli ping || exit 1
#### 自定义脚本
如下代码块所示展示了相关示例
```docker
COPY healthcheck.sh /usr/local/bin/
HEALTHCHECK CMD ["healthcheck.sh"]

View File

@@ -1,9 +1,7 @@
## 7.13 ONBUILD 为他人嫁衣裳
## 7.13 ONBUILD 为他人嫁衣裳
### 7.13.1 基本语法
如下代码块所示展示了相关示例
```docker
ONBUILD <其它指令>
```
@@ -60,8 +58,6 @@ FROM my-node-base
### 7.13.3 执行机制
如下代码块所示展示了相关示例
```bash
基础镜像构建:
Dockerfile (含 ONBUILD) ──build──> 基础镜像 (记录了 ONBUILD 触发器)
@@ -77,8 +73,6 @@ FROM 基础镜像 ──build──> 读取基础镜像触发器 ──> 执行
#### 1. 自动处理依赖安装
如下代码块所示展示了相关示例
```docker
## Python 基础镜像
@@ -88,8 +82,6 @@ ONBUILD RUN pip install -r requirements.txt
#### 2. 自动编译代码
如下代码块所示展示了相关示例
```docker
## Go 基础镜像
@@ -99,8 +91,6 @@ ONBUILD RUN go build -o app main.go
#### 3. 处理静态资源
如下代码块所示展示了相关示例
```docker
## Nginx 静态网站基础镜像

View File

@@ -2,8 +2,6 @@
### 7.14.1 基本语法
如下代码块所示展示了相关示例
```docker
LABEL <key>=<value> <key>=<value> ...
```
@@ -25,8 +23,6 @@ LABEL <key>=<value> <key>=<value> ...
#### 定义单个标签
如下代码块所示展示了相关示例
```docker
LABEL version="1.0"
LABEL description="这是一个 Web 应用服务器"
@@ -34,8 +30,6 @@ LABEL description="这是一个 Web 应用服务器"
#### 定义多个标签 (推荐)
如下代码块所示展示了相关示例
```docker
LABEL maintainer="user@example.com" \
version="1.2.0" \
@@ -65,8 +59,6 @@ LABEL maintainer="user@example.com" \
#### 示例
如下代码块所示展示了相关示例
```docker
LABEL org.opencontainers.image.authors="yeasy" \
org.opencontainers.image.documentation="https://yeasy.gitbooks.io" \

View File

@@ -2,8 +2,6 @@
### 7.15.1 基本语法
如下代码块所示展示了相关示例
```docker
SHELL ["executable", "parameters"]
```

View File

@@ -125,8 +125,6 @@ RUN set -x ; cd ${LARAVEL_PATH} \
### 7.18.5 最后一个阶段构建 NGINX 镜像
如下代码块所示展示了相关示例
```docker
FROM nginx:alpine as nginx

View File

@@ -2,8 +2,6 @@
### 7.1.1 基本语法
如下代码块所示展示了相关示例
```docker
RUN <command>
RUN ["executable", "param1", "param2"]
@@ -17,8 +15,6 @@ RUN ["executable", "param1", "param2"]
#### 1. Shell 格式
如下代码块所示展示了相关示例
```docker
RUN apt-get update
```
@@ -32,8 +28,6 @@ RUN apt-get update
#### 2. Exec 格式
如下代码块所示展示了相关示例
```docker
RUN ["apt-get", "update"]
```
@@ -106,8 +100,6 @@ RUN wget http://url | gzip -d > file
#### Q为什么 `RUN cd /app` 不生效
如下代码块所示展示了相关示例
```docker
RUN cd /app
RUN touch hello.txt
@@ -122,8 +114,6 @@ RUN touch hello.txt
#### Q环境变量不生效
如下代码块所示展示了相关示例
```docker
RUN export MY_VAR=hello
RUN echo $MY_VAR

View File

@@ -2,8 +2,6 @@
### 7.2.1 基本语法
如下代码块所示展示了相关示例
```docker
COPY [选项] <源路径>... <目标路径>
COPY [选项] ["<源路径1>", "<源路径2>", ... "<目标路径>"]
@@ -17,8 +15,6 @@ COPY [选项] ["<源路径1>", "<源路径2>", ... "<目标路径>"]
#### 复制单个文件
如下代码块所示展示了相关示例
```docker
## 复制文件到指定目录
@@ -31,8 +27,6 @@ COPY config.json /app/settings.json
#### 复制多个文件
如下代码块所示展示了相关示例
```docker
## 复制多个指定文件
@@ -46,8 +40,6 @@ COPY src/*.js /app/src/
#### 复制目录
如下代码块所示展示了相关示例
```docker
## 复制整个目录的内容(不是目录本身)
@@ -88,16 +80,12 @@ COPY app[0-9].js /app/ # app0.js ~ app9.js
#### 绝对路径
如下代码块所示展示了相关示例
```docker
COPY app.js /usr/src/app/
```
#### 相对路径 (基于 WORKDIR)
如下代码块所示展示了相关示例
```docker
WORKDIR /app
COPY package.json ./ # 复制到 /app/package.json
@@ -183,8 +171,6 @@ ADD app.tar.gz /app/
#### 从其他构建阶段复制
如下代码块所示展示了相关示例
```docker
## 构建阶段
@@ -203,8 +189,6 @@ COPY --from=builder /app/dist /usr/share/nginx/html
#### 使用 --link 优化缓存
如下代码块所示展示了相关示例
```docker
## 使用 --link 后,文件以独立层添加,不依赖前序指令
@@ -246,8 +230,6 @@ Dockerfile
#### 1. 利用缓存先复制依赖文件
如下代码块所示展示了相关示例
```docker
## ✅ 好:先复制依赖定义,再安装,最后复制代码
@@ -263,8 +245,6 @@ RUN npm install
#### 2. 使用 .dockerignore
如下代码块所示展示了相关示例
```docker
## 确保 node_modules 不被复制
@@ -276,8 +256,6 @@ COPY . .
#### 3. 明确复制路径
如下代码块所示展示了相关示例
```docker
## ✅ 好:明确的路径

View File

@@ -2,8 +2,6 @@
### 7.3.1 基本语法
如下代码块所示展示了相关示例
```docker
ADD [选项] <源路径>... <目标路径>
ADD [选项] ["<源路径>", ... "<目标路径>"]
@@ -34,8 +32,6 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
#### 基本用法 (自动解压本地 tar)
如下代码块所示展示了相关示例
```docker
## 自动解压 tar.gz 到目标目录
@@ -60,8 +56,6 @@ ADD ubuntu-noble-core-cloudimg-amd64-root.tar.gz /
#### 解压过程
如下代码块所示展示了相关示例
```bash
ADD app.tar.gz /app/
@@ -81,8 +75,6 @@ app.tar.gz 包含: /app/ 目录结果:
#### 基本用法
如下代码块所示展示了相关示例
```docker
## 从 URL 下载文件
@@ -100,8 +92,6 @@ ADD https://example.com/app.zip /app/app.zip
#### 推荐替代方案
如下代码块所示展示了相关示例
```docker
## ❌ 不推荐:使用 ADD 下载
@@ -123,8 +113,6 @@ RUN curl -fsSL https://example.com/app.tar.gz | tar -xz -C /app
### 7.3.5 修改文件所有者
如下代码块所示展示了相关示例
```docker
ADD --chown=node:node app.tar.gz /app/
ADD --chown=1000:1000 files/ /app/
@@ -136,8 +124,6 @@ ADD --chown=1000:1000 files/ /app/
#### 适合使用 ADD
如下代码块所示展示了相关示例
```docker
## 解压本地 tar 文件
@@ -151,8 +137,6 @@ ADD dist.tar.gz /app/
#### 不适合使用 ADD
如下代码块所示展示了相关示例
```docker
## 复制普通文件(用 COPY
@@ -202,8 +186,6 @@ ADD app.tar.gz /app/
#### 1. 默认使用 COPY
如下代码块所示展示了相关示例
```docker
## ✅ 大多数场景使用 COPY
@@ -212,8 +194,6 @@ COPY . /app/
#### 2. 仅在需要解压时使用 ADD
如下代码块所示展示了相关示例
```docker
## ✅ 自动解压场景
@@ -222,8 +202,6 @@ ADD app.tar.gz /app/
#### 3. 不要用 ADD 下载文件
如下代码块所示展示了相关示例
```docker
## ❌ 避免
@@ -236,8 +214,6 @@ RUN curl -fsSL https://example.com/file.tar.gz | tar -xz -C /app
#### 4. 解压后清理
如下代码块所示展示了相关示例
```docker
## 如果需要控制解压过程

View File

@@ -20,8 +20,6 @@ CMD 有三种格式:
#### exec 格式 (推荐)
如下代码块所示展示了相关示例
```docker
CMD ["nginx", "-g", "daemon off;"]
CMD ["python", "app.py"]
@@ -36,8 +34,6 @@ CMD ["node", "server.js"]
#### shell 格式
如下代码块所示展示了相关示例
```docker
CMD echo "Hello World"
CMD nginx -g "daemon off;"
@@ -70,8 +66,6 @@ CMD ["sh", "-c", "echo $HOME"]
#### 信号传递问题示例
如下代码块所示展示了相关示例
```docker
## ❌ shell 格式docker stop 会超时
@@ -116,8 +110,6 @@ CMD ["/bin/bash"] + cat /etc/os-release
#### 错误示例
如下代码块所示展示了相关示例
```docker
## ❌ 容器启动后立即退出
@@ -126,8 +118,6 @@ CMD service nginx start
#### 原因分析
如下代码块所示展示了相关示例
```bash
1. CMD service nginx start
↓ 被转换为
@@ -144,8 +134,6 @@ CMD service nginx start
#### 正确做法
如下代码块所示展示了相关示例
```docker
## ✅ 让 nginx 在前台运行
@@ -163,8 +151,6 @@ CMD ["nginx", "-g", "daemon off;"]
#### 单独使用 CMD
如下代码块所示展示了相关示例
```docker
## Dockerfile
@@ -178,8 +164,6 @@ $ docker run myimage curl -v ... # 完全覆盖
#### 搭配 ENTRYPOINT
如下代码块所示展示了相关示例
```docker
## Dockerfile
@@ -200,8 +184,6 @@ $ docker run myimage http://other.com # curl -s http://other.com参数覆盖
#### 1. 优先使用 exec 格式
如下代码块所示展示了相关示例
```docker
## ✅ 推荐
@@ -214,8 +196,6 @@ CMD ["sh", "-c", "echo $PATH && python app.py"]
#### 2. 确保应用在前台运行
如下代码块所示展示了相关示例
```docker
## ✅ 前台运行
@@ -231,8 +211,6 @@ CMD systemctl start nginx
#### 3. 使用双引号
如下代码块所示展示了相关示例
```docker
## ✅ 正确:双引号
@@ -245,8 +223,6 @@ CMD ['node', 'server.js']
#### 4. 配合 ENTRYPOINT 使用
如下代码块所示展示了相关示例
```docker
## 用于可配置参数的场景
@@ -275,8 +251,6 @@ CMD ["echo", "second"] # 只有这个生效
#### Q如何在 CMD 中使用环境变量
如下代码块所示展示了相关示例
```docker
## 方法1使用 shell 格式

View File

@@ -40,8 +40,6 @@ ENTRYPOINT nginx -g "daemon off;"
#### 行为对比
如下代码块所示展示了相关示例
```docker
## 只用 CMD
@@ -88,8 +86,6 @@ $ docker run myimage -v http://other.com # curl -s -v http://other.com ✓
#### 使用 CMD 的问题
如下代码块所示展示了相关示例
```docker
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
@@ -109,8 +105,6 @@ exec: "-i": executable file not found
#### 使用 ENTRYPOINT 解决
如下代码块所示展示了相关示例
```docker
FROM ubuntu:24.04
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
@@ -129,8 +123,6 @@ HTTP/1.1 200 OK
#### 交互图示
如下代码块所示展示了相关示例
```bash
ENTRYPOINT ["curl", "-s", "http://myip.ipip.net"]
@@ -152,8 +144,6 @@ curl -s http://myip.ipip.net -i
#### 实现方式
如下代码块所示展示了相关示例
```docker
FROM redis:7-alpine
COPY docker-entrypoint.sh /usr/local/bin/
@@ -185,8 +175,6 @@ exec "$@"
#### 工作流程
如下代码块所示展示了相关示例
```bash
docker run redis docker run redis bash
│ │
@@ -209,8 +197,6 @@ docker-entrypoint.sh redis-server docker-entrypoint.sh bash
### 7.5.6 场景三带参数的应用
如下代码块所示展示了相关示例
```docker
FROM python:3.12-slim
WORKDIR /app
@@ -280,8 +266,6 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
#### 1. 使用 exec 格式
如下代码块所示展示了相关示例
```docker
## ✅ 推荐
@@ -294,8 +278,6 @@ ENTRYPOINT python app.py
#### 2. 提供有意义的默认参数
如下代码块所示展示了相关示例
```docker
ENTRYPOINT ["nginx"]
CMD ["-g", "daemon off;"]

View File

@@ -2,8 +2,6 @@
### 7.6.1 基本语法
如下代码块所示展示了相关示例
```docker
## 格式一:单个变量
@@ -20,8 +18,6 @@ ENV <key1>=<value1> <key2>=<value2> ...
#### 设置单个变量
如下代码块所示展示了相关示例
```docker
ENV NODE_VERSION 20.10.0
ENV APP_ENV production
@@ -29,8 +25,6 @@ ENV APP_ENV production
#### 设置多个变量
如下代码块所示展示了相关示例
```docker
ENV NODE_VERSION=20.10.0 \
APP_ENV=production \
@@ -45,8 +39,6 @@ ENV NODE_VERSION=20.10.0 \
#### 1. 后续指令中使用
如下代码块所示展示了相关示例
```docker
ENV NODE_VERSION=20.10.0
@@ -67,8 +59,6 @@ COPY . $APP_HOME
#### 2. 容器运行时使用
如下代码块所示展示了相关示例
```docker
ENV DATABASE_URL=postgres://localhost/mydb
```
@@ -147,8 +137,6 @@ DATABASE_URL=postgres://localhost/mydb
#### 组合使用
如下代码块所示展示了相关示例
```docker
## ARG 接收构建时参数
@@ -175,8 +163,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
#### 1. 统一管理版本号
如下代码块所示展示了相关示例
```docker
## ✅ 好:版本集中管理
@@ -193,8 +179,6 @@ RUN apt-get install nginx=1.25.0
#### 2. 不要存储敏感信息
如下代码块所示展示了相关示例
```docker
## ❌ 错误:密码写入镜像
@@ -209,8 +193,6 @@ ENV DB_PASSWORD=secret123
#### 3. 为应用提供合理默认值
如下代码块所示展示了相关示例
```docker
ENV APP_ENV=production \
APP_PORT=8080 \
@@ -219,8 +201,6 @@ ENV APP_ENV=production \
#### 4. 使用有意义的变量名
如下代码块所示展示了相关示例
```docker
## ✅ 好:清晰的命名
@@ -260,8 +240,6 @@ $ docker exec mycontainer env
#### Q多行 ENV 还是多个 ENV
如下代码块所示展示了相关示例
```docker
## ✅ 推荐:减少层数

View File

@@ -2,8 +2,6 @@
### 7.7.1 基本语法
如下代码块所示展示了相关示例
```docker
ARG <参数名>[=<默认值>]
```
@@ -37,8 +35,6 @@ ARG <参数名>[=<默认值>]
#### 定义和使用
如下代码块所示展示了相关示例
```docker
## 定义有默认值的 ARG
@@ -68,8 +64,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
#### FROM 之前的 ARG
如下代码块所示展示了相关示例
```docker
## FROM 之前的 ARG 只能用于 FROM 指令
@@ -85,8 +79,6 @@ RUN echo $REGISTRY # 输出空
#### FROM 之后重新声明
如下代码块所示展示了相关示例
```docker
ARG NODE_VERSION=20
@@ -100,8 +92,6 @@ RUN echo "Node version: $NODE_VERSION"
#### 多阶段构建中的 ARG
如下代码块所示展示了相关示例
```docker
ARG BASE_VERSION=alpine
@@ -124,8 +114,6 @@ RUN echo "Running with Node $NODE_VERSION"
#### 1. 控制基础镜像版本
如下代码块所示展示了相关示例
```docker
ARG ALPINE_VERSION=3.19
FROM alpine:${ALPINE_VERSION}
@@ -137,8 +125,6 @@ $ docker build --build-arg ALPINE_VERSION=3.18 .
#### 2. 设置软件版本
如下代码块所示展示了相关示例
```docker
ARG NGINX_VERSION=1.25.0
@@ -147,8 +133,6 @@ RUN curl -fsSL https://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz | tar -x
#### 3. 配置构建环境
如下代码块所示展示了相关示例
```docker
ARG BUILD_ENV=production
ARG ENABLE_DEBUG=false
@@ -162,8 +146,6 @@ RUN if [ "$ENABLE_DEBUG" = "true" ]; then \
#### 4. 配置私有仓库
如下代码块所示展示了相关示例
```docker
ARG NPM_TOKEN
@@ -221,8 +203,6 @@ $ docker build --build-arg HTTP_PROXY=http://proxy:8080 .
#### 1. ARG 提供合理默认值
如下代码块所示展示了相关示例
```docker
## ✅ 好:有默认值
@@ -235,8 +215,6 @@ ARG NODE_VERSION
#### 2. 不要用 ARG 存储敏感信息
如下代码块所示展示了相关示例
```docker
## ❌ 错误:密码会被记录在镜像历史中
@@ -250,8 +228,6 @@ RUN echo "password=$DB_PASSWORD" > /app/.env
#### 3. 使用 ARG 提高构建灵活性
如下代码块所示展示了相关示例
```docker
ARG BASE_IMAGE=python:3.12-slim
FROM ${BASE_IMAGE}

View File

@@ -2,8 +2,6 @@
### 7.8.1 基本语法
如下代码块所示展示了相关示例
```docker
VOLUME ["/路径1", "/路径2"]
VOLUME /路径
@@ -47,8 +45,6 @@ flowchart LR
#### 定义单个卷
如下代码块所示展示了相关示例
```docker
FROM mysql:8.0
VOLUME /var/lib/mysql
@@ -56,8 +52,6 @@ VOLUME /var/lib/mysql
#### 定义多个卷
如下代码块所示展示了相关示例
```docker
FROM myapp
VOLUME ["/data", "/logs", "/config"]
@@ -113,8 +107,6 @@ RUN echo "hello" > /data/test.txt
#### 正确做法
如下代码块所示展示了相关示例
```docker
FROM ubuntu
@@ -133,8 +125,6 @@ VOLUME /data
#### 数据库持久化
如下代码块所示展示了相关示例
```docker
FROM postgres:15
VOLUME /var/lib/postgresql/data
@@ -142,8 +132,6 @@ VOLUME /var/lib/postgresql/data
#### 日志目录
如下代码块所示展示了相关示例
```docker
FROM nginx
VOLUME /var/log/nginx
@@ -151,8 +139,6 @@ VOLUME /var/log/nginx
#### 上传文件目录
如下代码块所示展示了相关示例
```docker
FROM myapp
VOLUME /app/uploads
@@ -235,8 +221,6 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
#### 1. 定义必须持久化的路径
如下代码块所示展示了相关示例
```docker
## 数据库必须使用卷
@@ -246,8 +230,6 @@ VOLUME /var/lib/postgresql/data
#### 2. 不要在 VOLUME 后修改目录
如下代码块所示展示了相关示例
```docker
## ❌ 避免
@@ -262,8 +244,6 @@ VOLUME /app/data
#### 3. 文档中说明 VOLUME 用途
如下代码块所示展示了相关示例
```docker
## 持久化用户上传的文件

View File

@@ -1,9 +1,7 @@
## 7.9 EXPOSE 声明端口
## 7.9 EXPOSE 暴露端口
### 7.9.1 基本语法
如下代码块所示展示了相关示例
```docker
EXPOSE <端口> [<端口>/<协议>...]
```
@@ -14,8 +12,6 @@ EXPOSE <端口> [<端口>/<协议>...]
### 7.9.2 基本用法
如下代码块所示展示了相关示例
```docker
## 声明单个端口
@@ -88,8 +84,6 @@ flowchart TD
#### 没有 EXPOSE 也能 -p
如下代码块所示展示了相关示例
```docker
## 即使没有 EXPOSE也可以使用 -p
@@ -111,8 +105,6 @@ $ docker run -p 8080:80 mynginx
#### 误解EXPOSE 会打开端口
如下代码块所示展示了相关示例
```docker
## ❌ 错误理解:这不会让容器可从外部访问
@@ -129,8 +121,6 @@ EXPOSE 只是元数据声明。容器是否实际监听该端口,取决于容
#### 正确理解
如下代码块所示展示了相关示例
```docker
## Dockerfile
@@ -150,8 +140,6 @@ $ docker run -p 8080:80 nginx # 2. 映射:宿主机 8080 → 容器 80
#### 1. 总是声明应用使用的端口
如下代码块所示展示了相关示例
```docker
## Web 服务
@@ -171,8 +159,6 @@ EXPOSE 6379
#### 2. 使用明确的协议
如下代码块所示展示了相关示例
```docker
## 默认是 TCP
@@ -189,8 +175,6 @@ EXPOSE 53/tcp 53/udp
#### 3. 与应用实际端口保持一致
如下代码块所示展示了相关示例
```docker
## ✅ 好EXPOSE 与应用端口一致
@@ -208,8 +192,6 @@ CMD ["node", "server.js"] # 实际监听 3000
### 7.9.7 使用环境变量
如下代码块所示展示了相关示例
```docker
ARG PORT=80
EXPOSE $PORT

View File

@@ -1,4 +1,4 @@
## 7.19 本章小结
## 本章小结
| 要点 | 说明 |
|------|------|
@@ -12,7 +12,7 @@
- [COPY 复制文件](7.2_copy.md)文件复制
- [RUN 执行命令](../04_image/4.5_build.md)执行构建命令
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南
- [最佳实践](../appendix/best_practices.md)Dockerfile 编写指南
| 要点 | 说明 |
|------|------|
@@ -26,7 +26,7 @@
- [安全](../18_security/README.md)容器安全实践
- [ENTRYPOINT](7.5_entrypoint.md)入口脚本中的用户切换
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 安全
- [最佳实践](../appendix/best_practices.md)Dockerfile 安全
| 要点 | 说明 |
|------|------|
@@ -40,7 +40,7 @@
- [CMD 容器启动命令](7.4_cmd.md)启动主进程
- [Compose 模板文件](../11_compose/11.5_compose_file.md)Compose 中的健康检查
- [Docker 调试](../appendix/20.2_debug.md)容器排障
- [Docker 调试](../appendix/debug.md)容器排障
| 要点 | 说明 |
|------|------|
@@ -53,7 +53,7 @@
### 7.19.4 延伸阅读
- [COPY 指令](7.2_copy.md)文件复制
- [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)基础镜像设计
- [Dockerfile 最佳实践](../appendix/best_practices.md)基础镜像设计
| 要点 | 说明 |
|------|------|
@@ -66,7 +66,7 @@
### 7.19.5 延伸阅读
- [OCI 标签规范](https://github.com/opencontainers/image-spec/blob/main/annotations.md)
- [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)
- [Dockerfile 最佳实践](../appendix/best_practices.md)
| 要点 | 说明 |
|------|------|
@@ -79,7 +79,7 @@
### 7.19.6 延伸阅读
- [RUN 指令](../04_image/4.5_build.md)执行命令
- [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)错误处理与调试
- [Dockerfile 最佳实践](../appendix/best_practices.md)错误处理与调试
| 要点 | 说明 |
|------|------|
@@ -93,7 +93,7 @@
- [CMD 容器启动命令](7.4_cmd.md)容器启动时的命令
- [WORKDIR 指定工作目录](7.10_workdir.md)改变目录
- [Dockerfile 最佳实践](../appendix/20.1_best_practices.md)
- [Dockerfile 最佳实践](../appendix/best_practices.md)
| 操作 | 示例 |
|------|------|
@@ -108,7 +108,7 @@
- [ADD 指令](7.3_add.md)复制和解压
- [WORKDIR 指令](7.10_workdir.md)设置工作目录
- [多阶段构建](7.17_multistage_builds.md)优化镜像大小
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南
- [最佳实践](../appendix/best_practices.md)Dockerfile 编写指南
| 场景 | 推荐指令 |
|------|---------|
@@ -122,7 +122,7 @@
- [COPY 复制文件](7.2_copy.md)基本复制操作
- [多阶段构建](7.17_multistage_builds.md)减少镜像体积
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南
- [最佳实践](../appendix/best_practices.md)Dockerfile 编写指南
| 要点 | 说明 |
|------|------|
@@ -136,7 +136,7 @@
- [ENTRYPOINT 入口点](7.5_entrypoint.md)固定的启动命令
- [后台运行](../05_container/5.2_daemon.md)容器前台/后台概念
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南
- [最佳实践](../appendix/best_practices.md)Dockerfile 编写指南
| ENTRYPOINT | CMD | 适用场景 |
|------------|-----|---------|
@@ -147,7 +147,7 @@
### 7.19.11 延伸阅读
- [CMD 容器启动命令](7.4_cmd.md)默认命令
- [最佳实践](../appendix/20.1_best_practices.md)启动命令设计
- [最佳实践](../appendix/best_practices.md)启动命令设计
- [后台运行](../05_container/5.2_daemon.md)前台/后台概念
| 要点 | 说明 |
@@ -162,7 +162,7 @@
- [ARG 构建参数](7.7_arg.md)构建时变量
- [Compose 环境变量](../11_compose/11.5_compose_file.md)Compose 中的环境变量
- [最佳实践](../appendix/20.1_best_practices.md)Dockerfile 编写指南
- [最佳实践](../appendix/best_practices.md)Dockerfile 编写指南
| 要点 | 说明 |
|------|------|