mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-13 13:21:18 +00:00
Compare commits
5 Commits
a9c4189c0c
...
3af007b176
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3af007b176 | ||
|
|
551dcfd2cb | ||
|
|
0d2654fbf2 | ||
|
|
3894ba56bc | ||
|
|
0dd0d036a2 |
@@ -123,7 +123,6 @@ RUN apt-get install -y build-essential # 安装编译工具(约 200MB)
|
|||||||
RUN make && make install # 编译应用
|
RUN make && make install # 编译应用
|
||||||
RUN apt-get remove build-essential # 试图删除编译工具
|
RUN apt-get remove build-essential # 试图删除编译工具
|
||||||
## 结果:镜像仍然包含 200MB 的编译工具!
|
## 结果:镜像仍然包含 200MB 的编译工具!
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```docker
|
```docker
|
||||||
|
|||||||
@@ -1,16 +1,12 @@
|
|||||||
## 3.6 Linux 离线安装
|
## 3.6 Linux 离线安装
|
||||||
|
|
||||||
\[TOC]
|
|
||||||
|
|
||||||
生产环境中一般都是没有公网资源的,本文介绍如何在生产服务器上离线部署 `Docker`
|
生产环境中一般都是没有公网资源的,本文介绍如何在生产服务器上离线部署 `Docker`
|
||||||
|
|
||||||
括号内的字母表示该操作需要在哪些服务器上执行
|
括号内的字母表示该操作需要在哪些服务器上执行
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### 3.6.1 概述
|
### 3.6.1 CentOS/Rocky/AlmaLinux 离线安装 Docker
|
||||||
|
|
||||||
### 3.6.2 CentOS/Rocky/AlmaLinux 离线安装 Docker
|
|
||||||
|
|
||||||
在无法连接外网的安全环境中,离线安装是唯一的选择。本节介绍如何在 RHEL 系发行版中进行离线安装。
|
在无法连接外网的安全环境中,离线安装是唯一的选择。本节介绍如何在 RHEL 系发行版中进行离线安装。
|
||||||
|
|
||||||
@@ -18,7 +14,7 @@
|
|||||||
|
|
||||||
#### YUM 本地文件安装 (推荐)
|
#### YUM 本地文件安装 (推荐)
|
||||||
|
|
||||||
推荐这种方式,是因为在生产环境种一般会选定某个指定的文档软件版本使用。
|
推荐这种方式,是因为在生产环境中一般会选定某个指定的文档软件版本使用。
|
||||||
|
|
||||||
##### 查询可用的软件版本
|
##### 查询可用的软件版本
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
### 3.7.1 系统要求
|
### 3.7.1 系统要求
|
||||||
|
|
||||||
[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS Sonora 14.0 或更高版本,建议升级到最新版本的 macOS。
|
[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS Sonoma 14.0 或更高版本,建议升级到最新版本的 macOS。
|
||||||
|
|
||||||
### 3.7.2 安装
|
### 3.7.2 安装
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ $ brew install --cask docker
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker --version
|
$ docker --version
|
||||||
Docker version 26.1.1, build 4cf5afa
|
Docker version 27.0.3, build 7d4bcd8
|
||||||
```
|
```
|
||||||
|
|
||||||
如果 `docker version`、`docker info` 都正常的话,可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/):
|
如果 `docker version`、`docker info` 都正常的话,可以尝试运行一个 [Nginx 服务器](https://hub.docker.com/_/nginx/):
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ Docker 支持在多种平台上安装和使用,选择合适的安装方式是
|
|||||||
| **Raspberry Pi** | 官方安装脚本 | 支持 ARM 架构 |
|
| **Raspberry Pi** | 官方安装脚本 | 支持 ARM 架构 |
|
||||||
| **离线环境** | 二进制包安装 | 适用于无法联网的服务器 |
|
| **离线环境** | 二进制包安装 | 适用于无法联网的服务器 |
|
||||||
|
|
||||||
### 3.11.1 安装后验证
|
### 安装后验证
|
||||||
|
|
||||||
安装完成后,运行以下命令验证 Docker 是否正常工作:
|
安装完成后,运行以下命令验证 Docker 是否正常工作:
|
||||||
|
|
||||||
@@ -20,7 +20,7 @@ $ docker version
|
|||||||
$ docker run --rm hello-world
|
$ docker run --rm hello-world
|
||||||
```
|
```
|
||||||
|
|
||||||
### 3.11.2 延伸阅读
|
### 延伸阅读
|
||||||
|
|
||||||
- [镜像加速器](3.9_mirror.md):解决国内拉取镜像慢的问题
|
- [镜像加速器](3.9_mirror.md):解决国内拉取镜像慢的问题
|
||||||
- [开启实验特性](3.10_experimental.md):使用最新功能
|
- [开启实验特性](3.10_experimental.md):使用最新功能
|
||||||
|
|||||||
@@ -171,9 +171,6 @@ root@e7009c6ce357:/# exit
|
|||||||
```bash
|
```bash
|
||||||
$ sudo systemctl restart docker # Linux
|
$ sudo systemctl restart docker # Linux
|
||||||
## 或在 Docker Desktop 中重启
|
## 或在 Docker Desktop 中重启
|
||||||
|
|
||||||
## 或在 Docker Desktop 中重启
|
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
详见[镜像加速器](../03_install/3.9_mirror.md)章节。
|
详见[镜像加速器](../03_install/3.9_mirror.md)章节。
|
||||||
|
|||||||
@@ -204,11 +204,10 @@ ubuntu latest ca2b0f26964c # 同一个镜像
|
|||||||
$ docker rmi ubuntu:24.04
|
$ docker rmi ubuntu:24.04
|
||||||
Untagged: ubuntu:24.04
|
Untagged: ubuntu:24.04
|
||||||
## 只是移除标签,镜像仍存在(因为还有 ubuntu:latest 指向它)
|
## 只是移除标签,镜像仍存在(因为还有 ubuntu:latest 指向它)
|
||||||
|
```
|
||||||
|
|
||||||
当同一个镜像有多个标签时,`docker rmi` 只是删除指定的标签,不会删除镜像本身。
|
当同一个镜像有多个标签时,`docker rmi` 只是删除指定的标签,不会删除镜像本身。
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 原因三:被其他镜像依赖 (中间层)
|
#### 原因三:被其他镜像依赖 (中间层)
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -120,9 +120,7 @@ docker run --name web2 -d -p 81:80 nginx:v2
|
|||||||
|
|
||||||
至此,我们第一次完成了定制镜像,使用的是 `docker commit` 命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储应该有了更直观的感觉。
|
至此,我们第一次完成了定制镜像,使用的是 `docker commit` 命令,手动操作给旧的镜像添加了新的一层,形成新的镜像,对镜像多层存储应该有了更直观的感觉。
|
||||||
|
|
||||||
### 4.4.1 概述
|
### 4.4.1 慎用 `docker commit`
|
||||||
|
|
||||||
### 4.4.2 慎用 `docker commit`
|
|
||||||
|
|
||||||
使用 `docker commit` 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
|
使用 `docker commit` 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ Dockerfile 是一个文本文件,其内包含了一条条的 **指令 (Instruc
|
|||||||
|
|
||||||
### 4.5.1 使用 docker init 快速创建 (推荐)
|
### 4.5.1 使用 docker init 快速创建 (推荐)
|
||||||
|
|
||||||
Docker 提供了 `docker init` 命令,可以根据项目类型自动生成 Dockerfile、。dockerignore 和 compose.yaml 文件:
|
Docker 提供了 `docker init` 命令,可以根据项目类型自动生成 Dockerfile、.dockerignore 和 compose.yaml 文件:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker init
|
$ docker init
|
||||||
|
|||||||
@@ -15,3 +15,8 @@ Docker 运行容器前需要本地存在对应的镜像,如果本地不存在
|
|||||||
* [使用 Dockerfile 定制镜像](4.5_build.md)
|
* [使用 Dockerfile 定制镜像](4.5_build.md)
|
||||||
* [其它制作镜像的方式](4.6_other.md)
|
* [其它制作镜像的方式](4.6_other.md)
|
||||||
* [镜像的实现原理](4.7_internal.md)
|
* [镜像的实现原理](4.7_internal.md)
|
||||||
|
|
||||||
|
> **版本提示:镜像存储后端的变迁**
|
||||||
|
>
|
||||||
|
> 在 Docker Engine v29 及后续版本中,Docker 全新安装默认启用了 **containerd image store**(替代了传统的 classic store)。这一底层架构级别的变迁,意味着 Docker 解锁了对 OCI Image Index 和 Attestations (例如原生的 provenance 来源证明与 SBOM 软件物料清单)的全量本地支持。
|
||||||
|
> 读者在执行类似 `docker buildx build --provenance=mode=min --sbom=true` 甚至使用后续审查工具(如 `docker buildx imagetools inspect`)时,其元数据能够与镜像数据一并完好地管理于本地存储系统中,为供应链安全验证补齐了最后一块拼图。
|
||||||
|
|||||||
@@ -1,21 +1,13 @@
|
|||||||
## 本章小结
|
## 本章小结
|
||||||
|
|
||||||
|
本章介绍了 Docker 镜像的获取、列出、删除以及构建方式。
|
||||||
|
|
||||||
| 操作 | 命令 |
|
| 操作 | 命令 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| 拉取镜像 | `docker pull 镜像名:标签` |
|
| 拉取镜像 | `docker pull 镜像名:标签` |
|
||||||
| 拉取所有标签 | `docker pull -a 镜像名` |
|
| 拉取所有标签 | `docker pull -a 镜像名` |
|
||||||
| 指定平台 | `docker pull --platform linux/amd64 镜像名` |
|
| 指定平台 | `docker pull --platform linux/amd64 镜像名` |
|
||||||
| 用摘要拉取 | `docker pull 镜像名@sha256:...` |
|
| 用摘要拉取 | `docker pull 镜像名@sha256:...` |
|
||||||
|
|
||||||
### 4.8.1 延伸阅读
|
|
||||||
|
|
||||||
- [列出镜像](4.2_list.md):查看本地镜像
|
|
||||||
- [删除镜像](4.3_rm.md):清理本地镜像
|
|
||||||
- [镜像加速器](../03_install/3.9_mirror.md):加速镜像下载
|
|
||||||
- [Docker Hub](../06_repository/6.1_dockerhub.md):官方镜像仓库
|
|
||||||
|
|
||||||
| 操作 | 命令 |
|
|
||||||
|------|------|
|
|
||||||
| 列出所有镜像 | `docker images` |
|
| 列出所有镜像 | `docker images` |
|
||||||
| 按仓库名过滤 | `docker images nginx` |
|
| 按仓库名过滤 | `docker images nginx` |
|
||||||
| 列出虚悬镜像 | `docker images -f dangling=true` |
|
| 列出虚悬镜像 | `docker images -f dangling=true` |
|
||||||
@@ -23,24 +15,19 @@
|
|||||||
| 显示摘要 | `docker images --digests` |
|
| 显示摘要 | `docker images --digests` |
|
||||||
| 自定义格式 | `docker images --format "..."` |
|
| 自定义格式 | `docker images --format "..."` |
|
||||||
| 查看空间占用 | `docker system df` |
|
| 查看空间占用 | `docker system df` |
|
||||||
|
|
||||||
### 4.8.2 延伸阅读
|
|
||||||
|
|
||||||
- [获取镜像](4.1_pull.md):从 Registry 拉取镜像
|
|
||||||
- [删除镜像](4.3_rm.md):清理本地镜像
|
|
||||||
- [镜像](../02_basic_concept/2.1_image.md):理解镜像概念
|
|
||||||
|
|
||||||
| 操作 | 命令 |
|
|
||||||
|------|------|
|
|
||||||
| 删除指定镜像 | `docker rmi 镜像名:标签` |
|
| 删除指定镜像 | `docker rmi 镜像名:标签` |
|
||||||
| 强制删除 | `docker rmi -f 镜像名` |
|
| 强制删除 | `docker rmi -f 镜像名` |
|
||||||
| 删除虚悬镜像 | `docker image prune` |
|
| 删除虚悬镜像 | `docker image prune` |
|
||||||
| 删除未使用镜像 | `docker image prune -a` |
|
| 删除未使用镜像 | `docker image prune -a` |
|
||||||
| 批量删除 | `docker rmi $(docker images -q -f ...)` |
|
| 批量删除 | `docker rmi $(docker images -q -f ...)` |
|
||||||
| 查看空间占用 | `docker system df` |
|
|
||||||
|
|
||||||
### 4.8.3 延伸阅读
|
### 延伸阅读
|
||||||
|
|
||||||
|
- [获取镜像](4.1_pull.md):从 Registry 拉取镜像
|
||||||
- [列出镜像](4.2_list.md):查看和过滤镜像
|
- [列出镜像](4.2_list.md):查看和过滤镜像
|
||||||
|
- [删除镜像](4.3_rm.md):清理本地镜像
|
||||||
|
- [镜像加速器](../03_install/3.9_mirror.md):加速镜像下载
|
||||||
|
- [Docker Hub](../06_repository/6.1_dockerhub.md):官方镜像仓库
|
||||||
|
- [镜像](../02_basic_concept/2.1_image.md):理解镜像概念
|
||||||
- [删除容器](../05_container/5.6_rm.md):清理容器
|
- [删除容器](../05_container/5.6_rm.md):清理容器
|
||||||
- [数据卷](../08_data/8.1_volume.md):清理数据卷
|
- [数据卷](../08_data/8.1_volume.md):清理数据卷
|
||||||
|
|||||||
@@ -1,55 +1,30 @@
|
|||||||
## 本章小结
|
## 本章小结
|
||||||
|
|
||||||
|
本章介绍了 Docker 容器的启动、停止、进入和删除等核心操作。
|
||||||
|
|
||||||
| 操作 | 命令 | 说明 |
|
| 操作 | 命令 | 说明 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| 新建并运行 | `docker run` | 最常用的启动方式 |
|
| 新建并运行 | `docker run` | 最常用的启动方式 |
|
||||||
| 交互式启动 | `docker run -it` | 用于调试或临时操作 |
|
| 交互式启动 | `docker run -it` | 用于调试或临时操作 |
|
||||||
| 后台运行 | `docker run -d` | 用于服务类应用 |
|
| 后台运行 | `docker run -d` | 用于服务类应用 |
|
||||||
| 启动已停止的容器 | `docker start` | 重用已有容器 |
|
| 启动已停止的容器 | `docker start` | 重用已有容器 |
|
||||||
|
| 优雅停止 | `docker stop` | 先 SIGTERM,超时后 SIGKILL |
|
||||||
|
| 强制停止 | `docker kill` | 直接 SIGKILL |
|
||||||
|
| 重启 | `docker restart` | 停止后立即启动 |
|
||||||
|
| 停止全部 | `docker stop $(docker ps -q)` | 停止所有运行中容器 |
|
||||||
|
| 进入容器调试 | `docker exec -it 容器名 bash` | 推荐方式 |
|
||||||
|
| 执行单条命令 | `docker exec 容器名 命令` | 不进入交互模式 |
|
||||||
|
| 查看主进程输出 | `docker attach 容器名` | 慎用,退出可能停止容器 |
|
||||||
|
| 删除已停止容器 | `docker rm 容器名` | 需先停止 |
|
||||||
|
| 强制删除运行中容器 | `docker rm -f 容器名` | 直接删除 |
|
||||||
|
| 删除容器及匿名卷 | `docker rm -v 容器名` | 同时清理匿名卷 |
|
||||||
|
| 清理所有已停止容器 | `docker container prune` | 批量清理 |
|
||||||
|
|
||||||
### 5.7.1 延伸阅读
|
### 延伸阅读
|
||||||
|
|
||||||
- [后台运行](5.2_daemon.md):理解 `-d` 参数和容器生命周期
|
- [后台运行](5.2_daemon.md):理解 `-d` 参数和容器生命周期
|
||||||
- [进入容器](5.4_attach_exec.md):操作运行中的容器
|
- [进入容器](5.4_attach_exec.md):操作运行中的容器
|
||||||
- [网络配置](../09_network/README.md):理解端口映射的原理
|
- [网络配置](../09_network/README.md):理解端口映射的原理
|
||||||
- [数据管理](../08_data/README.md):数据持久化方案
|
- [数据管理](../08_data/README.md):数据持久化方案
|
||||||
|
|
||||||
| 操作 | 命令 | 说明 |
|
|
||||||
|------|------|------|
|
|
||||||
| 优雅停止 | `docker stop` | 先 SIGTERM,超时后 SIGKILL |
|
|
||||||
| 强制停止 | `docker kill` | 直接 SIGKILL |
|
|
||||||
| 重新启动 | `docker start` | 启动已停止的容器 |
|
|
||||||
| 重启 | `docker restart` | 停止后立即启动 |
|
|
||||||
| 停止全部 | `docker stop $(docker ps -q)` | 停止所有运行中容器 |
|
|
||||||
|
|
||||||
### 5.7.2 延伸阅读
|
|
||||||
|
|
||||||
- [启动容器](../05_container/5.1_run.md):容器启动详解
|
|
||||||
- [删除容器](5.6_rm.md):清理容器
|
|
||||||
- [容器日志](5.2_daemon.md):排查停止原因
|
|
||||||
|
|
||||||
| 需求 | 推荐命令 |
|
|
||||||
|------|---------|
|
|
||||||
| 进入容器调试 | `docker exec -it 容器名 bash` |
|
|
||||||
| 执行单条命令 | `docker exec 容器名 命令` |
|
|
||||||
| 查看主进程输出 | `docker attach 容器名` (慎用)|
|
|
||||||
|
|
||||||
### 5.7.3 延伸阅读
|
|
||||||
|
|
||||||
- [后台运行](5.2_daemon.md):理解容器主进程
|
|
||||||
- [查看容器](5.1_run.md):列出和过滤容器
|
|
||||||
- [容器日志](5.2_daemon.md):查看容器输出
|
|
||||||
|
|
||||||
| 操作 | 命令 |
|
|
||||||
|------|------|
|
|
||||||
| 删除已停止容器 | `docker rm 容器名` |
|
|
||||||
| 强制删除运行中容器 | `docker rm -f 容器名` |
|
|
||||||
| 删除容器及匿名卷 | `docker rm -v 容器名` |
|
|
||||||
| 清理所有已停止容器 | `docker container prune` |
|
|
||||||
| 删除所有容器 | `docker rm -f $(docker ps -aq)` |
|
|
||||||
|
|
||||||
### 5.7.4 延伸阅读
|
|
||||||
|
|
||||||
- [终止容器](5.3_stop.md):优雅停止容器
|
|
||||||
- [删除镜像](../04_image/4.3_rm.md):清理镜像
|
- [删除镜像](../04_image/4.3_rm.md):清理镜像
|
||||||
- [数据卷](../08_data/8.1_volume.md):数据卷管理
|
- [数据卷](../08_data/8.1_volume.md):数据卷管理
|
||||||
|
|||||||
@@ -45,7 +45,8 @@ $ docker pull nginx:alpine
|
|||||||
|
|
||||||
```bash
|
```bash
|
||||||
$ docker login
|
$ docker login
|
||||||
## 输入用户名和密码
|
## 默认情况下,不带其它参数进行 docker login 会自动走 Device Code Web Flow (浏览器认证)
|
||||||
|
## 若在非交互 CI 环境中,推荐结合 --username 与 --password-stdin 参数使用
|
||||||
|
|
||||||
...
|
...
|
||||||
```
|
```
|
||||||
@@ -76,10 +77,18 @@ $ docker push username/myapp:v1
|
|||||||
| **免费账户** (已登录) | 每 6 小时 200 次请求 |
|
| **免费账户** (已登录) | 每 6 小时 200 次请求 |
|
||||||
| **Pro/Team 账户** | 无限制 |
|
| **Pro/Team 账户** | 无限制 |
|
||||||
|
|
||||||
> **提示**:如果在 CI/CD 环境中遇到 `toomanyrequests` 错误,建议:
|
#### 滥用限流 (Abuse Rate Limit)
|
||||||
> 1. 在 CI 中配置 `docker login`
|
|
||||||
> 2. 使用国内镜像加速器
|
除了上述针对特定账号拉取镜像数量的 Pull Rate Limit 之外,Docker Hub 对所有用户(包含已认证及付费用户)还实施了**滥用保护限流 (Abuse Rate Limiting)**。它是根据网络出口 IP (IPv4 或 IPv6 /64 子网) 计算整体请求频率,阈值动态触发(通常为每分钟数千级别请求)。
|
||||||
> 3. 搭建私有仓库代理
|
|
||||||
|
**两类的差异与排查方法**:
|
||||||
|
- **Pull Rate Limit**:针对拉取量达到上限。报错返回 `429 Too Many Requests`,并且 HTTP 返回体/CLI 错误提示中会带有明确的 `toomanyrequests: You have reached your pull rate limit` 提示,常附有账户升级链接。
|
||||||
|
- **Abuse Rate Limit**:防范接口频率打击。报错仅返回简化的 `429 Too Many Requests`。这一限流不分付费与否,常发生在“多终端共享出口 IP”的企业局域网或者第三方云 CI 服务(如 GitHub Actions 等)中,即使你已正常配置 `docker login` 也依旧可能触发。
|
||||||
|
|
||||||
|
> **提示**:如果在 CI/CD 等环境遇到 429 错误,建议:
|
||||||
|
> 1. 先甄别具体是哪类限流:普通的 pull rate limit 只要在 CI 中配置 `docker login` (并使用有效账号) 就能解除匿名限制。
|
||||||
|
> 2. 如果是 Abuse 频控导致,应考虑搭建私有仓库作为拉取缓存代理 (Registry pull-through cache),避免频繁直接请求官方 Hub。
|
||||||
|
> 3. 使用国内镜像加速器。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
## 本章小结
|
## 本章小结
|
||||||
|
|
||||||
|
本章介绍了 Docker Hub 的使用、私有仓库的搭建以及 Nexus 3 等企业级方案。
|
||||||
|
|
||||||
| 功能 | 说明 |
|
| 功能 | 说明 |
|
||||||
|------|------|
|
|------|------|
|
||||||
| **官方镜像** | 优先使用的基础镜像 |
|
| **官方镜像** | 优先使用的基础镜像 |
|
||||||
@@ -7,9 +9,7 @@
|
|||||||
| **安全** | 推荐开启 2FA 并使用 Access Token |
|
| **安全** | 推荐开启 2FA 并使用 Access Token |
|
||||||
| **自动化** | 支持 Webhooks 和自动构建 |
|
| **自动化** | 支持 Webhooks 和自动构建 |
|
||||||
|
|
||||||
### 6.5.1 概述
|
### 延伸阅读
|
||||||
|
|
||||||
### 6.5.2 延伸阅读
|
|
||||||
|
|
||||||
- [私有仓库](6.2_registry.md):搭建自己的 Registry
|
- [私有仓库](6.2_registry.md):搭建自己的 Registry
|
||||||
- [镜像加速器](../03_install/3.9_mirror.md):加速下载
|
- [镜像加速器](../03_install/3.9_mirror.md):加速下载
|
||||||
|
|||||||
@@ -1,208 +1,30 @@
|
|||||||
## 本章小结
|
## 本章小结
|
||||||
|
|
||||||
| 要点 | 说明 |
|
本章详细介绍了 Dockerfile 的所有核心指令,以下是各指令要点的速查表。
|
||||||
|------|------|
|
|
||||||
| **作用** | 设置后续指令的工作目录 |
|
|
||||||
| **语法** | `WORKDIR /path` |
|
|
||||||
| **自动创建** | 目录不存在会自动创建 |
|
|
||||||
| **持久性** | 影响后续所有指令,直到下次 WORKDIR |
|
|
||||||
| **不要用** | `RUN cd /path` (无效)|
|
|
||||||
|
|
||||||
### 7.19.1 延伸阅读
|
| 指令 | 作用 | 关键要点 |
|
||||||
|
|------|------|---------|
|
||||||
|
| **FROM** | 指定基础镜像 | 必须是第一条指令 |
|
||||||
|
| **RUN** | 在新层执行命令 | 合并命令、清理缓存以减小体积 |
|
||||||
|
| **COPY** | 复制文件 | 优先使用,支持 `--from` |
|
||||||
|
| **ADD** | 更高级的复制 | 自动解压 tar,不推荐用于下载 |
|
||||||
|
| **CMD** | 容器启动默认命令 | 可被 `docker run` 参数覆盖 |
|
||||||
|
| **ENTRYPOINT** | 容器入口点 | 固定启动命令,CMD 作为默认参数 |
|
||||||
|
| **ENV** | 设置环境变量 | 构建时 + 运行时均生效 |
|
||||||
|
| **ARG** | 构建参数 | 仅构建时生效,FROM 后需重新声明 |
|
||||||
|
| **VOLUME** | 定义匿名卷 | VOLUME 之后的修改会丢失 |
|
||||||
|
| **EXPOSE** | 声明端口 | 仅文档作用,不自动映射 |
|
||||||
|
| **WORKDIR** | 指定工作目录 | 替代 `RUN cd`,目录不存在会自动创建 |
|
||||||
|
| **USER** | 指定运行用户 | 用户必须已存在,推荐 gosu |
|
||||||
|
| **HEALTHCHECK** | 健康检查 | 支持 starting/healthy/unhealthy 状态 |
|
||||||
|
| **ONBUILD** | 延迟执行指令 | 只继承一次,不可级联 |
|
||||||
|
| **LABEL** | 添加元数据 | 推荐 OCI 标准标签,替代 MAINTAINER |
|
||||||
|
| **SHELL** | 更改默认 shell | 推荐 `["/bin/bash", "-o", "pipefail", "-c"]` |
|
||||||
|
|
||||||
- [COPY 复制文件](7.2_copy.md):文件复制
|
### 延伸阅读
|
||||||
- [RUN 执行命令](../04_image/4.5_build.md):执行构建命令
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
- [使用 Dockerfile 定制镜像](../04_image/4.5_build.md):Dockerfile 入门
|
||||||
|------|------|
|
|
||||||
| **作用** | 切换后续指令的执行用户 |
|
|
||||||
| **语法** | `USER username` 或 `USER UID:GID` |
|
|
||||||
| **前提** | 用户必须已存在 |
|
|
||||||
| **运行时覆盖** | `docker run -u` |
|
|
||||||
| **切换工具** | 使用 gosu,不用 su/sudo |
|
|
||||||
|
|
||||||
### 7.19.2 延伸阅读
|
|
||||||
|
|
||||||
- [安全](../18_security/README.md):容器安全实践
|
|
||||||
- [ENTRYPOINT](7.5_entrypoint.md):入口脚本中的用户切换
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 安全
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 检测容器应用是否真实可用 |
|
|
||||||
| **命令** | `HEALTHCHECK [选项] CMD command` |
|
|
||||||
| **状态** | starting, healthy, unhealthy |
|
|
||||||
| **Compose** | 支持 `condition: service_healthy` 依赖 |
|
|
||||||
| **注意** | 避免副作用,节省资源 |
|
|
||||||
|
|
||||||
### 7.19.3 延伸阅读
|
|
||||||
|
|
||||||
- [CMD 容器启动命令](7.4_cmd.md):启动主进程
|
|
||||||
- [Compose 模板文件](../11_compose/11.5_compose_file.md):Compose 中的健康检查
|
|
||||||
- [Docker 调试](../appendix/debug.md):容器排障
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 定义在子镜像构建时执行的指令 |
|
|
||||||
| **语法** | `ONBUILD INSTRUCTION` |
|
|
||||||
| **适用** | 基础架构镜像 (Node, Python, Go 等)|
|
|
||||||
| **限制** | 只继承一次,不可级联 |
|
|
||||||
| **规范** | 建议使用 `-onbuild` 标签后缀 |
|
|
||||||
|
|
||||||
### 7.19.4 延伸阅读
|
|
||||||
|
|
||||||
- [COPY 指令](7.2_copy.md):文件复制
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md):基础镜像设计
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 添加 key-value 元数据 |
|
|
||||||
| **语法** | `LABEL k=v k=v ...` |
|
|
||||||
| **规范** | 推荐使用 OCI 标准标签 |
|
|
||||||
| **弃用** | 不要再使用 `MAINTAINER` |
|
|
||||||
| **查看** | `docker inspect` |
|
|
||||||
|
|
||||||
### 7.19.5 延伸阅读
|
|
||||||
|
|
||||||
- [OCI 标签规范](https://github.com/opencontainers/image-spec/blob/main/annotations.md)
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md)
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 更改 RUN/CMD/ENTRYPOINT 的默认 shell |
|
|
||||||
| **Linux 默认** | `["/bin/sh", "-c"]` |
|
|
||||||
| **Windows 默认** | `["cmd", "/S", "/C"]` |
|
|
||||||
| **推荐用法** | `SHELL ["/bin/bash", "-o", "pipefail", "-c"]` |
|
|
||||||
| **影响范围** | 后续所有使用 shell 格式的指令 |
|
|
||||||
|
|
||||||
### 7.19.6 延伸阅读
|
|
||||||
|
|
||||||
- [RUN 指令](../04_image/4.5_build.md):执行命令
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md):错误处理与调试
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 在新层执行命令 |
|
|
||||||
| **原则** | 合并命令,清理缓存 |
|
|
||||||
| **格式** | Shell (常用) vs Exec |
|
|
||||||
| **陷阱** | `cd` 不持久,环境变量不持久 |
|
|
||||||
| **进阶** | 使用 Cache Mount 加速构建 |
|
|
||||||
|
|
||||||
### 7.19.7 延伸阅读
|
|
||||||
|
|
||||||
- [CMD 容器启动命令](7.4_cmd.md):容器启动时的命令
|
|
||||||
- [WORKDIR 指定工作目录](7.10_workdir.md):改变目录
|
|
||||||
- [Dockerfile 最佳实践](../appendix/best_practices.md)
|
|
||||||
|
|
||||||
| 操作 | 示例 |
|
|
||||||
|------|------|
|
|
||||||
| 复制文件 | `COPY app.js /app/` |
|
|
||||||
| 复制多个文件 | `COPY *.json /app/` |
|
|
||||||
| 复制目录内容 | `COPY src/ /app/src/` |
|
|
||||||
| 修改所有者 | `COPY --chown=node:node . /app/` |
|
|
||||||
| 从构建阶段复制 | `COPY --from=builder /app/dist ./` |
|
|
||||||
|
|
||||||
### 7.19.8 延伸阅读
|
|
||||||
|
|
||||||
- [ADD 指令](7.3_add.md):复制和解压
|
|
||||||
- [WORKDIR 指令](7.10_workdir.md):设置工作目录
|
|
||||||
- [多阶段构建](7.17_multistage_builds.md):优化镜像大小
|
- [多阶段构建](7.17_multistage_builds.md):优化镜像大小
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
- [Dockerfile 最佳实践](../appendix/best_practices.md):编写指南
|
||||||
|
- [安全](../18_security/README.md):容器安全实践
|
||||||
| 场景 | 推荐指令 |
|
- [Compose 模板文件](../11_compose/11.5_compose_file.md):Compose 中的配置
|
||||||
|------|---------|
|
|
||||||
| 复制普通文件 | `COPY` |
|
|
||||||
| 复制目录 | `COPY` |
|
|
||||||
| 自动解压 tar | `ADD` |
|
|
||||||
| 从 URL 下载 | `RUN curl` |
|
|
||||||
| 保持 tar 不解压 | `COPY` |
|
|
||||||
|
|
||||||
### 7.19.9 延伸阅读
|
|
||||||
|
|
||||||
- [COPY 复制文件](7.2_copy.md):基本复制操作
|
|
||||||
- [多阶段构建](7.17_multistage_builds.md):减少镜像体积
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 指定容器启动时的默认命令 |
|
|
||||||
| **推荐格式** | exec 格式 `CMD [“程序”, “参数”]` |
|
|
||||||
| **覆盖方式** | `docker run image 新命令` |
|
|
||||||
| **与 ENTRYPOINT** | CMD 作为 ENTRYPOINT 的默认参数 |
|
|
||||||
| **核心原则** | 应用必须在前台运行 |
|
|
||||||
|
|
||||||
### 7.19.10 延伸阅读
|
|
||||||
|
|
||||||
- [ENTRYPOINT 入口点](7.5_entrypoint.md):固定的启动命令
|
|
||||||
- [后台运行](../05_container/5.2_daemon.md):容器前台/后台概念
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| ENTRYPOINT | CMD | 适用场景 |
|
|
||||||
|------------|-----|---------|
|
|
||||||
| ✓ | ✗ | 镜像作为固定命令使用 |
|
|
||||||
| ✗ | ✓ | 简单的默认命令 |
|
|
||||||
| ✓ | ✓ | **推荐**:固定命令 + 可配置参数 |
|
|
||||||
|
|
||||||
### 7.19.11 延伸阅读
|
|
||||||
|
|
||||||
- [CMD 容器启动命令](7.4_cmd.md):默认命令
|
|
||||||
- [最佳实践](../appendix/best_practices.md):启动命令设计
|
|
||||||
- [后台运行](../05_container/5.2_daemon.md):前台/后台概念
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **语法** | `ENV KEY=value` |
|
|
||||||
| **作用范围** | 构建时 + 运行时 |
|
|
||||||
| **覆盖方式** | `docker run -e KEY=value` |
|
|
||||||
| **与 ARG** | ARG 仅构建时,ENV 持久化到运行时 |
|
|
||||||
| **安全** | 不要存储敏感信息 |
|
|
||||||
|
|
||||||
### 7.19.12 延伸阅读
|
|
||||||
|
|
||||||
- [ARG 构建参数](7.7_arg.md):构建时变量
|
|
||||||
- [Compose 环境变量](../11_compose/11.5_compose_file.md):Compose 中的环境变量
|
|
||||||
- [最佳实践](../appendix/best_practices.md):Dockerfile 编写指南
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 定义构建时变量 |
|
|
||||||
| **语法** | `ARG NAME=value` |
|
|
||||||
| **覆盖** | `docker build --build-arg NAME=value` |
|
|
||||||
| **作用域** | FROM 之后需要重新声明 |
|
|
||||||
| **vs ENV** | ARG 仅构建时,ENV 构建+运行时 |
|
|
||||||
| **安全** | 不要存储敏感信息 |
|
|
||||||
|
|
||||||
### 7.19.13 延伸阅读
|
|
||||||
|
|
||||||
- [ENV 设置环境变量](7.6_env.md):运行时环境变量
|
|
||||||
- [FROM 指令](../04_image/4.5_build.md):基础镜像指定
|
|
||||||
- [多阶段构建](7.17_multistage_builds.md):复杂构建场景
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 创建挂载点,标记为外部卷 |
|
|
||||||
| **语法** | `VOLUME /path` |
|
|
||||||
| **默认行为** | 自动创建匿名卷 |
|
|
||||||
| **覆盖方式** | `docker run -v name:/path` |
|
|
||||||
| **注意** | VOLUME 之后的修改会丢失 |
|
|
||||||
|
|
||||||
### 7.19.14 延伸阅读
|
|
||||||
|
|
||||||
- [数据卷](../08_data/8.1_volume.md):卷的管理和使用
|
|
||||||
- [挂载主机目录](../08_data/8.2_bind-mounts.md):Bind Mount
|
|
||||||
- [Compose 数据管理](../11_compose/11.5_compose_file.md):Compose 中的卷配置
|
|
||||||
|
|
||||||
| 要点 | 说明 |
|
|
||||||
|------|------|
|
|
||||||
| **作用** | 声明容器提供服务的端口 (文档)|
|
|
||||||
| **不会** | 自动映射端口或开放外部访问 |
|
|
||||||
| **配合** | `docker run -P` 自动映射 |
|
|
||||||
| **外部访问** | 需要 `-p 宿主机端口:容器端口` |
|
|
||||||
| **语法** | `EXPOSE 80` 或 `EXPOSE 80/tcp` |
|
|
||||||
|
|
||||||
### 7.19.15 延伸阅读
|
|
||||||
|
|
||||||
- [网络配置](../09_network/README.md):Docker 网络详解
|
|
||||||
- [端口映射](../09_network/9.5_port_mapping.md):-p 参数详解
|
|
||||||
- [Compose 端口](../11_compose/11.5_compose_file.md):Compose 中的端口配置
|
|
||||||
|
|||||||
@@ -138,10 +138,11 @@ $ docker run -d \
|
|||||||
| 特性 | --mount | -v |
|
| 特性 | --mount | -v |
|
||||||
|------|---------|-----|
|
|------|---------|-----|
|
||||||
| 语法 | 键值对,更清晰 | 冒号分隔,更简洁 |
|
| 语法 | 键值对,更清晰 | 冒号分隔,更简洁 |
|
||||||
| 自动创建卷 | source 不存在会自动创建 | 自动创建 |
|
| **数据卷 (Volume)** 挂载行为 | 卷不存在会自动创建,与 `-v` 结果一致 | 卷不存在会自动创建 |
|
||||||
| 推荐程度 | ✅ 推荐 (更明确)| 常用 (更简洁)|
|
| **绑定挂载 (Bind Mount)** 行为 | ⭐ **宿主机路径不存在会报错**,不会自动创建 | 宿主机路径不存在会**自动创建为目录** |
|
||||||
|
| 推荐程度 | ✅ 推荐 (更明确安全,避免误创建)| 常用 (更简洁)|
|
||||||
|
|
||||||
> **提示**:很多人误以为 `--mount` 遇到目标不存在时总是报错。实际上,那仅适用于**绑定挂载 (Bind Mount)**。对于**数据卷 (Volume)**,只要 `source` 指定的卷名称不存在,Docker 都会默默将其创建出来。
|
> **提示**:官方更推荐使用 `--mount`。除了语法格式可读性更好之外,最重要的行为差异发生在 **绑定挂载 (Bind Mount)** 时:如果挂载的宿主机源路径尚未存在,`-v` 会擅自将其自动创建为一个空目录;而 `--mount` 则会严格检查并直接报错。这能有效避免因路径拼写错误而在宿主机上留下垃圾目录(以及导致的容器访问空目录问题)。而对于本节的**数据卷 (Volume)** 挂载而言,两者在目标指定的卷不存在时皆会自动创建卷,产生的结果是**完全一致**的。
|
||||||
|
|
||||||
#### 只读挂载
|
#### 只读挂载
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,12 @@
|
|||||||
## 本章小结
|
## 本章小结
|
||||||
|
|
||||||
| 要点 | 说明 |
|
本章介绍了 Docker 的三种数据管理方式:数据卷 (Volume)、绑定挂载 (Bind Mount) 和 tmpfs 挂载。
|
||||||
|------|------|
|
|
||||||
| **作用** | 将宿主机目录挂载到容器 |
|
|
||||||
| **语法** | `-v /宿主机:/容器` 或 `--mount type=bind,...` |
|
|
||||||
| **只读** | 添加 `readonly` 或 `:ro` |
|
|
||||||
| **适用场景** | 开发环境、配置文件、日志 |
|
|
||||||
| **vs Volume** | Bind 更灵活,Volume 更适合生产 |
|
|
||||||
|
|
||||||
### 8.4.1 延伸阅读
|
| 方式 | 特点 | 适用场景 |
|
||||||
|
|------|------|---------|
|
||||||
- [数据卷](8.1_volume.md):Docker 管理的持久化存储
|
| **数据卷 (Volume)** | Docker 管理,生命周期独立于容器 | 数据库、应用数据(推荐生产环境) |
|
||||||
- [tmpfs 挂载](8.3_tmpfs.md):内存临时存储
|
| **绑定挂载 (Bind Mount)** | 挂载宿主机目录,更灵活 | 开发环境、配置文件、日志 |
|
||||||
- [Compose 数据管理](../11_compose/11.5_compose_file.md):Compose 中的挂载配置
|
| **tmpfs 挂载** | 仅存储在内存中,容器停止即消失 | 临时敏感数据、高速缓存 |
|
||||||
|
|
||||||
| 操作 | 命令 |
|
| 操作 | 命令 |
|
||||||
|------|------|
|
|------|------|
|
||||||
@@ -23,8 +17,10 @@
|
|||||||
| 清理未用 | `docker volume prune` |
|
| 清理未用 | `docker volume prune` |
|
||||||
| 挂载数据卷 | `-v name:/path` 或 `--mount source=name,target=/path` |
|
| 挂载数据卷 | `-v name:/path` 或 `--mount source=name,target=/path` |
|
||||||
|
|
||||||
### 8.4.2 延伸阅读
|
### 延伸阅读
|
||||||
|
|
||||||
|
- [数据卷](8.1_volume.md):Docker 管理的持久化存储
|
||||||
- [绑定挂载](8.2_bind-mounts.md):挂载宿主机目录
|
- [绑定挂载](8.2_bind-mounts.md):挂载宿主机目录
|
||||||
- [tmpfs 挂载](8.3_tmpfs.md):内存中的临时存储
|
- [tmpfs 挂载](8.3_tmpfs.md):内存中的临时存储
|
||||||
- [存储驱动](../12_implementation/12.4_ufs.md):Docker 存储的底层原理
|
- [存储驱动](../12_implementation/12.4_ufs.md):Docker 存储的底层原理
|
||||||
|
- [Compose 数据管理](../11_compose/11.5_compose_file.md):Compose 中的挂载配置
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://docs.docker.com/engine/release-notes/) [][1]
|
[](https://github.com/yeasy/docker_practice) [](https://github.com/yeasy/docker_practice/releases) [](https://docs.docker.com/engine/release-notes/) [][1]
|
||||||
|
|
||||||
**v1.6.1**
|
**v1.6.2**
|
||||||
|
|
||||||
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker,可以让应用的部署、测试和分发都变得前所未有的高效和轻松!
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user