mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-11 04:14:38 +00:00
chore: remove unused historic image files
This commit is contained in:
@@ -188,6 +188,8 @@ WORKDIR /data
|
||||
|
||||
### 与其他指令的关系
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 指令 | WORKDIR 的影响 |
|
||||
|------|---------------|
|
||||
| `RUN` | 在 WORKDIR 中执行命令 |
|
||||
|
||||
@@ -165,6 +165,8 @@ exec gosu redis "$@"
|
||||
|
||||
#### 为什么不用 su/sudo
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 问题 | su/sudo | gosu |
|
||||
|------|---------|------|
|
||||
| TTY 要求 | 需要 | 不需要 |
|
||||
@@ -298,6 +300,7 @@ RUN mkdir -p /app/data && chown appuser:appuser /app/data
|
||||
非 root 用户无法绑定 80、443 等端口。
|
||||
|
||||
**解决**:
|
||||
|
||||
1. 使用高端口 (如 8080)
|
||||
2. 在运行时映射端口:`docker run -p 80:8080`
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ HEALTHCHECK NONE
|
||||
### 为什么需要 HEALTHCHECK
|
||||
|
||||
在没有 HEALTHCHECK 之前,Docker 只能通过**进程退出码**来判断容器状态。**问题场景**:
|
||||
|
||||
- Web 服务死锁,无法响应请求,但进程仍在运行
|
||||
- 数据库正在启动中,尚未准备好接受连接
|
||||
- 应用陷入死循环,CPU 爆满但进程存活
|
||||
@@ -58,11 +59,13 @@ HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
|
||||
|
||||
#### 常用选项
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 选项 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| `--interval` | 两次检查的间隔 | 30s |
|
||||
| `--timeout` | 检查命令的超时时间 | 30s |
|
||||
| `--start-period` | 启动缓冲期(期间失败不计入次数) | 0s |
|
||||
| `--start-period` | 启动缓冲期 (期间失败不计入次数)| 0s |
|
||||
| `--retries` | 连续失败多少次标记为 unhealthy | 3 |
|
||||
|
||||
---
|
||||
|
||||
@@ -21,6 +21,7 @@ ONBUILD <其它指令>
|
||||
#### 场景:维护 Node.js 项目
|
||||
|
||||
假设你有多个 Node.js 项目,它们的构建流程都一样:
|
||||
|
||||
1. 创建目录
|
||||
2. 复制 `package.json`
|
||||
3. 执行 `npm install`
|
||||
@@ -119,6 +120,7 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
|
||||
#### 1。继承性限制
|
||||
|
||||
`ONBUILD` 指令**只会继承一次**。
|
||||
|
||||
- 镜像 A (含 ONBUILD)
|
||||
- 镜像 B (FROM A) -> 触发 ONBUILD
|
||||
- 镜像 C (FROM B) -> **不会**再次触发 ONBUILD
|
||||
|
||||
@@ -11,6 +11,7 @@ SHELL ["executable", "parameters"]
|
||||
```
|
||||
|
||||
`SHELL` 指令允许覆盖 Docker 默认的 shell。
|
||||
|
||||
- **Linux 默认**:`["/bin/sh", "-c"]`
|
||||
- **Windows 默认**:`["cmd", "/S", "/C"]`
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ RUN apt-get update && \
|
||||
RUN apt-get update && apt-get install -y package-bar \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
- **Alpine**:
|
||||
```docker
|
||||
RUN apk add --no-cache package-bar
|
||||
|
||||
@@ -147,6 +147,7 @@ COPY --chown=node . /app/
|
||||
### 保留文件元数据
|
||||
|
||||
COPY 会保留源文件的元数据:
|
||||
|
||||
- 读、写、执行权限
|
||||
- 修改时间
|
||||
|
||||
@@ -162,11 +163,13 @@ COPY start.sh /app/
|
||||
|
||||
### COPY vs ADD
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | COPY | ADD |
|
||||
|------|------|-----|
|
||||
| 复制本地文件 | ✅ | ✅ |
|
||||
| 自动解压 tar | ❌ | ✅ |
|
||||
| 支持 URL | ❌ | ✅(不推荐) |
|
||||
| 支持 URL | ❌ | ✅ (不推荐)|
|
||||
| 推荐程度 | ✅ **推荐** | ⚠️ 特殊场景使用 |
|
||||
|
||||
```docker
|
||||
@@ -219,6 +222,7 @@ COPY --link --from=builder /app/dist /usr/share/nginx/html
|
||||
```
|
||||
|
||||
`--link` 的优势:
|
||||
|
||||
- 更高效利用构建缓存
|
||||
- 并行化构建过程
|
||||
- 加速多阶段构建
|
||||
@@ -241,6 +245,7 @@ Dockerfile
|
||||
```
|
||||
|
||||
这可以:
|
||||
|
||||
- 减小构建上下文大小
|
||||
- 加速构建
|
||||
- 避免复制敏感文件
|
||||
|
||||
@@ -12,6 +12,7 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
|
||||
```
|
||||
|
||||
`ADD` 在 `COPY` 基础上增加了两个功能:
|
||||
|
||||
1. 自动解压 tar 压缩包
|
||||
2. 支持从 URL 下载文件 (不推荐)
|
||||
|
||||
@@ -19,11 +20,13 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
|
||||
|
||||
### ADD vs COPY
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | COPY | ADD |
|
||||
|------|------|-----|
|
||||
| 复制本地文件 | ✅ | ✅ |
|
||||
| 自动解压 tar | ❌ | ✅ |
|
||||
| 支持 URL | ❌ | ✅(不推荐) |
|
||||
| 支持 URL | ❌ | ✅ (不推荐)|
|
||||
| 行为可预测性 | ✅ 高 | ⚠️ 低 |
|
||||
| 推荐程度 | ✅ **优先使用** | 仅解压场景 |
|
||||
|
||||
@@ -46,6 +49,7 @@ ADD app.tar.gz /app/
|
||||
```
|
||||
|
||||
ADD 会识别并解压以下格式:
|
||||
|
||||
- `.tar`
|
||||
- `.tar.gz` / `.tgz`
|
||||
- `.tar.bz2` / `.tbz2`
|
||||
@@ -95,6 +99,8 @@ ADD https://example.com/app.zip /app/app.zip
|
||||
|
||||
#### 为什么不推荐
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 问题 | 说明 |
|
||||
|------|------|
|
||||
| 权限固定 | 下载的文件权限为 600,通常需要额外 RUN 修改 |
|
||||
@@ -118,6 +124,7 @@ RUN curl -fsSL https://example.com/app.tar.gz | tar -xz -C /app
|
||||
```
|
||||
|
||||
优势:
|
||||
|
||||
- 一条 RUN 完成下载、解压、清理
|
||||
- 减少镜像层数
|
||||
- 更清晰的构建意图
|
||||
|
||||
@@ -31,6 +31,7 @@ CMD ["node", "server.js"]
|
||||
```
|
||||
|
||||
**优点**:
|
||||
|
||||
- 直接执行指定程序,是容器的 PID 1
|
||||
- 正确接收信号 (如 SIGTERM)
|
||||
- 无需 shell 解析
|
||||
@@ -62,6 +63,8 @@ CMD ["sh", "-c", "echo $HOME"]
|
||||
|
||||
### exec 格式 vs shell 格式
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | exec 格式 | shell 格式 |
|
||||
|------|----------|-----------|
|
||||
| 主进程 | 指定的程序 | `/bin/sh` |
|
||||
@@ -163,6 +166,8 @@ CMD ["nginx", "-g", "daemon off;"]
|
||||
|
||||
### CMD vs ENTRYPOINT
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 指令 | 用途 | 运行时行为 |
|
||||
|------|------|-----------|
|
||||
| **CMD**| 默认命令 | `docker run` 参数会**覆盖**它 |
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
|
||||
### 语法格式
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 格式 | 语法 | 推荐程度 |
|
||||
|------|------|---------|
|
||||
| **exec 格式**| `ENTRYPOINT ["可执行文件", "参数1"]` | ✅**推荐** |
|
||||
@@ -35,6 +37,8 @@ ENTRYPOINT nginx -g "daemon off;"
|
||||
|
||||
#### 核心区别
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ENTRYPOINT | CMD |
|
||||
|------|------------|-----|
|
||||
| **定位** | 固定的入口程序 | 默认参数 |
|
||||
@@ -272,13 +276,15 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
|
||||
|
||||
### ENTRYPOINT 与 CMD 组合表
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| ENTRYPOINT | CMD | 最终执行命令 |
|
||||
|------------|-----|-------------|
|
||||
| 无 | 无 | 无(容器无法启动) |
|
||||
| 无 | 无 | 无 (容器无法启动)|
|
||||
| 无 | `["cmd", "p1"]` | `cmd p1` |
|
||||
| `["ep", "p1"]` | 无 | `ep p1` |
|
||||
| `["ep", "p1"]` | `["cmd", "p2"]` | `ep p1 cmd p2` |
|
||||
| `ep p1`(shell) | `["cmd", "p2"]` | `/bin/sh -c "ep p1"`(CMD 被忽略) |
|
||||
| `ep p1` (shell)| `["cmd", "p2"]` | `/bin/sh -c "ep p1"` (CMD 被忽略)|
|
||||
|
||||
> ⚠️ **注意**:shell 格式的 ENTRYPOINT 会忽略 CMD!
|
||||
|
||||
|
||||
@@ -150,12 +150,14 @@ DATABASE_URL=postgres://localhost/mydb
|
||||
|
||||
### ENV vs ARG
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ENV | ARG |
|
||||
|------|-----|-----|
|
||||
| **生效时间** | 构建时 + 运行时 | 仅构建时 |
|
||||
| **持久性** | 写入镜像,运行时可用 | 构建后消失 |
|
||||
| **覆盖方式** | `docker run -e` | `docker build --build-arg` |
|
||||
| **适用场景** | 应用配置 | 构建参数(如版本号) |
|
||||
| **适用场景** | 应用配置 | 构建参数 (如版本号)|
|
||||
|
||||
#### 概述
|
||||
|
||||
|
||||
@@ -16,12 +16,14 @@ ARG <参数名>[=<默认值>]
|
||||
|
||||
### ARG vs ENV
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ARG | ENV |
|
||||
|------|-----|-----|
|
||||
| **生效时间** | 仅构建时 | 构建时 + 运行时 |
|
||||
| **持久性** | 构建后消失 | 写入镜像 |
|
||||
| **覆盖方式** | `docker build --build-arg` | `docker run -e` |
|
||||
| **适用场景** | 构建参数(版本号等) | 应用配置 |
|
||||
| **适用场景** | 构建参数 (版本号等)| 应用配置 |
|
||||
| **可见性** | `docker history` 可见 | `docker inspect` 可见 |
|
||||
|
||||
```
|
||||
|
||||
@@ -197,11 +197,13 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
|
||||
### VOLUME vs docker run -v
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | Dockerfile VOLUME | docker run -v |
|
||||
|------|-------------------|---------------|
|
||||
| **定义时机** | 镜像构建时 | 容器运行时 |
|
||||
| **默认行为** | 创建匿名卷 | 可指定命名卷或路径 |
|
||||
| **灵活性** | 低(固定路径) | 高(可任意指定) |
|
||||
| **灵活性** | 低 (固定路径)| 高 (可任意指定)|
|
||||
| **适用场景** | 定义必须持久化的路径 | 灵活的数据管理 |
|
||||
|
||||
---
|
||||
|
||||
@@ -76,11 +76,13 @@ $ docker port $(docker ps -q)
|
||||
|
||||
### EXPOSE vs -p
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | EXPOSE | -p |
|
||||
|------|--------|-----|
|
||||
| **位置** | Dockerfile | docker run 命令 |
|
||||
| **作用** | 声明/文档 | 实际端口映射 |
|
||||
| **是否必需** | 否 | 是(外部访问时) |
|
||||
| **是否必需** | 否 | 是 (外部访问时)|
|
||||
| **映射发生时** | 不发生 | 运行时发生 |
|
||||
|
||||
```mermaid
|
||||
@@ -130,6 +132,7 @@ EXPOSE 80
|
||||
```
|
||||
|
||||
EXPOSE 不会:
|
||||
|
||||
- 自动进行端口映射
|
||||
- 让服务可从外部访问
|
||||
- 在容器启动时开启端口监听
|
||||
|
||||
@@ -1,12 +1,14 @@
|
||||
## 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 要点 | 说明 |
|
||||
|------|------|
|
||||
| **作用** | 设置后续指令的工作目录 |
|
||||
| **语法** | `WORKDIR /path` |
|
||||
| **自动创建** | 目录不存在会自动创建 |
|
||||
| **持久性** | 影响后续所有指令,直到下次 WORKDIR |
|
||||
| **不要用** | `RUN cd /path`(无效) |
|
||||
| **不要用** | `RUN cd /path` (无效)|
|
||||
|
||||
### 延伸阅读
|
||||
|
||||
@@ -46,7 +48,7 @@
|
||||
|------|------|
|
||||
| **作用** | 定义在子镜像构建时执行的指令 |
|
||||
| **语法** | `ONBUILD INSTRUCTION` |
|
||||
| **适用** | 基础架构镜像(Node, Python, Go 等) |
|
||||
| **适用** | 基础架构镜像 (Node, Python, Go 等)|
|
||||
| **限制** | 只继承一次,不可级联 |
|
||||
| **规范** | 建议使用 `-onbuild` 标签后缀 |
|
||||
|
||||
@@ -195,7 +197,7 @@
|
||||
|
||||
| 要点 | 说明 |
|
||||
|------|------|
|
||||
| **作用** | 声明容器提供服务的端口(文档) |
|
||||
| **作用** | 声明容器提供服务的端口 (文档)|
|
||||
| **不会** | 自动映射端口或开放外部访问 |
|
||||
| **配合** | `docker run -P` 自动映射 |
|
||||
| **外部访问** | 需要 `-p 宿主机端口:容器端口` |
|
||||
|
||||
Reference in New Issue
Block a user