mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-13 13:21:18 +00:00
Simplify words and fix format issues
This commit is contained in:
24
.github/CODEOWNERS
vendored
24
.github/CODEOWNERS
vendored
@@ -9,15 +9,21 @@
|
||||
/05_container/* @yeasy @khs1994
|
||||
/06_repository/* @khs1994
|
||||
/07_dockerfile/* @yeasy @khs1994
|
||||
/08_data_network/* @yeasy @khs1994
|
||||
/09_buildx/* @khs1994
|
||||
/10_compose/* @yeasy @khs1994
|
||||
/11_ops/* @yeasy @khs1994
|
||||
/12_orchestration/* @yeasy @khs1994
|
||||
/13_ecosystem/* @khs1994
|
||||
/14_implementation/* @yeasy @khs1994
|
||||
/15_cases/* @yeasy @khs1994
|
||||
/16_appendix/* @yeasy @khs1994
|
||||
/08_data/* @yeasy @khs1994
|
||||
/09_network/* @yeasy @khs1994
|
||||
/10_buildx/* @khs1994
|
||||
/11_compose/* @yeasy @khs1994
|
||||
/12_implementation/* @yeasy @khs1994
|
||||
/13_kubernetes_concepts/* @yeasy @khs1994
|
||||
/14_kubernetes_setup/* @yeasy @khs1994
|
||||
/15_etcd/* @yeasy @khs1994
|
||||
/16_cloud/* @khs1994
|
||||
/17_ecosystem/* @khs1994
|
||||
/18_security/* @yeasy @khs1994
|
||||
/19_observability/* @yeasy @khs1994
|
||||
/20_cases_os/* @yeasy @khs1994
|
||||
/21_case_devops/* @yeasy @khs1994
|
||||
/appendix/* @yeasy @khs1994
|
||||
/.drone.yml @khs1994
|
||||
/.editorconfig/ @khs1994
|
||||
/.gitattributes @khs1994
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
5
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
@@ -36,9 +36,4 @@ about: Create a report to help us improve
|
||||
<!--describe problem with detailed steps and logs-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--提交问题之前请点击预览标签,符合要求之后再提交问题-->
|
||||
|
||||
5
.github/ISSUE_TEMPLATE/Custom.md
vendored
5
.github/ISSUE_TEMPLATE/Custom.md
vendored
@@ -36,9 +36,4 @@ about: Create a issue about Docker
|
||||
<!--describe problem with detailed steps and logs-->
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<!--提交问题之前请点击预览标签,符合要求之后再提交问题-->
|
||||
|
||||
20
.github/workflows/ci.yaml
vendored
20
.github/workflows/ci.yaml
vendored
@@ -82,25 +82,15 @@ jobs:
|
||||
|
||||
cp -r _images .vuepress/dist
|
||||
mkdir -p .vuepress/dist/appendix
|
||||
cp -r 16_appendix/_images .vuepress/dist/appendix
|
||||
mkdir -p .vuepress/dist/cases/ci/drone
|
||||
cp -r 15_cases/ci/drone/_images .vuepress/dist/cases/ci/drone
|
||||
mkdir -p .vuepress/dist/cases/os
|
||||
cp -r 15_cases/os/_images .vuepress/dist/cases/os
|
||||
cp -r appendix/_images .vuepress/dist/appendix
|
||||
mkdir -p .vuepress/dist/cloud
|
||||
cp -r 13_ecosystem/cloud/_images .vuepress/dist/cloud
|
||||
cp -r 16_cloud/_images .vuepress/dist/cloud
|
||||
mkdir -p .vuepress/dist/data_management
|
||||
cp -r 08_data_network/data/_images .vuepress/dist/data_management
|
||||
cp -r 08_data/_images .vuepress/dist/data_management
|
||||
mkdir -p .vuepress/dist/etcd
|
||||
cp -r 12_orchestration/etcd/_images .vuepress/dist/etcd
|
||||
mkdir -p .vuepress/dist/image
|
||||
cp -r 04_image/_images .vuepress/dist/image
|
||||
mkdir -p .vuepress/dist/install
|
||||
cp -r 03_install/_images .vuepress/dist/install
|
||||
cp -r 15_etcd/_images .vuepress/dist/etcd
|
||||
mkdir -p .vuepress/dist/kubernetes
|
||||
cp -r 12_orchestration/kubernetes/_images .vuepress/dist/kubernetes
|
||||
mkdir -p .vuepress/dist/underly
|
||||
cp -r 14_implementation/_images .vuepress/dist/underly
|
||||
cp -r 13_kubernetes_concepts/_images .vuepress/dist/kubernetes
|
||||
|
||||
echo "include: [_images]" > .vuepress/dist/_config.yml
|
||||
- name: Upload Vuepress dist
|
||||
|
||||
@@ -60,8 +60,6 @@ flowchart LR
|
||||
|
||||
#### 关键区别
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | Docker 容器 | 传统虚拟机 |
|
||||
|------|-------------|------------|
|
||||
| **启动速度** | 秒级 | 分钟级 |
|
||||
@@ -82,10 +80,6 @@ Docker 使用 [Go 语言](https://golang.google.cn/)开发,基于 Linux 内核
|
||||
|
||||
> 如果你对这些底层技术感兴趣,可以阅读本书的[底层实现](../12_implementation/README.md)章节。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### Docker 架构演进
|
||||
|
||||
Docker 的底层实现经历了多次演进:
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
|
||||
#### 场景一:“在我电脑上明明能跑”
|
||||
|
||||
具体内容如下:
|
||||
|
||||
```bash
|
||||
周五下午 5:00
|
||||
├── 开发者:代码写完了,本地测试通过,提交!🎉
|
||||
@@ -28,8 +26,6 @@
|
||||
|
||||
#### 场景二:环境配置的噩梦
|
||||
|
||||
具体内容如下:
|
||||
|
||||
```bash
|
||||
新同事入职
|
||||
├── Day 1:领电脑,配环境
|
||||
@@ -41,8 +37,6 @@
|
||||
|
||||
#### 场景三:服务器迁移的恐惧
|
||||
|
||||
具体内容如下:
|
||||
|
||||
```bash
|
||||
运维:"我们需要把服务迁移到新服务器"
|
||||
开发:"旧服务器上的配置文档在哪?"
|
||||
@@ -54,14 +48,8 @@
|
||||
|
||||
Docker 的出现为上述问题提供了完美的解决方案。它通过 “一次构建,到处运行” 的核心理念,从根本上改变了软件交付的方式。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 核心理念:一次构建,到处运行
|
||||
|
||||
具体内容如下:
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
dev["开发团队"] -->|创建| img["Docker 镜像"]
|
||||
@@ -158,7 +146,7 @@ flowchart LR
|
||||
|
||||
- 构建过程 **可重复、可追溯**
|
||||
- 任何人都能从代码重建完全相同的镜像
|
||||
- 配合 [GitHub Actions](../20_cases/ci/actions/README.md) 等 CI 系统实现自动化
|
||||
- 配合 [GitHub Actions](../21_case_devops/21.2_github_actions.md) 等 CI 系统实现自动化
|
||||
|
||||
#### 5. 轻松迁移
|
||||
|
||||
|
||||
@@ -39,7 +39,9 @@ Docker 镜像是一个特殊的文件系统,包含:
|
||||
| **库文件** | libc、OpenSSL、各种依赖库 |
|
||||
| **配置文件** | nginx.conf、my.cnf 等 |
|
||||
| **环境变量** | PATH、LANG 等预设值 |
|
||||
| **元数据**| 启动命令、暴露端口、数据卷定义 |**关键特性**:
|
||||
| **元数据** | 启动命令、暴露端口、数据卷定义 |
|
||||
|
||||
**关键特性**:
|
||||
- ✅ 镜像是 **只读** 的
|
||||
- ✅ 镜像 **不包含** 动态数据
|
||||
- ✅ 镜像构建后 **内容不会改变**
|
||||
@@ -140,8 +142,6 @@ RUN apt-get update && \
|
||||
|
||||
#### 查看镜像的分层
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看镜像的历史(每层的构建记录)
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
|
||||
### 2.2.2 容器的本质
|
||||
|
||||
> 💡 **笔者认为,理解这一点是理解 Docker 的关键****容器的本质是一个特殊的进程。**
|
||||
> 💡 **笔者认为,理解这一点是理解 Docker 的关键:** **容器的本质是一个特殊的进程。**
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
@@ -166,14 +166,8 @@ stateDiagram-v2
|
||||
|
||||
图 2-1 容器生命周期状态流转图
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 常用生命周期命令
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 创建并启动容器(最常用)
|
||||
|
||||
|
||||
@@ -210,8 +210,6 @@ $ docker pull localhost:5000/myapp:v1.0
|
||||
|
||||
#### 常用命令
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 登录 Registry
|
||||
|
||||
@@ -279,8 +277,6 @@ $ cosign verify --key cosign.pub $IMAGE
|
||||
|
||||
#### 漏洞扫描
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用 Docker Scout 扫描镜像漏洞
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 第二章基本概念
|
||||
# 第二章 基本概念
|
||||
|
||||
**Docker** 包括三个基本概念:
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 2.4 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 概念 | 要点 |
|
||||
|------|------|
|
||||
| **镜像是什么** | 只读的应用模板,包含运行所需的一切 |
|
||||
|
||||
@@ -86,10 +86,6 @@ $ echo \
|
||||
|
||||
>以上命令会添加稳定版本的 Docker APT 镜像源,如果需要测试版本的 Docker 请将 stable 改为 test。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 安装 Docker
|
||||
|
||||
更新 apt 软件包缓存,并安装 `docker-ce`:
|
||||
@@ -119,8 +115,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
|
||||
|
||||
### 3.1.4 启动 Docker
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ sudo systemctl enable docker
|
||||
$ sudo systemctl start docker
|
||||
@@ -146,8 +140,6 @@ $ sudo usermod -aG docker $USER
|
||||
|
||||
### 3.1.6 测试 Docker 是否安装正确
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run --rm hello-world
|
||||
|
||||
|
||||
@@ -77,10 +77,6 @@ $ echo \
|
||||
|
||||
>以上命令会添加稳定版本的 Docker APT 源,如果需要测试版本的 Docker 请将 stable 改为 test。Debian11 可能不使用 `/etc/apt/keyrings/`,如 gpg 错误可以考虑更换为 `/etc/apt/trusted.gpg.d`,见 [issue 15727](https://github.com/docker/docs/issues/15727)。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 安装 Docker
|
||||
|
||||
更新 apt 软件包缓存,并安装 `docker-ce`。
|
||||
@@ -110,8 +106,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
|
||||
|
||||
### 3.2.4 启动 Docker
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ sudo systemctl enable docker
|
||||
$ sudo systemctl start docker
|
||||
@@ -137,8 +131,6 @@ $ sudo usermod -aG docker $USER
|
||||
|
||||
### 3.2.6 测试 Docker 是否安装正确
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run --rm hello-world
|
||||
|
||||
|
||||
@@ -76,10 +76,6 @@ $ sudo dnf config-manager --set-enabled docker-ce-test
|
||||
$ sudo dnf config-manager --set-disabled docker-ce-test
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 安装 Docker
|
||||
|
||||
更新 `dnf` 软件源缓存,并安装 `docker-ce`。
|
||||
@@ -118,8 +114,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
|
||||
|
||||
### 3.3.4 启动 Docker
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ sudo systemctl enable docker
|
||||
$ sudo systemctl start docker
|
||||
@@ -145,8 +139,6 @@ $ sudo usermod -aG docker $USER
|
||||
|
||||
### 3.3.6 测试 Docker 是否安装正确
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run --rm hello-world
|
||||
|
||||
|
||||
@@ -72,10 +72,6 @@ $ sudo sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.r
|
||||
$ sudo dnf config-manager --set-enabled docker-ce-test
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 安装 Docker
|
||||
|
||||
更新 `dnf` 软件源缓存,并安装 `docker-ce`。
|
||||
@@ -123,8 +119,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
|
||||
|
||||
### 3.4.5 启动 Docker
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ sudo systemctl enable docker
|
||||
$ sudo systemctl start docker
|
||||
@@ -150,8 +144,6 @@ $ sudo usermod -aG docker $USER
|
||||
|
||||
### 3.4.7 测试 Docker 是否安装正确
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run --rm hello-world
|
||||
|
||||
|
||||
@@ -133,8 +133,6 @@ $ sudo sh get-docker.sh --mirror Aliyun
|
||||
|
||||
### 3.5.4 启动 Docker
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ sudo systemctl enable docker
|
||||
$ sudo systemctl start docker
|
||||
@@ -160,8 +158,6 @@ $ sudo usermod -aG docker $USER
|
||||
|
||||
### 3.5.6 测试 Docker 是否安装正确
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run --rm hello-world
|
||||
|
||||
|
||||
@@ -10,8 +10,6 @@
|
||||
|
||||
### 3.6.1 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
### 3.6.2 CentOS/Rocky/AlmaLinux 离线安装 Docker
|
||||
|
||||
在无法连接外网的安全环境中,离线安装是唯一的选择。本节介绍如何在 RHEL 系发行版中进行离线安装。
|
||||
@@ -24,8 +22,6 @@
|
||||
|
||||
##### 查询可用的软件版本
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
#下载清华的镜像源文件
|
||||
wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo
|
||||
@@ -53,8 +49,6 @@ docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable
|
||||
|
||||
##### 下载到指定文件夹
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
sudo yum install --downloadonly --downloaddir=/tmp/docker24_offline_install/ docker-ce-24.0.4-1.el7 docker-ce-cli-24.0.4-1.el7
|
||||
```
|
||||
@@ -155,12 +149,8 @@ sudo yum versionlock delete all
|
||||
|
||||
#### YUM 本地源服务器搭建安装 Docker
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
##### 挂载 ISO 镜像搭建本地 File 源
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 删除其他网络源
|
||||
|
||||
@@ -192,8 +182,6 @@ yum install createrepo -y
|
||||
|
||||
##### 根据本地文件搭建 BASE 网络源
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 安装apache 服务器
|
||||
|
||||
@@ -246,8 +234,6 @@ createrepo /var/www/html/docker-ce/
|
||||
|
||||
##### YUM 客户端设置 (C...N)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
rm -f /etc/yum.repos.d/*
|
||||
cat >/etc/yum.repos.d/local_files.repo<< EOF
|
||||
@@ -273,8 +259,6 @@ EOF
|
||||
|
||||
##### Docker 安装 (C...N)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
sudo yum makecache fast
|
||||
sudo yum install docker-ce docker-ce-cli containerd.io
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 3.7 macOS
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 3.7.1 系统要求
|
||||
|
||||
[Docker Desktop for Mac](https://docs.docker.com/docker-for-mac/) 要求系统最低为 macOS Sonora 14.0 或更高版本,建议升级到最新版本的 macOS。
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
# 第三章安装 Docker
|
||||
# 第三章 安装 Docker
|
||||
|
||||
Docker 分为 `stable` `test` 和 `nightly` 三个更新频道。
|
||||
|
||||
官方网站上有各种环境下的[安装指南](https://docs.docker.com/get-docker/),这里主要介绍 Docker 在 `Linux`、`Windows 10` 和 `macOS` 上的安装。
|
||||
|
||||
## 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
## 详细安装指南
|
||||
|
||||
* [Ubuntu](3.1_ubuntu.md)
|
||||
|
||||
@@ -31,8 +31,6 @@ Registry地址 用户名 仓库名 标签
|
||||
|
||||
#### 示例
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 完整格式
|
||||
|
||||
@@ -65,8 +63,6 @@ $ docker pull ghcr.io/username/myapp:v1.0
|
||||
|
||||
当我们执行 `docker pull` 命令时,Docker 会输出详细的下载进度。让我们以 `ubuntu:24.04` 为例来解析这些信息。
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker pull ubuntu:24.04
|
||||
24.04: Pulling from library/ubuntu
|
||||
@@ -80,8 +76,6 @@ docker.io/library/ubuntu:24.04
|
||||
|
||||
#### 输出解读
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 输出内容 | 说明 |
|
||||
|---------|------|
|
||||
| `Pulling from library/ubuntu` | 正在从官方 ubuntu 仓库拉取 |
|
||||
@@ -118,10 +112,6 @@ flowchart TD
|
||||
| `--platform` | 指定平台架构 | `docker pull --platform linux/arm64 nginx` |
|
||||
| `--quiet, -q` | 静默模式 | `docker pull -q nginx` |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 指定平台
|
||||
|
||||
在 Apple Silicon Mac 上拉取 x86 镜像:
|
||||
@@ -196,8 +186,6 @@ $ sudo systemctl restart docker # Linux
|
||||
|
||||
#### 查看镜像摘要
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker images --digests ubuntu
|
||||
REPOSITORY TAG DIGEST IMAGE ID
|
||||
@@ -228,8 +216,6 @@ $ docker pull ubuntu@sha256:4bc3ae6596938cb0d9e5ac51a1152ec9dcac2a1c50829c74abd9
|
||||
|
||||
#### Q:提示镜像不存在
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
Error: pull access denied, repository does not exist
|
||||
```
|
||||
@@ -242,8 +228,6 @@ Error: pull access denied, repository does not exist
|
||||
|
||||
#### Q:磁盘空间不足
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 清理未使用的镜像
|
||||
|
||||
|
||||
@@ -31,10 +31,6 @@ ubuntu noble 329ed837d508 3 days ago 78MB
|
||||
| **CREATED** | 创建时间 |
|
||||
| **SIZE** | 本地占用空间 |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 同一镜像多个标签
|
||||
|
||||
注意上面的 `ubuntu:24.04` 和 `ubuntu:noble` 拥有相同的 IMAGE ID——它们是同一个镜像的不同标签,只占用一份存储空间。
|
||||
@@ -47,8 +43,6 @@ Docker 镜像的大小可能与我们通常理解的文件大小有所不同,
|
||||
|
||||
#### 本地大小 vs Hub 显示大小
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 位置 | 显示大小 | 说明 |
|
||||
|------|---------|------|
|
||||
| Docker Hub | 29MB | 压缩后的网络传输大小 |
|
||||
@@ -70,8 +64,6 @@ ubuntu:24.04 nginx:latest redis:latest
|
||||
|
||||
#### 查看实际空间占用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker system df
|
||||
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
|
||||
@@ -89,8 +81,6 @@ Build Cache 0 0 0B 0B
|
||||
|
||||
#### 按仓库名过滤
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 列出所有 ubuntu 镜像
|
||||
|
||||
@@ -103,8 +93,6 @@ ubuntu 22.04 a1b2c3d4e5f6 72MB
|
||||
|
||||
#### 按仓库名和标签过滤
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker images ubuntu:24.04
|
||||
REPOSITORY TAG IMAGE ID SIZE
|
||||
@@ -113,8 +101,6 @@ ubuntu 24.04 329ed837d508 78MB
|
||||
|
||||
#### 使用过滤器 --filter
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 过滤条件 | 说明 | 示例 |
|
||||
|---------|------|------|
|
||||
| `dangling=true` | 虚悬镜像 | `-f dangling=true` |
|
||||
@@ -160,8 +146,6 @@ REPOSITORY TAG IMAGE ID SIZE
|
||||
|
||||
#### 处理虚悬镜像
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 列出虚悬镜像
|
||||
|
||||
@@ -178,14 +162,8 @@ $ docker image prune
|
||||
|
||||
除了虚悬镜像,`docker image ls` 默认列出的只是顶层镜像。还有一种镜像是为了加速镜像构建、重复利用资源而存在的中间层镜像。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 查看所有镜像 (包含中间层)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker images -a
|
||||
```
|
||||
@@ -202,8 +180,6 @@ $ docker images -a
|
||||
|
||||
#### 只输出 ID
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker images -q
|
||||
5f515359c7f8
|
||||
@@ -225,16 +201,12 @@ $ docker rmi $(docker images -q redis)
|
||||
|
||||
#### 显示完整 ID
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker images --no-trunc
|
||||
```
|
||||
|
||||
#### 显示摘要
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker images --digests
|
||||
REPOSITORY TAG DIGEST IMAGE ID
|
||||
@@ -264,8 +236,6 @@ ubuntu 24.04 78MB
|
||||
|
||||
#### 可用模板字段
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `.ID` | 镜像 ID |
|
||||
@@ -280,8 +250,6 @@ ubuntu 24.04 78MB
|
||||
|
||||
### 4.2.8 常用命令组合
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 列出所有镜像及其大小,按大小排序(需要系统 sort 命令)
|
||||
|
||||
|
||||
@@ -27,8 +27,6 @@ $ docker image rm [选项] <镜像1> [<镜像2> ...]
|
||||
|
||||
#### 使用短 ID 删除
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker image ls
|
||||
REPOSITORY TAG IMAGE ID SIZE
|
||||
@@ -44,8 +42,6 @@ Deleted: sha256:501ad78535f0...
|
||||
|
||||
#### 使用镜像名删除
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker rmi redis:alpine
|
||||
Untagged: redis:alpine
|
||||
@@ -87,8 +83,6 @@ Deleted: sha256:32770d1dcf835f192cafd6b9263b7b597a1778a403a109e2cc2ee866f74adf23
|
||||
|
||||
#### Untagged vs Deleted
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 操作 | 含义 |
|
||||
|------|------|
|
||||
| **Untagged** | 移除镜像的标签 |
|
||||
@@ -146,8 +140,6 @@ $ docker image prune -f
|
||||
|
||||
#### 删除所有未使用的镜像
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 删除所有没有被容器使用的镜像
|
||||
|
||||
@@ -160,8 +152,6 @@ $ docker image prune -a --filter "until=24h"
|
||||
|
||||
#### 按条件删除
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 删除所有 redis 镜像
|
||||
|
||||
@@ -184,8 +174,6 @@ $ docker image prune -a --filter "until=168h" # 7天前
|
||||
|
||||
#### 原因一:有容器依赖
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker rmi nginx
|
||||
Error: conflict: unable to remove repository reference "nginx"
|
||||
@@ -207,8 +195,6 @@ $ docker rmi -f nginx
|
||||
|
||||
#### 原因二:多个标签指向同一镜像
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker images
|
||||
REPOSITORY TAG IMAGE ID
|
||||
@@ -225,8 +211,6 @@ Untagged: ubuntu:24.04
|
||||
|
||||
#### 原因三:被其他镜像依赖 (中间层)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker rmi some_base_image
|
||||
Error: image has dependent child images
|
||||
@@ -238,8 +222,6 @@ Error: image has dependent child images
|
||||
|
||||
### 4.3.6 常用过滤条件
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 过滤条件 | 说明 | 示例 |
|
||||
|---------|------|------|
|
||||
| `dangling=true` | 虚悬镜像 | `-f dangling=true` |
|
||||
@@ -256,8 +238,6 @@ Error: image has dependent child images
|
||||
|
||||
#### 开发环境
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 定期清理虚悬镜像
|
||||
|
||||
@@ -270,8 +250,6 @@ $ docker system prune -a
|
||||
|
||||
#### CI/CD 环境
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 只保留最近使用的镜像
|
||||
|
||||
@@ -280,8 +258,6 @@ $ docker image prune -a --filter "until=72h" -f
|
||||
|
||||
#### 查看空间占用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker system df
|
||||
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
|
||||
|
||||
@@ -122,8 +122,6 @@ docker run --name web2 -d -p 81:80 nginx:v2
|
||||
|
||||
### 4.4.1 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
### 4.4.2 慎用 `docker commit`
|
||||
|
||||
使用 `docker commit` 命令虽然可以比较直观的帮助理解镜像分层存储的概念,但是实际环境中并不会这样使用。
|
||||
|
||||
@@ -146,8 +146,6 @@ Sending build context to Docker daemon 2.048 kB
|
||||
|
||||
### 4.5.7 其它 `docker build` 的用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 直接用 Git repo 进行构建
|
||||
|
||||
或许你已经注意到了,`docker build` 还支持从 URL 构建,比如可以直接从 Git repo 中构建:
|
||||
@@ -174,8 +172,6 @@ Successfully built 038ad4142d2b
|
||||
|
||||
#### 用给定的 tar 压缩包构建
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker build http://server/context.tar.gz
|
||||
```
|
||||
@@ -184,8 +180,6 @@ $ docker build http://server/context.tar.gz
|
||||
|
||||
#### 从标准输入中读取 Dockerfile 进行构建
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
docker build - < Dockerfile
|
||||
```
|
||||
@@ -200,8 +194,6 @@ cat Dockerfile | docker build -
|
||||
|
||||
#### 从标准输入中读取上下文压缩包进行构建
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker build - < context.tar.gz
|
||||
```
|
||||
|
||||
@@ -41,10 +41,6 @@ f477a6e18e98 About a minute ago 214.9 MB
|
||||
|
||||
Docker 还提供了 `docker save` 和 `docker load` 命令,用以将镜像保存为一个文件,然后传输到另一个位置上,再加载进来。这是在没有 Docker Registry 时的做法,现在已经不推荐,镜像迁移应该直接使用 Docker Registry,无论是直接使用 Docker Hub 还是使用内网私有 Registry 都可以。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 保存镜像
|
||||
|
||||
使用 `docker save` 命令可以将镜像保存为归档文件。
|
||||
|
||||
@@ -1,13 +1,9 @@
|
||||
# 第四章使用镜像
|
||||
# 第四章 使用镜像
|
||||
|
||||
在之前的介绍中,我们知道镜像是 Docker 的三大组件之一。
|
||||
|
||||
Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。
|
||||
|
||||
## 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
## 本章内容
|
||||
|
||||
本章将介绍更多关于镜像的内容,包括:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 4.8 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 操作 | 命令 |
|
||||
|------|------|
|
||||
| 拉取镜像 | `docker pull 镜像名:标签` |
|
||||
@@ -16,8 +14,6 @@
|
||||
- [镜像加速器](../03_install/3.9_mirror.md):加速镜像下载
|
||||
- [Docker Hub](../06_repository/6.1_dockerhub.md):官方镜像仓库
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 操作 | 命令 |
|
||||
|------|------|
|
||||
| 列出所有镜像 | `docker images` |
|
||||
@@ -34,8 +30,6 @@
|
||||
- [删除镜像](4.3_rm.md):清理本地镜像
|
||||
- [镜像](../02_basic_concept/2.1_image.md):理解镜像概念
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 操作 | 命令 |
|
||||
|------|------|
|
||||
| 删除指定镜像 | `docker rmi 镜像名:标签` |
|
||||
|
||||
@@ -13,12 +13,8 @@
|
||||
|
||||
### 5.1.2 新建并启动
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本语法
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
docker run [选项] 镜像 [命令] [参数...]
|
||||
```
|
||||
@@ -84,12 +80,8 @@ flowchart TD
|
||||
|
||||
### 5.1.4 常用启动选项
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基础选项
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 选项 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| `-d` | 后台运行 (detach)| `docker run -d nginx` |
|
||||
@@ -99,8 +91,6 @@ flowchart TD
|
||||
|
||||
#### 端口映射
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 将容器的 80 端口映射到宿主机的 8080 端口
|
||||
|
||||
@@ -117,8 +107,6 @@ $ docker run -d -p 127.0.0.1:8080:80 nginx
|
||||
|
||||
#### 数据卷挂载
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 挂载命名卷
|
||||
|
||||
@@ -135,8 +123,6 @@ $ docker run -v /host/path:/container/path:ro nginx
|
||||
|
||||
#### 环境变量
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 设置单个环境变量
|
||||
|
||||
@@ -149,8 +135,6 @@ $ docker run --env-file .env myapp
|
||||
|
||||
#### 资源限制
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 限制内存
|
||||
|
||||
@@ -198,8 +182,6 @@ root@ba267838cc1b:/# ps
|
||||
|
||||
### 5.1.7 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器启动后立即退出
|
||||
|
||||
**原因**:主进程执行完毕或无法保持运行
|
||||
|
||||
@@ -13,12 +13,8 @@ Docker 容器默认是 **前台运行** 的。使用 `-d` (detach) 参数可以
|
||||
|
||||
### 5.2.2 基本使用
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 前台运行 (默认)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
|
||||
hello world
|
||||
@@ -35,8 +31,6 @@ hello world
|
||||
|
||||
#### 后台运行 (使用 -d 参数)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
|
||||
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
|
||||
@@ -89,8 +83,6 @@ flowchart TD
|
||||
|
||||
#### 常见的 “立即退出” 场景
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 场景 | 原因 | 解决方案 |
|
||||
|------|------|---------|
|
||||
| `docker run -d ubuntu` | 默认 bash 无输入立即退出 | 指定长期运行的命令 |
|
||||
@@ -99,12 +91,8 @@ flowchart TD
|
||||
|
||||
### 5.2.4 查看后台容器
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 查看运行中的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker container ls
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
@@ -113,8 +101,6 @@ CONTAINER ID IMAGE COMMAND CREATED STATUS PO
|
||||
|
||||
#### 查看容器输出日志
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker container logs 77b2dc01fe0f
|
||||
hello world
|
||||
@@ -131,8 +117,6 @@ $ docker container logs -f 77b2dc01fe0f
|
||||
|
||||
#### 查看已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker container ls -a
|
||||
```
|
||||
@@ -141,12 +125,8 @@ $ docker container ls -a
|
||||
|
||||
### 5.2.5 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 长期运行的服务使用 -d
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## Web 服务器
|
||||
|
||||
@@ -185,8 +165,6 @@ Hello, World!
|
||||
|
||||
#### 4. 配合日志查看
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 后台启动
|
||||
|
||||
@@ -207,8 +185,6 @@ $ docker logs -t myapp
|
||||
|
||||
### 5.2.6 常见问题排查
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器启动后立即退出
|
||||
|
||||
1. **查看退出状态码**:
|
||||
|
||||
@@ -16,20 +16,14 @@
|
||||
|
||||
### 5.3.2 docker stop (推荐)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker stop 基本用法
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker stop 容器名或ID
|
||||
```
|
||||
|
||||
#### 工作原理
|
||||
|
||||
具体内容如下:
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
cmd["docker stop mycontainer"] --> A["1. 发送 SIGTERM 信号给容器主进程 (PID 1)"]
|
||||
@@ -39,8 +33,6 @@ flowchart TD
|
||||
|
||||
#### 自定义超时时间
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 等待 30 秒后强制终止
|
||||
|
||||
@@ -53,8 +45,6 @@ $ docker stop -t 0 mycontainer
|
||||
|
||||
#### 停止多个容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 停止多个指定容器
|
||||
|
||||
@@ -69,20 +59,14 @@ $ docker stop $(docker ps -q)
|
||||
|
||||
### 5.3.3 docker kill
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本用法
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker kill 容器名或ID
|
||||
```
|
||||
|
||||
#### 与 stop 的区别
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 命令 | 信号 | 使用场景 |
|
||||
|------|------|---------|
|
||||
| `docker stop` | SIGTERM → SIGKILL | 正常停止,让应用优雅退出 |
|
||||
@@ -90,8 +74,6 @@ $ docker kill 容器名或ID
|
||||
|
||||
#### 发送自定义信号
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 发送 SIGHUP(让进程重新加载配置)
|
||||
|
||||
@@ -123,8 +105,6 @@ $ docker run ubuntu echo "Hello" # echo 执行完 → 容器停止
|
||||
|
||||
### 5.3.5 查看已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker ps -a
|
||||
CONTAINER ID IMAGE COMMAND STATUS NAMES
|
||||
@@ -146,12 +126,8 @@ c5d3a5e8f7b2 nginx "nginx" Up 5 minutes mynginx
|
||||
|
||||
### 5.3.6 重新启动容器
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 启动已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker start 容器名或ID
|
||||
|
||||
@@ -162,8 +138,6 @@ $ docker start -ai 容器名
|
||||
|
||||
#### 重启运行中的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 先停止再启动
|
||||
|
||||
@@ -178,8 +152,6 @@ $ docker restart -t 30 容器名
|
||||
|
||||
### 5.3.7 生命周期状态图
|
||||
|
||||
具体内容如下:
|
||||
|
||||
```mermaid
|
||||
stateDiagram-v2
|
||||
direction TB
|
||||
@@ -200,28 +172,20 @@ stateDiagram-v2
|
||||
|
||||
### 5.3.8 批量操作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 停止所有容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker stop $(docker ps -q)
|
||||
```
|
||||
|
||||
#### 删除所有已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker container prune
|
||||
```
|
||||
|
||||
#### 停止并删除所有容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker stop $(docker ps -q) && docker container prune -f
|
||||
```
|
||||
@@ -230,8 +194,6 @@ $ docker stop $(docker ps -q) && docker container prune -f
|
||||
|
||||
### 5.3.9 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器停止很慢
|
||||
|
||||
原因:应用没有正确处理 SIGTERM 信号,需要等待超时后强制终止。
|
||||
@@ -258,8 +220,6 @@ CMD ["node", "server.js"]
|
||||
|
||||
#### Q:容器无法停止
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 强制终止
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 5.4 进入容器
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 5.4.1 为什么需要进入容器
|
||||
|
||||
使用 `-d` 参数启动容器后,容器在后台运行。以下场景需要进入容器内部操作:
|
||||
@@ -26,12 +24,8 @@ Docker 提供两种进入容器的命令:
|
||||
|
||||
### 5.4.3 docker exec (推荐)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker exec 基本用法
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 进入容器并启动交互式 shell
|
||||
|
||||
@@ -44,8 +38,6 @@ $ docker exec -it 容器名 /bin/sh
|
||||
|
||||
#### 参数说明
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 参数 | 作用 |
|
||||
|------|------|
|
||||
| `-i` | 保持标准输入打开 (interactive)|
|
||||
@@ -57,8 +49,6 @@ $ docker exec -it 容器名 /bin/sh
|
||||
|
||||
#### docker exec 示例
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 启动一个后台容器
|
||||
|
||||
@@ -99,8 +89,6 @@ $ docker exec -u root myubuntu apt update
|
||||
|
||||
#### 只用 -i 不用 -t 的区别
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 只用 -i:可以执行命令,但没有提示符
|
||||
|
||||
@@ -123,12 +111,8 @@ root@69d137adef7a:/# # 有提示符
|
||||
|
||||
### 5.4.4 docker attach (谨慎使用)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker attach 基本用法
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker attach 容器名
|
||||
```
|
||||
@@ -150,8 +134,6 @@ flowchart LR
|
||||
|
||||
#### docker attach 示例
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 启动容器
|
||||
|
||||
@@ -199,8 +181,6 @@ CONTAINER ID IMAGE STATUS NAMES
|
||||
|
||||
### 5.4.5 exec vs attach 对比
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | docker exec | docker attach |
|
||||
|------|-------------|---------------|
|
||||
| **工作方式** | 在容器内启动新进程 | 附加到主进程 |
|
||||
@@ -238,12 +218,8 @@ flowchart LR
|
||||
|
||||
### 5.4.6 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 首选 docker exec
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 进入容器调试
|
||||
|
||||
@@ -285,8 +261,6 @@ $ docker debug myapp
|
||||
|
||||
### 5.4.7 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:exec 进入后看不到其他终端的操作
|
||||
|
||||
这是正常的。exec 启动的是独立进程,多个 exec 会话互不影响。
|
||||
@@ -301,8 +275,6 @@ $ docker exec -it myapp /bin/sh
|
||||
|
||||
#### Q:需要 root 权限
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker exec -u root -it myapp bash
|
||||
```
|
||||
|
||||
@@ -16,8 +16,6 @@ $ docker rm 容器名或ID
|
||||
|
||||
### 5.6.2 删除选项
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 选项 | 说明 | 示例 |
|
||||
|------|------|------|
|
||||
| 无参数 | 删除已停止的容器 | `docker rm mycontainer` |
|
||||
@@ -26,8 +24,6 @@ $ docker rm 容器名或ID
|
||||
|
||||
#### 删除已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker rm mycontainer
|
||||
mycontainer
|
||||
@@ -35,8 +31,6 @@ mycontainer
|
||||
|
||||
#### 强制删除运行中的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 不加 -f 会报错
|
||||
|
||||
@@ -53,8 +47,6 @@ running_container
|
||||
|
||||
#### 删除容器及其数据卷
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 删除容器时同时删除其匿名卷
|
||||
|
||||
@@ -67,12 +59,8 @@ $ docker rm -v mycontainer
|
||||
|
||||
### 5.6.3 批量删除
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 删除所有已停止的容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 方式一:使用 prune 命令(推荐)
|
||||
|
||||
@@ -92,8 +80,6 @@ $ docker container prune -f
|
||||
|
||||
#### 删除所有容器 (包括运行中的)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 先停止所有容器,再删除
|
||||
|
||||
@@ -107,8 +93,6 @@ $ docker rm -f $(docker ps -aq)
|
||||
|
||||
#### 按条件删除
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 删除所有已退出的容器
|
||||
|
||||
@@ -138,14 +122,8 @@ $ docker container prune --filter "until=24h"
|
||||
| `before=xxx` | 在某容器之前创建 | `-f before=mycontainer` |
|
||||
| `since=xxx` | 在某容器之后创建 | `-f since=mycontainer` |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 示例
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 删除所有基于 nginx 镜像的容器
|
||||
|
||||
@@ -178,12 +156,8 @@ $ docker image rm nginx
|
||||
|
||||
### 5.6.6 清理策略建议
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 开发环境
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 定期清理已停止的容器
|
||||
|
||||
@@ -196,8 +170,6 @@ $ docker system prune -f
|
||||
|
||||
#### 生产环境
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用 --rm 参数运行临时容器
|
||||
|
||||
@@ -211,8 +183,6 @@ $ docker container prune --filter "until=168h" # 保留 7 天内的
|
||||
|
||||
#### 完整清理脚本
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
## cleanup.sh - Docker 资源清理脚本
|
||||
@@ -237,12 +207,8 @@ docker system df
|
||||
|
||||
### 5.6.7 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:容器无法删除
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
Error: container is running
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 第五章操作容器
|
||||
# 第五章 操作容器
|
||||
|
||||
容器是 Docker 又一核心概念。
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
|
||||
本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。
|
||||
|
||||
* [启动容器](../05_container/5.1_run.md)
|
||||
* [启动容器](5.1_run.md)
|
||||
* [守护态运行](5.2_daemon.md)
|
||||
* [终止容器](5.3_stop.md)
|
||||
* [进入容器](5.4_attach_exec.md)
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 5.7 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 操作 | 命令 | 说明 |
|
||||
|------|------|------|
|
||||
| 新建并运行 | `docker run` | 最常用的启动方式 |
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 6.1 Docker Hub
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 6.1.1 什么是 Docker Hub
|
||||
|
||||
Docker Hub 是 Docker 的中央镜像仓库,通过它您可以轻松地分享和获取 Docker 镜像。
|
||||
@@ -20,8 +18,6 @@ Docker Hub 是 Docker 的中央镜像仓库,通过它您可以轻松地分享
|
||||
|
||||
### 6.1.2 核心功能
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 搜索镜像
|
||||
|
||||
我们可以通过 `docker search` 命令来查找官方仓库中的镜像,并利用 `docker pull` 命令来将它下载到本地。
|
||||
@@ -39,8 +35,6 @@ centos The official build of CentOS. 7000+ [OK]
|
||||
|
||||
#### 2. 拉取镜像
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker pull nginx:alpine
|
||||
```
|
||||
@@ -72,12 +66,6 @@ $ docker push username/myapp:v1
|
||||
|
||||
### 6.1.3 限制与配额
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 镜像拉取限制
|
||||
|
||||
自 2020 年 11 月起,Docker Hub 对匿名和免费用户实施了拉取速率限制:
|
||||
@@ -97,8 +85,6 @@ $ docker push username/myapp:v1
|
||||
|
||||
### 6.1.4 安全最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 启用 2FA (双因素认证)
|
||||
|
||||
为了保护您的 Docker Hub 账号安全,我们建议采取以下措施。
|
||||
|
||||
@@ -8,12 +8,6 @@
|
||||
|
||||
### 6.2.1 安装运行 docker-registry
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 容器运行
|
||||
|
||||
如果您需要搭建私有仓库,可以通过官方提供的 `registry` 镜像快速部署。
|
||||
@@ -105,10 +99,6 @@ REPOSITORY TAG IMAGE ID CREAT
|
||||
|
||||
这是因为 Docker 默认不允许非 `HTTPS` 方式推送镜像。我们可以通过 Docker 的配置选项来取消这个限制,或者查看下一节配置能够通过 `HTTPS` 访问的私有仓库。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### Linux
|
||||
|
||||
默认情况下,Docker 强制使用 HTTPS 协议推送镜像。如果您搭建的私有仓库是 HTTP 协议,需要进行如下配置。
|
||||
|
||||
@@ -125,8 +125,6 @@ threshold: 3
|
||||
|
||||
### 6.3.3 生成 http 认证文件
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ mkdir auth
|
||||
|
||||
@@ -166,8 +164,6 @@ volumes:
|
||||
|
||||
### 6.3.6 启动
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose up -d
|
||||
```
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
|
||||
### 6.4.1 启动 Nexus 容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -d --name nexus3 --restart=always \
|
||||
-p 8081:8081 \
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 第六章访问仓库
|
||||
# 第六章 访问仓库
|
||||
|
||||
仓库 (`Repository`) 是集中存放镜像的地方。
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 6.5 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 功能 | 说明 |
|
||||
|------|------|
|
||||
| **官方镜像** | 优先使用的基础镜像 |
|
||||
@@ -11,8 +9,6 @@
|
||||
|
||||
### 6.5.1 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
### 6.5.2 延伸阅读
|
||||
|
||||
- [私有仓库](6.2_registry.md):搭建自己的 Registry
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.10 WORKDIR 指定工作目录
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.10.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -30,8 +28,6 @@ COPY . . # 复制到 /app/
|
||||
|
||||
### 7.10.3 为什么需要 WORKDIR
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 常见错误
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -125,8 +121,6 @@ COPY --from=builder /build/dist .
|
||||
|
||||
### 7.10.7 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 尽早设置 WORKDIR
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -188,8 +182,6 @@ WORKDIR /data
|
||||
|
||||
### 7.10.8 与其他指令的关系
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 指令 | WORKDIR 的影响 |
|
||||
|------|---------------|
|
||||
| `RUN` | 在 WORKDIR 中执行命令 |
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.11 USER 指定当前用户
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.11.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -38,8 +36,6 @@ flowchart LR
|
||||
|
||||
### 7.11.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 创建并切换用户
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -94,10 +90,6 @@ RUN useradd -r -s /bin/false appuser
|
||||
USER appuser
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 创建用户的方式
|
||||
|
||||
**Debian/Ubuntu**:
|
||||
@@ -126,8 +118,6 @@ RUN addgroup -g 1001 -S appgroup && \
|
||||
|
||||
### 7.11.5 运行时切换用户
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 使用 gosu (推荐)
|
||||
|
||||
在 ENTRYPOINT 脚本中切换用户时,不要使用 `su` 或 `sudo`,应使用 [gosu](https://github.com/tianon/gosu):
|
||||
@@ -165,8 +155,6 @@ exec gosu redis "$@"
|
||||
|
||||
#### 为什么不用 su/sudo
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 问题 | su/sudo | gosu |
|
||||
|------|---------|------|
|
||||
| TTY 要求 | 需要 | 不需要 |
|
||||
@@ -223,8 +211,6 @@ CMD ["node", "server.js"]
|
||||
|
||||
### 7.11.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 始终使用非 root 用户
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -279,12 +265,8 @@ CMD ["node", "server.js"]
|
||||
|
||||
### 7.11.9 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:权限被拒绝
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
permission denied: '/app/data.log'
|
||||
```
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.12 HEALTHCHECK 健康检查
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.12.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -37,8 +35,6 @@ Starting ──成功──> Healthy ──失败N次──> Unhealthy
|
||||
|
||||
### 7.12.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Web 服务检查
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -59,8 +55,6 @@ HEALTHCHECK --interval=30s --timeout=3s --retries=3 \
|
||||
|
||||
#### 常用选项
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 选项 | 说明 | 默认值 |
|
||||
|------|------|--------|
|
||||
| `--interval` | 两次检查的间隔 | 30s |
|
||||
@@ -83,8 +77,6 @@ HEALTHCHECK NONE
|
||||
|
||||
### 7.12.5 常见检查脚本
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### HTTP 服务
|
||||
|
||||
使用 `curl` 或 `wget`:
|
||||
@@ -158,8 +150,6 @@ services:
|
||||
|
||||
### 7.12.7 查看健康状态
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看容器状态(包含健康信息)
|
||||
|
||||
@@ -189,8 +179,6 @@ $ docker inspect --format '{{json .State.Health}}' mycontainer | jq
|
||||
|
||||
### 7.12.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 避免副作用
|
||||
|
||||
健康检查会被频繁执行,不要在检查脚本中进行写操作或消耗大量资源的操作。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.13 ONBUILD 为他人做嫁衣裳
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.13.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -77,8 +75,6 @@ FROM 基础镜像 ──build──> 读取基础镜像触发器 ──> 执行
|
||||
|
||||
### 7.13.4 常见使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 自动处理依赖安装
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -115,8 +111,6 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
|
||||
|
||||
### 7.13.5 注意事项
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 继承性限制
|
||||
|
||||
`ONBUILD` 指令 **只会继承一次**。
|
||||
@@ -141,8 +135,6 @@ ONBUILD COPY dist/ /usr/share/nginx/html/
|
||||
|
||||
### 7.13.6 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 命名规范
|
||||
|
||||
建议在镜像标签中添加 `-onbuild` 后缀,明确告知使用者该镜像包含触发器。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.14 LABEL 为镜像添加元数据
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.14.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -25,8 +23,6 @@ LABEL <key>=<value> <key>=<value> ...
|
||||
|
||||
### 7.14.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 定义单个标签
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -67,10 +63,6 @@ LABEL maintainer="user@example.com" \
|
||||
| `org.opencontainers.image.title` | 镜像标题 | `My App` |
|
||||
| `org.opencontainers.image.description` | 描述 | `Production ready web server` |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 示例
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -132,8 +124,6 @@ $ docker build \
|
||||
|
||||
### 7.14.7 查看标签
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### docker inspect
|
||||
|
||||
查看镜像的标签信息:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.15 SHELL 指令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.15.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -21,8 +19,6 @@ SHELL ["executable", "parameters"]
|
||||
|
||||
### 7.15.2 为什么要用 SHELL 指令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 使用 bash 特性
|
||||
|
||||
默认的 `/bin/sh` (通常是 dash 或 alpine 的 ash) 功能有限。如果你需要使用 bash 的特有功能 (如数组、`{}` 扩展、`pipefail` 等),可以切换 shell。
|
||||
@@ -125,8 +121,6 @@ RUN echo "Using sh again"
|
||||
|
||||
### 7.15.5 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 推荐开启 pipefail
|
||||
|
||||
对于使用 bash 的镜像,强烈建议开启 `pipefail`,以确保构建过程中的错误能被及时捕获。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.1 RUN 执行命令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.1.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -17,8 +15,6 @@ RUN ["executable", "param1", "param2"]
|
||||
|
||||
### 7.1.2 两种格式对比
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. Shell 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -50,8 +46,6 @@ RUN ["apt-get", "update"]
|
||||
|
||||
### 7.1.3 常见最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 组合命令 (减少层数)
|
||||
|
||||
每一个 `RUN` 指令都会新建一层镜像。为了减少镜像体积和层数,应使用 `&&` 连接命令。
|
||||
@@ -110,8 +104,6 @@ RUN wget http://url | gzip -d > file
|
||||
|
||||
### 7.1.4 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:为什么 `RUN cd /app` 不生效?
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -148,8 +140,6 @@ RUN echo $MY_VAR
|
||||
|
||||
### 7.1.5 高级技巧
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 使用 BuildKit 的挂载缓存
|
||||
|
||||
BuildKit 支持在 `RUN` 指令中使用 `--mount` 挂载缓存,加速构建。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.2 COPY 复制文件
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.2.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -17,8 +15,6 @@ COPY [选项] ["<源路径1>", "<源路径2>", ... "<目标路径>"]
|
||||
|
||||
### 7.2.2 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 复制单个文件
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -90,8 +86,6 @@ COPY app[0-9].js /app/ # app0.js ~ app9.js
|
||||
|
||||
### 7.2.4 目标路径
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 绝对路径
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -163,8 +157,6 @@ COPY start.sh /app/
|
||||
|
||||
### 7.2.7 COPY vs ADD
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | COPY | ADD |
|
||||
|------|------|-----|
|
||||
| 复制本地文件 | ✅ | ✅ |
|
||||
@@ -189,8 +181,6 @@ ADD app.tar.gz /app/
|
||||
|
||||
### 7.2.8 多阶段构建中的 COPY
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 从其他构建阶段复制
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -254,8 +244,6 @@ Dockerfile
|
||||
|
||||
### 7.2.10 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 利用缓存,先复制依赖文件
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.3 ADD 更高级的复制文件
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.3.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -20,8 +18,6 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
|
||||
|
||||
### 7.3.2 ADD vs COPY
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | COPY | ADD |
|
||||
|------|------|-----|
|
||||
| 复制本地文件 | ✅ | ✅ |
|
||||
@@ -36,8 +32,6 @@ ADD [选项] ["<源路径>", ... "<目标路径>"]
|
||||
|
||||
### 7.3.3 自动解压功能
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本用法 (自动解压本地 tar)
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -85,8 +79,6 @@ app.tar.gz 包含: /app/ 目录结果:
|
||||
|
||||
### 7.3.4 URL 下载功能 (不推荐)
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 基本用法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -99,8 +91,6 @@ ADD https://example.com/app.zip /app/app.zip
|
||||
|
||||
#### 为什么不推荐
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 问题 | 说明 |
|
||||
|------|------|
|
||||
| 权限固定 | 下载的文件权限为 600,通常需要额外 RUN 修改 |
|
||||
@@ -144,8 +134,6 @@ ADD --chown=1000:1000 files/ /app/
|
||||
|
||||
### 7.3.6 何时使用 ADD
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### ✅ 适合使用 ADD
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -212,8 +200,6 @@ ADD app.tar.gz /app/
|
||||
|
||||
### 7.3.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 默认使用 COPY
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.4 CMD 容器启动命令
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.4.1 什么是 CMD
|
||||
|
||||
`CMD` 指令用于指定容器启动时默认执行的命令。它定义了容器的 “主进程”。
|
||||
@@ -63,8 +61,6 @@ CMD ["sh", "-c", "echo $HOME"]
|
||||
|
||||
### 7.4.3 exec 格式 vs shell 格式
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | exec 格式 | shell 格式 |
|
||||
|------|----------|-----------|
|
||||
| 主进程 | 指定的程序 | `/bin/sh` |
|
||||
@@ -72,10 +68,6 @@ CMD ["sh", "-c", "echo $HOME"]
|
||||
| 环境变量 | ❌ 需要 shell 包装 | ✅ 自动解析 |
|
||||
| 推荐使用 | ✅ 大多数场景 | 需要 shell 特性时 |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 信号传递问题示例
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -122,8 +114,6 @@ CMD ["/bin/bash"] + cat /etc/os-release
|
||||
|
||||
### 7.4.5 经典错误:容器立即退出
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 错误示例
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -166,8 +156,6 @@ CMD ["nginx", "-g", "daemon off;"]
|
||||
|
||||
### 7.4.6 CMD vs ENTRYPOINT
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 指令 | 用途 | 运行时行为 |
|
||||
|------|------|-----------|
|
||||
| **CMD**| 默认命令 | `docker run` 参数会 **覆盖** 它 |
|
||||
@@ -210,8 +198,6 @@ $ docker run myimage http://other.com # curl -s http://other.com(参数覆盖
|
||||
|
||||
### 7.4.7 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 优先使用 exec 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -278,8 +264,6 @@ $ docker run myapp --port 9000
|
||||
|
||||
### 7.4.8 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:CMD 可以写多个吗?
|
||||
|
||||
不可以。多个 CMD 只有最后一个生效:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.5 ENTRYPOINT 入口点
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.5.1 什么是 ENTRYPOINT
|
||||
|
||||
`ENTRYPOINT` 指定容器启动时运行的入口程序。与 CMD 不同,ENTRYPOINT 定义的命令不会被 `docker run` 的参数覆盖,而是 **接收这些参数**。
|
||||
@@ -12,8 +10,6 @@
|
||||
|
||||
### 7.5.2 语法格式
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 格式 | 语法 | 推荐程度 |
|
||||
|------|------|---------|
|
||||
| **exec 格式**| `ENTRYPOINT ["可执行文件", "参数1"]` | ✅**推荐** |
|
||||
@@ -33,12 +29,8 @@ ENTRYPOINT nginx -g "daemon off;"
|
||||
|
||||
### 7.5.3 ENTRYPOINT vs CMD
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 核心区别
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ENTRYPOINT | CMD |
|
||||
|------|------------|-----|
|
||||
| **定位** | 固定的入口程序 | 默认参数 |
|
||||
@@ -90,8 +82,6 @@ $ docker run myimage -v http://other.com # curl -s -v http://other.com ✓
|
||||
|
||||
### 7.5.4 场景一:让镜像像命令一样使用
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 需求 (启动前准备)
|
||||
|
||||
创建一个查询公网 IP 的 “命令” 镜像。
|
||||
@@ -156,8 +146,6 @@ curl -s http://myip.ipip.net -i
|
||||
|
||||
### 7.5.5 场景二:启动前的准备工作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 需求
|
||||
|
||||
在启动主服务前执行初始化脚本 (如数据库迁移、权限设置)。
|
||||
@@ -276,8 +264,6 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
|
||||
|
||||
### 7.5.8 ENTRYPOINT 与 CMD 组合表
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| ENTRYPOINT | CMD | 最终执行命令 |
|
||||
|------------|-----|-------------|
|
||||
| 无 | 无 | 无 (容器无法启动)|
|
||||
@@ -292,8 +278,6 @@ $ docker run --entrypoint /bin/cat myimage /etc/os-release
|
||||
|
||||
### 7.5.9 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 使用 exec 格式
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -319,8 +303,6 @@ CMD ["-g", "daemon off;"]
|
||||
|
||||
#### 3. 入口脚本使用 exec
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
#!/bin/sh
|
||||
## 准备工作...
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.6 ENV 设置环境变量
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.6.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -20,8 +18,6 @@ ENV <key1>=<value1> <key2>=<value2> ...
|
||||
|
||||
### 7.6.2 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 设置单个变量
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -47,8 +43,6 @@ ENV NODE_VERSION=20.10.0 \
|
||||
|
||||
### 7.6.3 环境变量的作用
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 后续指令中使用
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -130,14 +124,8 @@ $ docker run -e APP_ENV=development -e DEBUG=true myimage
|
||||
$ docker run --env-file .env myimage
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 。env 文件格式
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## .env
|
||||
|
||||
@@ -150,8 +138,6 @@ DATABASE_URL=postgres://localhost/mydb
|
||||
|
||||
### 7.6.6 ENV vs ARG
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ENV | ARG |
|
||||
|------|-----|-----|
|
||||
| **生效时间** | 构建时 + 运行时 | 仅构建时 |
|
||||
@@ -159,10 +145,6 @@ DATABASE_URL=postgres://localhost/mydb
|
||||
| **覆盖方式** | `docker run -e` | `docker build --build-arg` |
|
||||
| **适用场景** | 应用配置 | 构建参数 (如版本号)|
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 组合使用
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -191,8 +173,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
|
||||
|
||||
### 7.6.7 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 统一管理版本号
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -257,8 +237,6 @@ ENV HOST=localhost \
|
||||
|
||||
### 7.6.8 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:环境变量在 CMD 中不展开
|
||||
|
||||
exec 格式不会自动展开环境变量:
|
||||
@@ -275,8 +253,6 @@ CMD ["sh", "-c", "python app.py --port $PORT"]
|
||||
|
||||
#### Q:如何查看容器的环境变量
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker inspect mycontainer --format '{{json .Config.Env}}'
|
||||
$ docker exec mycontainer env
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.7 ARG 构建参数
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.7.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -16,8 +14,6 @@ ARG <参数名>[=<默认值>]
|
||||
|
||||
### 7.7.2 ARG vs ENV
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | ARG | ENV |
|
||||
|------|-----|-----|
|
||||
| **生效时间** | 仅构建时 | 构建时 + 运行时 |
|
||||
@@ -39,8 +35,6 @@ ARG <参数名>[=<默认值>]
|
||||
|
||||
### 7.7.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 定义和使用
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -58,8 +52,6 @@ RUN echo "Using Node.js $NODE_VERSION"
|
||||
|
||||
#### 构建时覆盖
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用默认值
|
||||
|
||||
@@ -74,8 +66,6 @@ $ docker build --build-arg NODE_VERSION=18 -t myapp .
|
||||
|
||||
### 7.7.4 ARG 的作用域
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### FROM 之前的 ARG
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -132,8 +122,6 @@ RUN echo "Running with Node $NODE_VERSION"
|
||||
|
||||
### 7.7.5 常见使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 控制基础镜像版本
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -231,8 +219,6 @@ $ docker build --build-arg HTTP_PROXY=http://proxy:8080 .
|
||||
|
||||
### 7.7.8 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 为 ARG 提供合理默认值
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.8 VOLUME 定义匿名卷
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.8.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -47,8 +45,6 @@ flowchart LR
|
||||
|
||||
### 7.8.3 基本用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 定义单个卷
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -71,8 +67,6 @@ VOLUME ["/data", "/logs", "/config"]
|
||||
|
||||
### 7.8.4 VOLUME 的行为
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 自动创建匿名卷
|
||||
|
||||
如果运行时未指定挂载,Docker 会自动创建匿名卷:
|
||||
@@ -86,8 +80,6 @@ local a1b2c3d4e5f6... # 自动创建的匿名卷
|
||||
|
||||
#### 2. 可被命名卷覆盖
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用命名卷替代匿名卷
|
||||
|
||||
@@ -96,8 +88,6 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
|
||||
|
||||
#### 3. 可被 Bind Mount 覆盖
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用宿主机目录替代
|
||||
|
||||
@@ -121,10 +111,6 @@ RUN echo "hello" > /data/test.txt
|
||||
|
||||
**原因**:VOLUME 指令之后,Docker 将该目录视为外部挂载点,不再记录对它的修改。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 正确做法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -145,8 +131,6 @@ VOLUME /data
|
||||
|
||||
### 7.8.6 常见使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 数据库持久化
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -178,8 +162,6 @@ VOLUME /app/uploads
|
||||
|
||||
### 7.8.7 查看 VOLUME 定义
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看镜像定义的 VOLUME
|
||||
|
||||
@@ -197,8 +179,6 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
|
||||
### 7.8.8 VOLUME vs docker run -v
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | Dockerfile VOLUME | docker run -v |
|
||||
|------|-------------------|---------------|
|
||||
| **定义时机** | 镜像构建时 | 容器运行时 |
|
||||
@@ -232,16 +212,8 @@ volumes:
|
||||
|
||||
### 7.8.10 安全注意事项
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 匿名卷可能导致数据丢失
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用 --rm 运行的容器,匿名卷会在容器删除时一起删除
|
||||
|
||||
@@ -261,8 +233,6 @@ $ docker run -v mysql_data:/var/lib/mysql mysql:8.0
|
||||
|
||||
### 7.8.11 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 定义必须持久化的路径
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.9 EXPOSE 声明端口
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 7.9.1 基本语法
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -37,8 +35,6 @@ EXPOSE 53/udp
|
||||
|
||||
### 7.9.3 EXPOSE 的作用
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 文档说明
|
||||
|
||||
告诉镜像使用者,容器将在哪些端口提供服务:
|
||||
@@ -76,8 +72,6 @@ $ docker port $(docker ps -q)
|
||||
|
||||
### 7.9.4 EXPOSE vs -p
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | EXPOSE | -p |
|
||||
|------|--------|-----|
|
||||
| **位置** | Dockerfile | docker run 命令 |
|
||||
@@ -92,10 +86,6 @@ flowchart TD
|
||||
Expose ~~~ Run
|
||||
```
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 没有 EXPOSE 也能 -p
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -119,8 +109,6 @@ $ docker run -p 8080:80 mynginx
|
||||
|
||||
### 7.9.5 常见误解
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 误解:EXPOSE 会打开端口
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -160,8 +148,6 @@ $ docker run -p 8080:80 nginx # 2. 映射:宿主机 8080 → 容器 80
|
||||
|
||||
### 7.9.6 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 总是声明应用使用的端口
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# 第七章 Dockerfile 指令详解
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
## 什么是 Dockerfile
|
||||
|
||||
Dockerfile 是一个文本文件,其內包含了一条条的 **指令 (Instruction)**,每一条指令构建一层,therefore 每一条指令的内容,就是描述该层应当如何构建。
|
||||
@@ -19,10 +17,6 @@ Dockerfile 是一个文本文件,其內包含了一条条的 **指令 (Instruc
|
||||
|
||||
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。
|
||||
|
||||
### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
### 指令详解
|
||||
|
||||
本章将详细讲解 Dockerfile 中的各个指令:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 7.19 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 要点 | 说明 |
|
||||
|------|------|
|
||||
| **作用** | 设置后续指令的工作目录 |
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 8.2 数据卷
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 8.2.1 为什么需要数据卷
|
||||
|
||||
容器的存储层有一个关键问题:**容器删除后,数据就没了**。
|
||||
@@ -19,8 +17,6 @@ flowchart LR
|
||||
|
||||
### 8.2.2 数据卷的特性
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | 说明 |
|
||||
|------|------|
|
||||
| **持久化** | 容器删除后数据仍然保留 |
|
||||
@@ -33,8 +29,6 @@ flowchart LR
|
||||
|
||||
### 8.2.3 数据卷 vs 容器存储层
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 容器存储层 (不推荐存储重要数据)
|
||||
|
||||
如下代码块所示,展示了相关示例:
|
||||
@@ -73,20 +67,14 @@ graph TD
|
||||
|
||||
### 8.2.4 数据卷基本操作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 创建数据卷
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker volume create my-vol
|
||||
```
|
||||
|
||||
#### 列出所有数据卷
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker volume ls
|
||||
DRIVER VOLUME NAME
|
||||
@@ -97,8 +85,6 @@ local redis_data
|
||||
|
||||
#### 查看数据卷详情
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker volume inspect my-vol
|
||||
[
|
||||
@@ -123,12 +109,8 @@ $ docker volume inspect my-vol
|
||||
|
||||
### 8.2.5 挂载数据卷
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 方式一:--mount (推荐)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
--name web \
|
||||
@@ -146,8 +128,6 @@ $ docker run -d \
|
||||
|
||||
#### 方式二:-v (简写)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
--name web \
|
||||
@@ -159,8 +139,6 @@ $ docker run -d \
|
||||
|
||||
#### 两种方式对比
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | --mount | -v |
|
||||
|------|---------|-----|
|
||||
| 语法 | 键值对,更清晰 | 冒号分隔,更简洁 |
|
||||
@@ -169,8 +147,6 @@ $ docker run -d \
|
||||
|
||||
#### 只读挂载
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## --mount 方式
|
||||
|
||||
@@ -189,12 +165,8 @@ $ docker run -d \
|
||||
|
||||
### 8.2.6 使用场景示例
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 场景一:数据库持久化
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 创建数据卷
|
||||
|
||||
@@ -223,8 +195,6 @@ $ docker run -d \
|
||||
|
||||
#### 场景二:多容器共享数据
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 创建共享数据卷
|
||||
|
||||
@@ -245,8 +215,6 @@ $ docker run --rm \
|
||||
|
||||
#### 场景三:配置文件持久化
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 将 nginx 配置存储在数据卷中
|
||||
|
||||
@@ -261,12 +229,8 @@ $ docker run -d \
|
||||
|
||||
### 8.2.7 数据卷管理
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 删除数据卷
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 删除指定数据卷
|
||||
|
||||
@@ -279,8 +243,6 @@ $ docker rm -v container_name
|
||||
|
||||
#### 清理未使用的数据卷
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看未被任何容器使用的数据卷
|
||||
|
||||
@@ -301,12 +263,8 @@ $ docker volume prune -f
|
||||
|
||||
### 8.2.8 数据卷备份与恢复
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 备份数据卷
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 使用临时容器挂载数据卷,打包备份
|
||||
|
||||
@@ -325,8 +283,6 @@ $ docker run --rm \
|
||||
|
||||
#### 恢复数据卷
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 创建新数据卷
|
||||
|
||||
@@ -342,8 +298,6 @@ $ docker run --rm \
|
||||
|
||||
#### 备份脚本示例
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
## backup-volume.sh
|
||||
@@ -390,20 +344,14 @@ $ docker run -v /host/path:/app/data nginx
|
||||
|
||||
### 8.2.10 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:如何知道容器使用了哪些数据卷?
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker inspect container_name --format '{{json .Mounts}}' | jq
|
||||
```
|
||||
|
||||
#### Q:数据卷的数据在哪里?
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看数据卷详情
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 8.3 挂载主机目录
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 8.3.1 什么是绑定挂载
|
||||
|
||||
Bind Mount (绑定挂载) 将 **宿主机的目录或文件** 直接挂载到容器中。容器可以读写宿主机的文件系统。
|
||||
@@ -25,8 +23,6 @@ flowchart LR
|
||||
|
||||
### 8.3.2 Bind Mount vs Volume
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | Bind Mount | Volume |
|
||||
|------|------------|--------|
|
||||
| **数据位置** | 宿主机任意路径 | Docker 管理的目录 |
|
||||
@@ -36,14 +32,8 @@ flowchart LR
|
||||
| **适用场景** | 开发环境、配置文件 | 生产数据持久化 |
|
||||
| **备份** | 直接访问文件 | 需要通过 Docker |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 选择建议
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 需求 | 推荐方案 |
|
||||
|------|----------|
|
||||
| 开发时同步代码 | Bind Mount |
|
||||
@@ -57,12 +47,8 @@ flowchart LR
|
||||
|
||||
### 8.3.3 基本语法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 使用 --mount (推荐)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
--mount type=bind,source=/宿主机路径,target=/容器路径 \
|
||||
@@ -71,8 +57,6 @@ $ docker run -d \
|
||||
|
||||
#### 使用 -v (简写)
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -d \
|
||||
-v /宿主机路径:/容器路径 \
|
||||
@@ -81,8 +65,6 @@ $ docker run -d \
|
||||
|
||||
#### 两种语法对比
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | --mount | -v |
|
||||
|------|---------|-----|
|
||||
| 语法 | 键值对,更清晰 | 冒号分隔,更简洁 |
|
||||
@@ -93,12 +75,8 @@ $ docker run -d \
|
||||
|
||||
### 8.3.4 使用场景
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 场景一:开发环境代码同步
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 将本地代码目录挂载到容器
|
||||
|
||||
@@ -117,8 +95,6 @@ $ echo "Hello" > src/index.html
|
||||
|
||||
#### 场景二:配置文件挂载
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 挂载自定义 nginx 配置
|
||||
|
||||
@@ -129,8 +105,6 @@ $ docker run -d \
|
||||
|
||||
#### 场景三:日志收集
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 将容器日志输出到宿主机目录
|
||||
|
||||
@@ -141,8 +115,6 @@ $ docker run -d \
|
||||
|
||||
#### 场景四:共享 SSH 密钥
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 挂载 SSH 密钥(只读)
|
||||
|
||||
@@ -182,8 +154,6 @@ touch: /app/config/new.txt: Read-only file system
|
||||
|
||||
### 8.3.6 挂载单个文件
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 挂载 bash 历史记录
|
||||
|
||||
@@ -204,8 +174,6 @@ $ docker run -d \
|
||||
|
||||
### 8.3.7 查看挂载信息
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
```
|
||||
@@ -237,12 +205,8 @@ $ docker inspect mycontainer --format '{{json .Mounts}}' | jq
|
||||
|
||||
### 8.3.8 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:路径不存在报错
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run --mount type=bind,source=/not/exist,target=/app nginx
|
||||
docker: Error response from daemon: invalid mount config for type "bind":
|
||||
@@ -289,12 +253,8 @@ $ docker run -v /host/path:/container/path:cached myapp
|
||||
|
||||
### 8.3.9 最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 开发环境使用 Bind Mount
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 代码热更新
|
||||
|
||||
@@ -303,8 +263,6 @@ $ docker run -v $(pwd):/app -p 3000:3000 node npm run dev
|
||||
|
||||
#### 2. 生产环境使用 Volume
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 数据持久化
|
||||
|
||||
@@ -313,16 +271,12 @@ $ docker run -v mysql_data:/var/lib/mysql mysql
|
||||
|
||||
#### 3. 配置文件使用只读挂载
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -v /config/nginx.conf:/etc/nginx/nginx.conf:ro nginx
|
||||
```
|
||||
|
||||
#### 4. 注意路径安全
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## ❌ 危险:挂载根目录或敏感目录
|
||||
|
||||
|
||||
@@ -30,8 +30,6 @@ $ docker run --mount type=tmpfs,destination=/run,tmpfs-size=67108864 nginx
|
||||
|
||||
### 8.4.4 与 Volume / Bind Mount 对比
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 类型 | 数据位置 | 持久化 | 典型用途 |
|
||||
|------|---------|-------|---------|
|
||||
| Volume | Docker 管理目录 | 是 | 数据库、长期业务数据 |
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 数据管理
|
||||
# 第八章 数据管理
|
||||
|
||||
如图 8-1 所示,Docker 数据管理主要围绕三类挂载方式展开。
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 8.5 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 要点 | 说明 |
|
||||
|------|------|
|
||||
| **作用** | 将宿主机目录挂载到容器 |
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 网络配置
|
||||
# 第九章 网络配置
|
||||
|
||||
Docker 容器需要网络来与外部世界通信、容器之间相互通信以及与宿主机通信。Docker 在安装时会自动配置网络基础设施,大多数情况下开箱即用。
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 10.2 使用 Buildx 构建镜像
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 10.2.1 使用
|
||||
|
||||
Buildx 的使用非常直观,绝大多数情况下可以替代 `docker build` 命令。
|
||||
|
||||
@@ -109,8 +109,6 @@ ENTRYPOINT ["/dist"]
|
||||
|
||||
#### 创建 manifest list
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 首先,为每个架构构建并推送镜像
|
||||
|
||||
|
||||
@@ -4,10 +4,6 @@ Docker Buildx 是一个 docker CLI 插件,其扩展了 docker 命令,支持
|
||||
|
||||
> Buildx 需要 Docker v19.03+。在较新版本中已更常用且功能更完整。
|
||||
|
||||
## 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
## 本章内容
|
||||
|
||||
本章将详细介绍 Docker Buildx 的使用,包括:
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
|
||||
### 11.1.1 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
### 11.1.2 模板文件规范
|
||||
|
||||
Compose 模板文件采用 YAML 格式,扩展名为 `.yml` 或 `.yaml`。
|
||||
|
||||
@@ -34,8 +34,6 @@ $ chmod +x $DOCKER_CONFIG/cli-plugins/docker-compose
|
||||
|
||||
### 11.2.2 测试安装
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose version
|
||||
Docker Compose version v5.0.2
|
||||
@@ -43,8 +41,6 @@ Docker Compose version v5.0.2
|
||||
|
||||
### 11.2.3 bash 补全命令
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ curl -L https://raw.githubusercontent.com/docker/compose/v5.0.2/contrib/completion/bash/docker-compose | sudo tee /etc/bash_completion.d/docker-compose > /dev/null
|
||||
```
|
||||
|
||||
@@ -67,8 +67,6 @@ services:
|
||||
|
||||
#### 运行 compose 项目
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose up
|
||||
```
|
||||
@@ -80,24 +78,18 @@ $ docker compose up
|
||||
|
||||
#### 后台运行
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose up -d
|
||||
```
|
||||
|
||||
#### 停止
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose stop
|
||||
```
|
||||
|
||||
#### 进入服务
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose exec redis sh
|
||||
/data # redis-cli
|
||||
@@ -107,48 +99,36 @@ $ docker compose exec redis sh
|
||||
|
||||
#### 查看日志
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose logs -f
|
||||
```
|
||||
|
||||
#### 构建镜像
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose build
|
||||
```
|
||||
|
||||
#### 启动服务
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose start
|
||||
```
|
||||
|
||||
#### 运行一次性命令
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose run web python app.py
|
||||
```
|
||||
|
||||
#### 验证 Compose 文件
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose config
|
||||
```
|
||||
|
||||
#### 删除项目
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose down
|
||||
```
|
||||
|
||||
@@ -26,8 +26,6 @@ docker compose [-f=<arg>...] [options] [COMMAND] [ARGS...]
|
||||
|
||||
### 11.4.3 命令使用说明
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### `build`
|
||||
|
||||
格式为 `docker compose build [options] [SERVICE...]`。
|
||||
|
||||
@@ -254,8 +254,6 @@ ALLOWED_HOSTS = ['*']
|
||||
|
||||
### 11.6.8 步骤 6:启动应用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose up
|
||||
```
|
||||
@@ -301,8 +299,6 @@ $ docker compose exec db psql -U django_user -d django_db
|
||||
|
||||
### 11.6.10 常见问题排查
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q1:数据库连接失败
|
||||
|
||||
**错误信息**:`django.db.utils.OperationalError: could not connect to server` **可能原因与解决方案**:
|
||||
@@ -330,8 +326,6 @@ $ docker compose logs db
|
||||
|
||||
#### Q3:权限问题
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 如果容器内创建的文件 root 用户所有
|
||||
|
||||
|
||||
@@ -194,8 +194,6 @@ production:
|
||||
|
||||
### 11.7.9 步骤 7:启动应用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose up
|
||||
```
|
||||
@@ -226,8 +224,6 @@ Created database 'myapp_test'
|
||||
|
||||
### 11.7.11 常用开发命令
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 数据库迁移
|
||||
|
||||
@@ -252,8 +248,6 @@ $ docker compose exec web bash
|
||||
|
||||
### 11.7.12 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:数据库连接失败
|
||||
|
||||
检查 `DATABASE_URL` 环境变量格式是否正确,确保 db 服务已启动:
|
||||
@@ -283,8 +277,6 @@ $ docker compose run --rm web bundle update
|
||||
|
||||
### 11.7.13 开发 vs 生产
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 配置项 | 开发环境 | 生产环境 |
|
||||
|--------|---------|---------|
|
||||
| Rails 服务器 | Puma (开发模式) | Puma + Nginx |
|
||||
|
||||
@@ -81,8 +81,6 @@ networks:
|
||||
|
||||
### 11.8.3 配置文件详解
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 环境变量 (.env)
|
||||
|
||||
为了安全,不要在 `compose.yaml` 中直接写密码。创建 `.env` 文件:
|
||||
@@ -136,8 +134,6 @@ $ docker compose logs -f
|
||||
|
||||
### 11.8.5 生产环境最佳实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 1. 数据库备份
|
||||
|
||||
不要只依赖 Volume。建议定期备份数据库:
|
||||
@@ -194,8 +190,6 @@ WordPress 支持 Redis 缓存以提高性能。
|
||||
|
||||
### 11.8.6 常见问题
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Q:数据库连接错误
|
||||
|
||||
**现象**:访问页面显示 “Error establishing a database connection”。**排查**:
|
||||
|
||||
@@ -142,8 +142,6 @@ flowchart TD
|
||||
|
||||
### 12.1.6 总结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 组件 | 角色 | 关键职责 |
|
||||
|------|------|----------|
|
||||
| **CLI** | 指挥官 | 发送指令,展示结果 |
|
||||
|
||||
@@ -52,8 +52,6 @@ PID Namespace 负责进程 ID 的隔离,使得容器内的进程彼此不可
|
||||
|
||||
#### PID 隔离效果
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 宿主机上查看进程
|
||||
|
||||
@@ -141,8 +139,6 @@ MNT Namespace 负责文件系统挂载点的隔离,确保容器看到独立的
|
||||
|
||||
#### 与 chroot 的区别
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | chroot | MNT Namespace |
|
||||
|------|--------|---------------|
|
||||
| 安全性 | 可以逃逸 | 更安全 |
|
||||
@@ -161,8 +157,6 @@ UTS Namespace 主要用于隔离主机名和域名。
|
||||
|
||||
#### UTS 隔离效果
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 宿主机
|
||||
|
||||
@@ -244,8 +238,6 @@ flowchart LR
|
||||
|
||||
#### 实验 1:UTS Namespace
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 创建新的 UTS namespace 并启动 shell
|
||||
|
||||
@@ -266,8 +258,6 @@ my-server
|
||||
|
||||
#### 实验 2:PID Namespace
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 创建新的 PID 和 MNT namespace
|
||||
|
||||
@@ -287,8 +277,6 @@ root 8 0.0 0.0 10072 3200 pts/0 R+ 10:00 0:00 ps aux
|
||||
|
||||
#### 实验 3:NET Namespace
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 创建新的网络 namespace
|
||||
|
||||
|
||||
@@ -33,8 +33,6 @@ flowchart LR
|
||||
|
||||
### 12.3.2 cgroups 的历史
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 时间 | 事件 |
|
||||
|------|------|
|
||||
| 2006 | Google 工程师提出 cgroups 概念 |
|
||||
@@ -46,8 +44,6 @@ flowchart LR
|
||||
|
||||
### 12.3.3 cgroups 可以限制的资源
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 资源类型 | 子系统 | 说明 |
|
||||
|---------|--------|------|
|
||||
| **CPU** | `cpu`, `cpuset` | CPU 使用时间和核心分配 |
|
||||
@@ -64,8 +60,6 @@ Docker 提供了丰富的参数来配置容器的资源限制,主要包括内
|
||||
|
||||
#### 内存限制
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 限制容器最多使用 512MB 内存
|
||||
|
||||
@@ -89,8 +83,6 @@ $ docker run --memory-reservation 256m myapp
|
||||
|
||||
#### CPU 限制
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 限制使用 1.5 个 CPU 核心
|
||||
|
||||
@@ -114,8 +106,6 @@ $ docker run --cpu-shares=512 myapp
|
||||
|
||||
#### 磁盘 I/O 限制
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 限制设备写入速度为 10MB/s
|
||||
|
||||
@@ -132,8 +122,6 @@ $ docker run --device-write-iops /dev/sda:100 myapp
|
||||
|
||||
#### 进程数限制
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 限制最多 100 个进程
|
||||
|
||||
@@ -144,8 +132,6 @@ $ docker run --pids-limit=100 myapp
|
||||
|
||||
### 12.3.5 查看容器资源使用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 实时监控所有容器的资源使用
|
||||
|
||||
@@ -167,12 +153,8 @@ $ docker inspect mycontainer --format '{{json .HostConfig}}' | jq
|
||||
|
||||
### 12.3.6 资源限制的效果
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 内存超限
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 启动限制 100MB 内存的容器
|
||||
|
||||
@@ -191,8 +173,6 @@ abc123 Exited (137) 5 seconds ago hopeful_darwin
|
||||
|
||||
#### CPU 限制验证
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 不限制 CPU
|
||||
|
||||
@@ -211,8 +191,6 @@ $ docker run --rm --cpus=1 stress --cpu 4
|
||||
|
||||
### 12.3.7 cgroups v1 vs v2
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 特性 | cgroups v1 | cgroups v2 |
|
||||
|------|-----------|-----------|
|
||||
| 层级结构 | 多层级 (每个资源单独)| 统一层级 |
|
||||
@@ -221,14 +199,8 @@ $ docker run --rm --cpus=1 stress --cpu 4
|
||||
| PSI (压力监控)| ❌ | ✅ |
|
||||
| rootless 容器 | 部分支持 | 完整支持 |
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 检查系统使用的版本
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看 cgroup 版本
|
||||
|
||||
@@ -271,8 +243,6 @@ services:
|
||||
|
||||
#### 1. 始终设置内存限制
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 防止 OOM 影响宿主机
|
||||
|
||||
@@ -281,16 +251,12 @@ $ docker run -m 1g myapp
|
||||
|
||||
#### 2. 为关键应用设置 CPU 保证
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run --cpus=2 --cpu-shares=2048 critical-app
|
||||
```
|
||||
|
||||
#### 3. 监控资源使用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 配合 Prometheus + cAdvisor 监控
|
||||
|
||||
|
||||
@@ -107,8 +107,6 @@ Docker 可使用多种联合文件系统实现:
|
||||
|
||||
#### 各发行版推荐
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| Linux 发行版 | 推荐存储驱动 |
|
||||
|-------------|-------------|
|
||||
| Ubuntu 16.04+ | overlay2 |
|
||||
@@ -119,8 +117,6 @@ Docker 可使用多种联合文件系统实现:
|
||||
|
||||
#### 查看当前存储驱动
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker info | grep "Storage Driver"
|
||||
Storage Driver: overlay2
|
||||
@@ -152,14 +148,8 @@ flowchart TD
|
||||
- **workdir**:OverlayFS 的工作目录
|
||||
- **merged**:联合挂载后的视图
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 文件操作行为
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 操作 | 行为 |
|
||||
|------|------|
|
||||
| **读取** | 从上到下查找第一个匹配的文件 |
|
||||
@@ -171,8 +161,6 @@ flowchart TD
|
||||
|
||||
### 12.4.6 查看镜像层
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 查看镜像的层信息
|
||||
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 12.7 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| Namespace | 隔离内容 | 一句话说明 |
|
||||
|-----------|---------|-----------|
|
||||
| PID | 进程 ID | 容器有自己的进程树 |
|
||||
|
||||
@@ -32,8 +32,6 @@ Kubernetes 完美解决了这些问题。
|
||||
|
||||
### 13.1.3 核心概念
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Pod (豆荚)
|
||||
|
||||
Kubernetes 的最小调度单位。一个 Pod 可以包含一个或多个紧密协作的容器 (共享网络和存储)。就像豌豆荚里的豌豆一样。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Kubernetes
|
||||
# 第十三章 容器编排基础
|
||||
|
||||
`Kubernetes` 是 Google 发起的开源容器编排系统,它支持多种云平台与私有数据中心。
|
||||
|
||||
|
||||
@@ -234,8 +234,6 @@ oom_score = 0
|
||||
|
||||
#### Ubuntu/Debian
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ K8S_MINOR="v1.35"
|
||||
|
||||
@@ -256,8 +254,6 @@ $ sudo apt-mark hold kubelet kubeadm kubectl
|
||||
|
||||
#### CentOS/Fedora
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ K8S_MINOR="v1.35"
|
||||
|
||||
@@ -276,12 +272,8 @@ $ sudo yum install -y kubelet kubeadm kubectl cri-tools kubernetes-cni
|
||||
|
||||
### 14.1.4 修改内核的运行参数
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 加载内核模块
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
|
||||
overlay
|
||||
@@ -303,8 +295,6 @@ $ sudo swapoff -a
|
||||
|
||||
```
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
|
||||
net.bridge.bridge-nf-call-iptables = 1
|
||||
@@ -321,10 +311,6 @@ $ sysctl --system
|
||||
|
||||
为了让 kubelet 正确运行,我们需要对其进行一些必要的配置。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 修改 `kubelet.service`
|
||||
|
||||
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
|
||||
@@ -351,8 +337,6 @@ $ sudo systemctl daemon-reload
|
||||
|
||||
#### master
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ systemctl enable cri-containerd
|
||||
|
||||
@@ -448,10 +432,6 @@ CONTAINER_RUNTIME_ENDPOINT=/run/cri-containerd/cri-containerd.sock crictl ps -a
|
||||
|
||||
这里以 `flannel` 为例进行介绍。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### flannel
|
||||
|
||||
检查 podCIDR 设置
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
#### Ubuntu/Debian
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ K8S_MINOR="v1.35"
|
||||
|
||||
@@ -38,8 +36,6 @@ $ sudo apt-mark hold kubelet kubeadm kubectl
|
||||
|
||||
#### CentOS/Fedora
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ K8S_MINOR="v1.35"
|
||||
|
||||
@@ -58,12 +54,8 @@ $ sudo yum install -y kubelet kubeadm kubectl
|
||||
|
||||
### 14.2.3 修改内核的运行参数
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 加载内核模块
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
|
||||
overlay
|
||||
@@ -85,8 +77,6 @@ $ sudo swapoff -a
|
||||
|
||||
```
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
|
||||
net.bridge.bridge-nf-call-iptables = 1
|
||||
@@ -103,10 +93,6 @@ $ sysctl --system
|
||||
|
||||
为了让 kubelet 正确运行,我们需要对其进行一些必要的配置。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### 修改 `kubelet.service`
|
||||
|
||||
`/etc/systemd/system/kubelet.service.d/10-proxy-ipvs.conf` 写入以下内容
|
||||
@@ -133,8 +119,6 @@ $ sudo systemctl daemon-reload
|
||||
|
||||
#### master
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ sudo kubeadm init --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
|
||||
--pod-network-cidr 10.244.0.0/16 \
|
||||
@@ -214,10 +198,6 @@ $ kubeadm join 192.168.199.100:6443 --token cz81zt.orsy9gm9v649e5lf \
|
||||
|
||||
这里以 `flannel` 为例进行介绍。
|
||||
|
||||
#### 概述
|
||||
|
||||
总体概述了以下内容。
|
||||
|
||||
#### flannel
|
||||
|
||||
检查 podCIDR 设置
|
||||
|
||||
@@ -12,8 +12,6 @@
|
||||
|
||||
### 14.3.2 测试
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ kubectl version
|
||||
```
|
||||
|
||||
@@ -17,8 +17,6 @@ Kind 是一个二进制文件,并在 PATH 中即可使用。以下是不同系
|
||||
|
||||
#### macOS
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
brew install kind
|
||||
```
|
||||
@@ -83,8 +81,6 @@ kind create cluster --config kind-config.yaml
|
||||
|
||||
### 14.4.6 删除集群
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
kind delete cluster
|
||||
```
|
||||
|
||||
@@ -25,8 +25,6 @@ curl -sfL https://get.k3s.io | sh -
|
||||
|
||||
#### 查看状态
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
sudo k3s kubectl get nodes
|
||||
```
|
||||
@@ -53,8 +51,6 @@ kubectl get pods -A
|
||||
|
||||
### 14.5.4 清理卸载
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
/usr/local/bin/k3s-uninstall.sh
|
||||
```
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 部署 Kubernetes
|
||||
# 第十四章 部署 Kubernetes
|
||||
|
||||
目前,Kubernetes 支持在多种环境下使用,包括本地主机 (Ubuntu、Debian、CentOS、Fedora 等)、云服务 ([腾讯云](https://cloud.tencent.com/act/cps/redirect?redirect=10058&cps_key=3a5255852d5db99dcd5da4c72f05df61)、[阿里云](https://www.aliyun.com/product/kubernetes?source=5176.11533457&userCode=8lx5zmtu&type=copy)、[百度云](https://cloud.baidu.com/product/cce.html)等)。
|
||||
|
||||
|
||||
@@ -91,8 +91,6 @@ quay.io/coreos/etcd:v3.4.0 \
|
||||
|
||||
### 15.2.3 macOS 中运行
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ brew install etcd
|
||||
|
||||
|
||||
@@ -91,8 +91,6 @@ etcd 在键的组织上采用了层次化的空间结构 (类似于文件系统
|
||||
|
||||
#### put
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ etcdctl put /testdir/testkey "Hello world"
|
||||
OK
|
||||
@@ -127,8 +125,6 @@ $ etcdctl del testkey
|
||||
|
||||
### 15.4.2 非数据库操作
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### watch
|
||||
|
||||
监测一个键值的变化,一旦键值发生更新,就会输出最新的值。
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
# etcd
|
||||
# 第十五章 Etcd 项目
|
||||
|
||||
`etcd` 是 `CoreOS` 团队发起的一个管理配置信息和服务发现 (`Service Discovery`) 的项目,在这一章里面,我们将基于 `etcd 3.x` 版本介绍该项目的目标,安装和使用,以及实现的技术。
|
||||
|
||||
@@ -1,10 +1,8 @@
|
||||
## 16.6 多云部署策略比较
|
||||
## 16.5 多云部署策略比较
|
||||
|
||||
企业在选择容器云平台时,通常会在 AWS EKS,Azure AKS,Google GKE 以及国内的阿里云 ACK,腾讯云 TKE 之间进行权衡。
|
||||
|
||||
### 16.6.1 三大公有云 Kubernetes 服务对比
|
||||
|
||||
相关信息如下表:
|
||||
### 16.5.1 三大公有云 Kubernetes 服务对比
|
||||
|
||||
| 特性 | Google GKE | AWS EKS | Azure AKS |
|
||||
| :--- | :--- | :--- | :--- |
|
||||
@@ -14,7 +12,7 @@
|
||||
| **网络模型** | VPC-native, 性能优秀 | AWS VPC CNI, Pod 直接获取 VPC IP | Azure CNI (消耗 IP 多) 或 Kubenet |
|
||||
| **集成度** | 与 GCP 数据分析、AI 服务集成紧密 | 与 AWS IAM, ALB, CloudWatch 集成深度高 | 与 Active Directory, Azure DevOps 集成好 |
|
||||
|
||||
### 16.6.2 多云部署策略
|
||||
### 16.5.2 多云部署策略
|
||||
|
||||
随着企业业务的扩展,单一云平台可能无法满足所有需求,多云部署成为趋势。
|
||||
|
||||
@@ -38,7 +36,7 @@
|
||||
|
||||
* **工具**:Google Anthos,AWS Outposts,Azure Arc 都是为了解决混合云统一管理而生。
|
||||
|
||||
### 16.6.3 建议
|
||||
### 16.5.3 建议
|
||||
|
||||
* **技术选型**:尽量使用标准的 Kubernetes API,避免过度依赖特定云厂商的 CRD 或专有服务,以保持应用的可移植性。
|
||||
* **IaC 管理**:使用 Terraform 或 Pulumi 等工具统一管理多云基础设施。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 容器与云计算
|
||||
# 第十六章 容器与云计算
|
||||
|
||||
Docker 目前已经得到了众多公有云平台的支持,并成为除虚拟机之外的核心云业务。
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
## 16.5 本章小结
|
||||
## 16.6 本章小结
|
||||
|
||||
本章介绍了公有云服务对 Docker 的积极支持,以及新出现的容器云平台。
|
||||
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
|
||||
### 17.1.1 FCOS 特性
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### 一个最小化操作系统
|
||||
|
||||
FCOS 被设计成一个基于容器的最小化的现代操作系统。它比现有的 Linux 安装平均节省 40% 的 RAM (大约 114M) 并允许从 PXE 或 iPXE 非常快速的启动。
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
## 17.2 安装 Fedora CoreOS
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 17.2.1 下载 ISO
|
||||
|
||||
在[下载页面](https://getfedora.org/coreos/download/) `Bare Metal & Virtualized` 标签页下载 ISO。
|
||||
@@ -26,8 +24,6 @@ passwd:
|
||||
|
||||
### 17.2.3 转换 FCC 为 Ignition
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run -i --rm quay.io/coreos/fcct:v0.5.0 --pretty --strict < example.fcc > example.ign
|
||||
```
|
||||
@@ -46,8 +42,6 @@ $ sudo coreos-installer install /dev/sda --ignition-file example.ign
|
||||
|
||||
### 17.2.5 使用
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ ssh core@虚拟机IP
|
||||
|
||||
|
||||
@@ -19,8 +19,6 @@ Podman 支持多种操作系统,安装过程也相对简单。
|
||||
|
||||
### 17.3.1 CentOS / RHEL
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ sudo yum -y install podman
|
||||
```
|
||||
@@ -41,8 +39,6 @@ $ podman machine start
|
||||
|
||||
### 17.3.1 运行容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## $ docker run -d -p 80:80 nginx:alpine
|
||||
|
||||
@@ -51,16 +47,12 @@ $ podman run -d -p 80:80 nginx:alpine
|
||||
|
||||
### 17.3.2 列出容器
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ podman ps
|
||||
```
|
||||
|
||||
### 17.3.3 构建镜像
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ podman build -t myimage .
|
||||
```
|
||||
@@ -89,8 +81,6 @@ $ alias docker=podman
|
||||
|
||||
### 17.3.1 进阶用法
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
#### Systemd 集成
|
||||
|
||||
Podman 可以生成 systemd 单元文件,让容器像普通系统服务一样管理。
|
||||
|
||||
@@ -12,7 +12,7 @@ Docker 容器和 LXC 容器很相似,所提供的安全特性也差不多。
|
||||
|
||||
那么,内核中实现命名空间和私有网络的代码是否足够成熟?
|
||||
|
||||
内核命名空间从 2.6.15 版本 (2008 年 7 月发布) 之后被引入,数年间,这些机制的可靠性在诸多大型生产系统中被实践验证。
|
||||
内核命名空间从 2.6.15 版本 (2006 年 1 月发布) 之后被引入,数年间,这些机制的可靠性在诸多大型生产系统中被实践验证。
|
||||
|
||||
实际上,命名空间的想法和设计提出的时间要更早,最初是为了在内核中引入一种机制来实现 [OpenVZ](https://en.wikipedia.org/wiki/OpenVZ) 的特性。
|
||||
而 OpenVZ 项目早在 2005 年就发布了,其设计和实现都已经十分成熟。
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 安全
|
||||
# 第十八章 安全
|
||||
|
||||
容器安全是生产环境部署的核心考量。本章介绍 Docker 的安全机制和最佳实践。
|
||||
|
||||
@@ -28,8 +28,6 @@ flowchart LR
|
||||
|
||||
## 核心安全机制
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 1. 命名空间
|
||||
|
||||
提供进程、网络、文件系统等资源的隔离:
|
||||
@@ -89,12 +87,8 @@ $ docker exec myapp cat /proc/1/status | grep Cap
|
||||
|
||||
## 镜像安全
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 使用可信镜像
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## ✅ 使用官方镜像
|
||||
|
||||
@@ -153,8 +147,6 @@ $ cosign verify --key cosign.pub $IMAGE
|
||||
|
||||
## 运行时安全
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 1. 非 root 用户运行
|
||||
|
||||
> 笔者强调:这是最重要的安全实践之一。
|
||||
@@ -187,8 +179,6 @@ $ docker run -u 1001:1001 myapp
|
||||
|
||||
### 2. 只读文件系统
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 根文件系统只读
|
||||
|
||||
@@ -201,8 +191,6 @@ $ docker run --read-only --tmpfs /tmp --tmpfs /var/run myapp
|
||||
|
||||
### 3. 禁用特权模式
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## ❌ 绝对不要在生产环境使用
|
||||
|
||||
@@ -215,8 +203,6 @@ $ docker run --cap-add=SYS_TIME myapp
|
||||
|
||||
### 4. 限制资源
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker run \
|
||||
-m 512m \ # 内存限制
|
||||
@@ -228,8 +214,6 @@ $ docker run \
|
||||
|
||||
### 5. 网络隔离
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
## 禁用网络(适用于不需要网络的任务)
|
||||
|
||||
@@ -245,12 +229,8 @@ $ docker run --network=isolated_net myapp
|
||||
|
||||
## Dockerfile 安全实践
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 1. 使用精简基础镜像
|
||||
|
||||
Dockerfile 内容如下:
|
||||
|
||||
```dockerfile
|
||||
## ✅ 好:使用精简镜像
|
||||
|
||||
@@ -265,8 +245,6 @@ FROM ubuntu:24.04 # ~78MB
|
||||
|
||||
### 2. 多阶段构建
|
||||
|
||||
Dockerfile 内容如下:
|
||||
|
||||
```dockerfile
|
||||
## 构建阶段
|
||||
|
||||
@@ -285,8 +263,6 @@ CMD ["node", "/app/server.js"]
|
||||
|
||||
### 3. 不存储敏感信息
|
||||
|
||||
Dockerfile 内容如下:
|
||||
|
||||
```dockerfile
|
||||
## ❌ 错误:敏感信息写入镜像
|
||||
|
||||
@@ -302,8 +278,6 @@ COPY .env /app/
|
||||
|
||||
### 4. 固定依赖版本
|
||||
|
||||
Dockerfile 内容如下:
|
||||
|
||||
```dockerfile
|
||||
## ✅ 固定版本
|
||||
|
||||
@@ -337,8 +311,6 @@ RUN apk add curl
|
||||
|
||||
## 高级安全方案
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### Seccomp 系统调用过滤
|
||||
|
||||
限制容器可以使用的系统调用:
|
||||
@@ -406,8 +378,6 @@ $ cosign verify --key cosign.pub $IMAGE
|
||||
|
||||
## 本章小结
|
||||
|
||||
相关信息如下表:
|
||||
|
||||
| 安全措施 | 重要程度 | 实现方式 |
|
||||
|---------|---------|---------|
|
||||
| 非 root 运行 | ⭐⭐⭐ | `USER` 指令 |
|
||||
|
||||
@@ -109,8 +109,6 @@ volumes:
|
||||
|
||||
#### 3. 启动服务
|
||||
|
||||
运行以下命令:
|
||||
|
||||
```bash
|
||||
$ docker compose up -d
|
||||
```
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# 20.2 Busybox
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 20.2.1 简介
|
||||
|
||||
下图直观地展示了本节内容:
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
# 20.3 Alpine
|
||||
|
||||
本节涵盖了相关内容与详细描述,主要探讨以下几个方面:
|
||||
|
||||
### 20.3.1 简介
|
||||
|
||||
下图直观地展示了本节内容:
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user