style: apply global formatting fixes (struct, spacing, zhlint)

This commit is contained in:
Baohua Yang
2026-02-21 11:08:52 -08:00
parent ad68b2d973
commit 79ac9c639a
159 changed files with 1708 additions and 882 deletions

View File

@@ -12,6 +12,8 @@
### 新建并启动
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基本语法
运行以下命令
@@ -22,7 +24,7 @@ docker run [选项] 镜像 [命令] [参数...]
#### 最简单的例子
输出 "Hello World" 后容器自动终止
输出 Hello World 后容器自动终止
```bash
$ docker run ubuntu:24.04 /bin/echo 'Hello world'
@@ -81,6 +83,8 @@ flowchart TD
### 常用启动选项
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基础选项
| 选项 | 说明 | 示例 |
@@ -191,7 +195,9 @@ root@ba267838cc1b:/# ps
### 常见问题
#### Q: 容器启动后立即退出
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器启动后立即退出
**原因**主进程执行完毕或无法保持运行
@@ -207,7 +213,7 @@ $ docker run -d nginx # nginx 是持续运行的服务
详细解释见[后台运行](5.2_daemon.md)
#### Q: 无法连接容器内的服务
#### Q无法连接容器内的服务
**原因**未正确映射端口
@@ -221,7 +227,7 @@ $ docker run -d nginx
$ docker run -d -p 80:80 nginx
```
#### Q: 容器内修改的文件丢失
#### Q容器内修改的文件丢失
**原因**未使用数据卷数据保存在容器存储层

View File

@@ -9,11 +9,13 @@
- **前台运行**程序占用当前终端输出直接显示关闭终端程序就停止
- **后台运行**程序在后台执行不占用终端终端关闭也不影响程序
Docker 容器默认是**前台运行**使用 `-d`detach参数可以让容器在后台运行
Docker 容器默认是**前台运行**使用 `-d` (detach) 参数可以让容器在后台运行
### 基本使用
#### 前台运行默认
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 前台运行 (默认)
运行以下命令
@@ -25,12 +27,12 @@ hello world
hello world
```
容器会把输出的结果STDOUT打印到宿主机上面此时
容器会把输出的结果 (STDOUT) 打印到宿主机上面此时
- 终端被占用无法执行其他命令
- `Ctrl+C` 会终止容器
- 关闭终端窗口容器也会停止
#### 后台运行使用 -d 参数
#### 后台运行 (使用 -d 参数)
运行以下命令
@@ -43,11 +45,11 @@ $ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep
- 容器在后台运行
- 返回容器的完整 ID
- 终端立即释放可以继续执行其他命令
- 输出不会直接显示需要用 `docker logs` 查看
- 输出不会直接显示 (需要用 `docker logs` 查看)
### 深入理解容器为什么会"立即退出"
### 深入理解容器为什么会 立即退出
> **这是初学者最常遇到的困惑** 理解这个问题你就理解了 Docker 的核心设计理念
> **这是初学者最常遇到的困惑**理解这个问题你就理解了 Docker 的核心设计理念
很多人尝试这样启动容器
@@ -59,6 +61,8 @@ $ docker run -d ubuntu:24.04
#### 核心原理容器的生命周期与主进程绑定
如下代码块所示展示了相关示例
```mermaid
flowchart TD
subgraph Lifecycle ["Docker 容器的生命周期 = 容器内 PID 1 进程的生命周期"]
@@ -71,15 +75,15 @@ flowchart TD
当你运行 `docker run -d ubuntu:24.04`
1. 容器启动
2. 没有指定命令默认执行 `/bin/bash`
3. 但没有交互式终端没有 `-it` 参数bash 发现没有输入源
3. 但没有交互式终端 (没有 `-it` 参数)bash 发现没有输入源
4. bash 立即退出
5. 主进程退出容器停止
**关键理解**
- `-d` 参数**不是**让容器"一直运行"
- `-d` 参数是让容器"在后台运行"能运行多久取决于主进程
- `-d` 参数**不是**让容器 一直运行
- `-d` 参数是让容器 在后台运行能运行多久取决于主进程
#### 常见的"立即退出"场景
#### 常见的 立即退出 场景
| 场景 | 原因 | 解决方案 |
|------|------|---------|
@@ -89,6 +93,8 @@ flowchart TD
### 查看后台容器
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 查看运行中的容器
运行以下命令
@@ -111,7 +117,7 @@ hello world
...
```
**实时查看日志**类似 `tail -f`
**实时查看日志** (类似 `tail -f`)
```bash
$ docker container logs -f 77b2dc01fe0f
@@ -125,11 +131,13 @@ $ docker container logs -f 77b2dc01fe0f
$ docker container ls -a
```
加上 `-a` 参数可以看到所有容器包括已停止的这对于调试"容器启动即退出"的问题非常有用
加上 `-a` 参数可以看到所有容器包括已停止的这对于调试 容器启动即退出 的问题非常有用
### 最佳实践
#### 1. 长期运行的服务使用 -d
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1长期运行的服务使用 -d
运行以下命令
@@ -147,7 +155,7 @@ $ docker run -d -p 3306:3306 mysql:8
$ docker run -d -p 6379:6379 redis
```
#### 2. 调试时先用前台模式
#### 2调试时先用前台模式
当容器启动有问题时**去掉 `-d` 参数**可以直接看到输出和错误
@@ -157,7 +165,7 @@ $ docker run -d -p 6379:6379 redis
$ docker run myimage:latest
```
#### 3. 使用 --rm 自动清理
#### 3使用 --rm 自动清理
对于一次性任务使用 `--rm` 参数让容器退出后自动删除
@@ -169,7 +177,7 @@ Hello, World!
...
```
#### 4. 配合日志查看
#### 4配合日志查看
运行以下命令
@@ -193,7 +201,9 @@ $ docker logs -t myapp
### 常见问题排查
#### Q: 容器启动后立即退出
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器启动后立即退出
1. **查看退出状态码**
```bash
@@ -214,7 +224,7 @@ $ docker logs -t myapp
```
#### Q: 容器在后台运行但无法访问服务
#### Q容器在后台运行但无法访问服务
1. **检查端口映射**
```bash
@@ -226,7 +236,7 @@ $ docker logs -t myapp
$ docker exec mycontainer ps aux
```
#### Q: 如何让已经在后台运行的容器回到前台
#### Q如何让已经在后台运行的容器回到前台
使用 `docker attach`

