5 Commits

Author SHA1 Message Date
Baohua Yang
3af007b176 Use more accurate words 2026-03-02 21:58:39 -08:00
Baohua Yang
551dcfd2cb Refine content 2026-03-02 21:57:32 -08:00
Baohua Yang
0d2654fbf2 Update content 2026-03-02 21:56:46 -08:00
Baohua Yang
3894ba56bc Fix format 2026-03-02 21:55:31 -08:00
Baohua Yang
0dd0d036a2 Update and fix format 2026-03-02 21:54:37 -08:00
17 changed files with 91 additions and 307 deletions

View File

@@ -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

View File

@@ -1,16 +1,12 @@
## 3.6 Linux 离线安装 ## 3.6 Linux 离线安装
\[TOC]
生产环境中一般都是没有公网资源的本文介绍如何在生产服务器上离线部署 `Docker` 生产环境中一般都是没有公网资源的本文介绍如何在生产服务器上离线部署 `Docker`
括号内的字母表示该操作需要在哪些服务器上执行 括号内的字母表示该操作需要在哪些服务器上执行
![Docker-offile-install-top](../_images/image-20200412202617411.png) ![Docker-offile-install-top](../_images/image-20200412202617411.png)
### 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 本地文件安装 (推荐)
推荐这种方式是因为在生产环境一般会选定某个指定的文档软件版本使用 推荐这种方式是因为在生产环境一般会选定某个指定的文档软件版本使用
##### 查询可用的软件版本 ##### 查询可用的软件版本

View File

@@ -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/)

View File

@@ -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)使用最新功能

View File

@@ -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)章节

View File

@@ -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

View File

@@ -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` 命令虽然可以比较直观的帮助理解镜像分层存储的概念但是实际环境中并不会这样使用

View File

@@ -6,7 +6,7 @@ Dockerfile 是一个文本文件,其内包含了一条条的 **指令 (Instruc
### 4.5.1 使用 docker init 快速创建 (推荐) ### 4.5.1 使用 docker init 快速创建 (推荐)
Docker 提供了 `docker init` 命令可以根据项目类型自动生成 Dockerfiledockerignore compose.yaml 文件 Docker 提供了 `docker init` 命令可以根据项目类型自动生成 Dockerfile.dockerignore compose.yaml 文件
```bash ```bash
$ docker init $ docker init

View File

@@ -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`其元数据能够与镜像数据一并完好地管理于本地存储系统中为供应链安全验证补齐了最后一块拼图

View File

@@ -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)清理数据卷

View File

@@ -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)数据卷管理

View File

@@ -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. 使用国内镜像加速器
--- ---

View File

@@ -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)加速下载

View File

@@ -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 中的端口配置

View File

@@ -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)** 挂载而言两者在目标指定的卷不存在时皆会自动创建卷产生的结果是**完全一致**
#### 只读挂载 #### 只读挂载

View File

@@ -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 中的挂载配置

View File

@@ -2,7 +2,7 @@
[![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![图](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![图](https://img.shields.io/badge/Based-Docker%20Engine%20v29.x-blue.svg)](https://docs.docker.com/engine/release-notes/) [![图](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1] [![](https://img.shields.io/github/stars/yeasy/docker_practice.svg?style=social&label=Stars)](https://github.com/yeasy/docker_practice) [![图](https://img.shields.io/github/release/yeasy/docker_practice/all.svg)](https://github.com/yeasy/docker_practice/releases) [![图](https://img.shields.io/badge/Based-Docker%20Engine%20v29.x-blue.svg)](https://docs.docker.com/engine/release-notes/) [![图](https://img.shields.io/badge/Docker%20%E6%8A%80%E6%9C%AF%E5%85%A5%E9%97%A8%E4%B8%8E%E5%AE%9E%E6%88%98-jd.com-red.svg)][1]
**v1.6.1** **v1.6.2**
[Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松 [Docker](https://www.docker.com) 是个划时代的开源项目,它彻底释放了计算虚拟化的威力,极大提高了应用的维护效率,降低了云计算应用开发的成本!使用 Docker可以让应用的部署、测试和分发都变得前所未有的高效和轻松