View File

@@ -14,7 +14,9 @@
---
### docker stop推荐
### docker stop (推荐)
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### docker stop 基本用法
@@ -67,6 +69,8 @@ $ docker stop $(docker ps -q)
### docker kill
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 基本用法
运行以下命令
@@ -140,6 +144,8 @@ c5d3a5e8f7b2 nginx "nginx" Up 5 minutes mynginx
### 重新启动容器
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 启动已停止的容器
运行以下命令
@@ -192,6 +198,8 @@ stateDiagram-v2
### 批量操作
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 停止所有容器
运行以下命令
@@ -220,7 +228,9 @@ $ docker stop $(docker ps -q) && docker container prune -f
### 常见问题
#### Q: 容器停止很慢
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器停止很慢
原因应用没有正确处理 SIGTERM 信号需要等待超时后强制终止
@@ -229,7 +239,7 @@ $ docker stop $(docker ps -q) && docker container prune -f
2. 使用 `docker stop -t 0` 立即终止
3. 检查 Dockerfile 中的 `STOPSIGNAL` 配置
#### Q: 如何让容器优雅退出
#### Q如何让容器优雅退出
确保容器主进程正确处理信号
@@ -243,7 +253,7 @@ FROM node:22
CMD ["node", "server.js"]
```
#### Q: 容器无法停止
#### Q容器无法停止
运行以下命令

View File

@@ -1,5 +1,7 @@
## 5.4 进入容器
本节涵盖了相关内容与详细描述主要探讨以下几个方面
### 为什么需要进入容器
使用 `-d` 参数启动容器后容器在后台运行以下场景需要进入容器内部操作
@@ -22,7 +24,9 @@ Docker 提供两种进入容器的命令:
---
### docker exec推荐
### docker exec (推荐)
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### docker exec 基本用法
@@ -115,7 +119,9 @@ root@69d137adef7a:/# # 有提示符
---
### docker attach谨慎使用
### docker attach (谨慎使用)
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### docker attach 基本用法
@@ -127,7 +133,7 @@ $ docker attach 容器名
#### 工作原理
`attach` 会附加到容器的**主进程**PID 1的标准输入输出
`attach` 会附加到容器的**主进程** (PID 1) 的标准输入输出
```mermaid
flowchart LR
@@ -228,7 +234,9 @@ flowchart LR
### 最佳实践
#### 1. 首选 docker exec
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 1首选 docker exec
运行以下命令
@@ -246,16 +254,16 @@ $ docker exec myapp tail -f /var/log/app.log
$ docker exec myapp python manage.py migrate
```
#### 2. 生产环境避免进入容器
#### 2生产环境避免进入容器
笔者建议生产环境应尽量避免进入容器直接操作而是通过
- 日志系统查看日志 `docker logs` 或集中式日志
- 日志系统查看日志 ( `docker logs` 或集中式日志)
- 监控系统查看状态
- 重新部署而非手动修改
#### 3. shell 镜像的处理
#### 3 shell 镜像的处理
某些精简镜像如基于 `scratch` `distroless`没有 shell
某些精简镜像 (如基于 `scratch` `distroless`) 没有 shell
```bash
## 这会失败
@@ -272,11 +280,13 @@ $ docker debug myapp
### 常见问题
#### Q: exec 进入后看不到其他终端的操作
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Qexec 进入后看不到其他终端的操作
这是正常的exec 启动的是独立进程多个 exec 会话互不影响
#### Q: 容器没有 bash
#### Q容器没有 bash
尝试使用 sh
@@ -284,7 +294,7 @@ $ docker debug myapp
$ docker exec -it myapp /bin/sh
```
#### Q: 需要 root 权限
#### Q需要 root 权限
运行以下命令

View File

@@ -31,4 +31,4 @@ test/ubuntu v1.0 9d37a6082e97 About a minute ago
$ docker import http://example.com/exampleimage.tgz example/imagerepo
```
*用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库也可以使用 `docker import` 来导入一个容器快照到本地镜像库这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息即仅保存容器当时的快照状态而镜像存储文件将保存完整记录体积也要大此外从容器快照文件导入时可以重新指定标签等元数据信息*
*用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库也可以使用 `docker import` 来导入一个容器快照到本地镜像库这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息 (即仅保存容器当时的快照状态)而镜像存储文件将保存完整记录体积也要大此外从容器快照文件导入时可以重新指定标签等元数据信息*

View File

@@ -65,6 +65,8 @@ $ docker rm -v mycontainer
### 批量删除
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 删除所有已停止的容器
运行以下命令
@@ -86,7 +88,7 @@ Total reclaimed space: 150MB
$ docker container prune -f
```
#### 删除所有容器包括运行中的
#### 删除所有容器 (包括运行中的)
运行以下命令
@@ -134,6 +136,10 @@ $ docker container prune --filter "until=24h"
| `before=xxx` | 在某容器之前创建 | `-f before=mycontainer` |
| `since=xxx` | 在某容器之后创建 | `-f since=mycontainer` |
#### 概述
总体概述了以下内容
#### 示例
运行以下命令
@@ -170,6 +176,8 @@ $ docker image rm nginx
### 清理策略建议
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### 开发环境
运行以下命令
@@ -227,7 +235,9 @@ docker system df
### 常见问题
#### Q: 容器无法删除
本节涵盖了相关内容与详细描述主要探讨以下几个方面
#### Q容器无法删除
运行以下命令
@@ -245,10 +255,10 @@ $ docker rm mycontainer
$ docker rm -f mycontainer
```
#### Q: 删除后磁盘空间没释放
#### Q删除后磁盘空间没释放
可能原因
1. 容器的数据卷未删除使用 `-v` 参数
1. 容器的数据卷未删除 (使用 `-v` 参数)
2. 镜像未删除
3. 构建缓存未清理

View File

@@ -1,8 +1,8 @@
# 第五章 操作容器
# 第五章操作容器
容器是 Docker 又一核心概念
简单的说容器是独立运行的一个或一组应用以及它们的运行态环境对应的虚拟机可以理解为模拟运行的一整套操作系统提供了运行态环境和其他系统环境和跑在上面的应用
简单的说容器是独立运行的一个或一组应用以及它们的运行态环境对应的虚拟机可以理解为模拟运行的一整套操作系统 (提供了运行态环境和其他系统环境) 和跑在上面的应用
本章将具体介绍如何来管理一个容器包括创建启动和停止等