mirror of
https://github.com/yeasy/docker_practice.git
synced 2026-03-25 19:25:27 +00:00
Remove blank lines after code block markers
This commit is contained in:
@@ -18,7 +18,6 @@
|
||||
```bash
|
||||
docker run [选项] 镜像 [命令] [参数...]
|
||||
```
|
||||
|
||||
#### 最简单的例子
|
||||
|
||||
输出 “Hello World” 后容器自动终止:
|
||||
@@ -27,7 +26,6 @@ docker run [选项] 镜像 [命令] [参数...]
|
||||
$ docker run ubuntu:24.04 /bin/echo 'Hello world'
|
||||
Hello world
|
||||
```
|
||||
|
||||
这与直接执行 `/bin/echo 'Hello world'` 几乎没有区别,但实际上已经启动了一个完整的 Ubuntu 容器来执行这条命令。
|
||||
|
||||
#### 交互式容器
|
||||
@@ -38,7 +36,6 @@ Hello world
|
||||
$ docker run -it ubuntu:24.04 /bin/bash
|
||||
root@af8bae53bdd3:/#
|
||||
```
|
||||
|
||||
**参数说明**:
|
||||
|
||||
| 参数 | 作用 |
|
||||
@@ -56,7 +53,6 @@ root@af8bae53bdd3:/# ls
|
||||
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
|
||||
root@af8bae53bdd3:/# exit # 退出容器
|
||||
```
|
||||
|
||||
### 5.1.3 docker run 的完整流程
|
||||
|
||||
执行 `docker run` 时,Docker 在后台完成以下操作:
|
||||
@@ -77,7 +73,6 @@ flowchart TD
|
||||
Step4["4. 启动容器,执行指定命令"] --> Step5
|
||||
Step5["5. 命令执行完毕,容器停止"]
|
||||
```
|
||||
|
||||
### 5.1.4 常用启动选项
|
||||
|
||||
#### 基础选项
|
||||
@@ -92,7 +87,6 @@ flowchart TD
|
||||
#### 端口映射
|
||||
|
||||
```bash
|
||||
|
||||
## 将容器的 80 端口映射到宿主机的 8080 端口
|
||||
|
||||
$ docker run -d -p 8080:80 nginx
|
||||
@@ -105,11 +99,9 @@ $ docker run -d -P nginx
|
||||
|
||||
$ docker run -d -p 127.0.0.1:8080:80 nginx
|
||||
```
|
||||
|
||||
#### 数据卷挂载
|
||||
|
||||
```bash
|
||||
|
||||
## 挂载命名卷
|
||||
|
||||
$ docker run -v mydata:/data nginx
|
||||
@@ -122,11 +114,9 @@ $ docker run -v /host/path:/container/path nginx
|
||||
|
||||
$ docker run -v /host/path:/container/path:ro nginx
|
||||
```
|
||||
|
||||
#### 环境变量
|
||||
|
||||
```bash
|
||||
|
||||
## 设置单个环境变量
|
||||
|
||||
$ docker run -e MYSQL_ROOT_PASSWORD=secret mysql
|
||||
@@ -135,11 +125,9 @@ $ docker run -e MYSQL_ROOT_PASSWORD=secret mysql
|
||||
|
||||
$ docker run --env-file .env myapp
|
||||
```
|
||||
|
||||
#### 资源限制
|
||||
|
||||
```bash
|
||||
|
||||
## 限制内存
|
||||
|
||||
$ docker run -m 512m nginx
|
||||
@@ -148,13 +136,11 @@ $ docker run -m 512m nginx
|
||||
|
||||
$ docker run --cpus=1.5 nginx
|
||||
```
|
||||
|
||||
### 5.1.5 启动已终止容器
|
||||
|
||||
使用 `docker start` 重新启动已停止的容器:
|
||||
|
||||
```bash
|
||||
|
||||
## 查看所有容器(包括已停止的)
|
||||
|
||||
$ docker ps -a
|
||||
@@ -169,7 +155,6 @@ $ docker start myubuntu
|
||||
|
||||
$ docker start -ai myubuntu
|
||||
```
|
||||
|
||||
### 5.1.6 容器内进程的特点
|
||||
|
||||
容器内只运行指定的应用程序及其必需资源:
|
||||
@@ -180,7 +165,6 @@ root@ba267838cc1b:/# ps
|
||||
1 ? 00:00:00 bash
|
||||
11 ? 00:00:00 ps
|
||||
```
|
||||
|
||||
可见容器中仅运行了 `bash` 进程。这种特点使得 Docker 对资源的利用率极高。
|
||||
|
||||
> 💡 笔者提示:容器内的 PID 1 进程很重要——它是容器的主进程,该进程退出则容器停止。详见[后台运行](5.2_daemon.md)章节。
|
||||
@@ -192,7 +176,6 @@ root@ba267838cc1b:/# ps
|
||||
**原因**:主进程执行完毕或无法保持运行
|
||||
|
||||
```bash
|
||||
|
||||
## 这个容器会立即退出(echo 执行完就结束了)
|
||||
|
||||
$ docker run ubuntu echo "hello"
|
||||
@@ -201,7 +184,6 @@ $ docker run ubuntu echo "hello"
|
||||
|
||||
$ docker run -d nginx # nginx 是持续运行的服务
|
||||
```
|
||||
|
||||
详细解释见[后台运行](5.2_daemon.md)。
|
||||
|
||||
#### Q:无法连接容器内的服务
|
||||
@@ -209,7 +191,6 @@ $ docker run -d nginx # nginx 是持续运行的服务
|
||||
**原因**:未正确映射端口
|
||||
|
||||
```bash
|
||||
|
||||
## 错误:没有 -p 参数,外部无法访问
|
||||
|
||||
$ docker run -d nginx
|
||||
@@ -218,16 +199,13 @@ $ docker run -d nginx
|
||||
|
||||
$ docker run -d -p 80:80 nginx
|
||||
```
|
||||
|
||||
#### Q:容器内修改的文件丢失
|
||||
|
||||
**原因**:未使用数据卷,数据保存在容器存储层
|
||||
|
||||
```bash
|
||||
|
||||
## 使用数据卷持久化
|
||||
|
||||
$ docker run -v mydata:/app/data myapp
|
||||
```
|
||||
|
||||
详见[数据管理](../08_data/README.md)。
|
||||
|
||||
@@ -22,7 +22,6 @@ hello world
|
||||
hello world
|
||||
hello world
|
||||
```
|
||||
|
||||
容器会把输出的结果 (STDOUT) 打印到宿主机上面。此时:
|
||||
|
||||
- 终端被占用,无法执行其他命令
|
||||
@@ -35,7 +34,6 @@ hello world
|
||||
$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
|
||||
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
|
||||
```
|
||||
|
||||
使用 `-d` 参数后:
|
||||
|
||||
- 容器在后台运行
|
||||
@@ -52,7 +50,6 @@ $ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep
|
||||
```bash
|
||||
$ docker run -d ubuntu:24.04
|
||||
```
|
||||
|
||||
然后用 `docker ps` 查看,发现容器根本不在运行!这是为什么?
|
||||
|
||||
#### 核心原理:容器的生命周期与主进程绑定
|
||||
@@ -65,7 +62,6 @@ flowchart TD
|
||||
Exit["主进程退出"] --> Stop["容器停止"]
|
||||
end
|
||||
```
|
||||
|
||||
当你运行 `docker run -d ubuntu:24.04` 时:
|
||||
|
||||
1. 容器启动
|
||||
@@ -96,7 +92,6 @@ $ docker container ls
|
||||
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||||
77b2dc01fe0f ubuntu:24.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
|
||||
```
|
||||
|
||||
#### 查看容器输出日志
|
||||
|
||||
```bash
|
||||
@@ -106,19 +101,16 @@ hello world
|
||||
hello world
|
||||
...
|
||||
```
|
||||
|
||||
**实时查看日志** (类似 `tail -f`):
|
||||
|
||||
```bash
|
||||
$ docker container logs -f 77b2dc01fe0f
|
||||
```
|
||||
|
||||
#### 查看已停止的容器
|
||||
|
||||
```bash
|
||||
$ docker container ls -a
|
||||
```
|
||||
|
||||
加上 `-a` 参数可以看到所有容器,包括已停止的。这对于调试 “容器启动即退出” 的问题非常有用。
|
||||
|
||||
### 5.2.5 最佳实践
|
||||
@@ -126,7 +118,6 @@ $ docker container ls -a
|
||||
#### 1. 长期运行的服务使用 -d
|
||||
|
||||
```bash
|
||||
|
||||
## Web 服务器
|
||||
|
||||
$ docker run -d -p 80:80 nginx
|
||||
@@ -139,18 +130,15 @@ $ docker run -d -p 3306:3306 mysql:8
|
||||
|
||||
$ docker run -d -p 6379:6379 redis
|
||||
```
|
||||
|
||||
#### 2. 调试时先用前台模式
|
||||
|
||||
当容器启动有问题时,**去掉 `-d` 参数** 可以直接看到输出和错误:
|
||||
|
||||
```bash
|
||||
|
||||
## 有问题的容器,先前台运行看看发生了什么
|
||||
|
||||
$ docker run myimage:latest
|
||||
```
|
||||
|
||||
#### 3. 使用 --rm 自动清理
|
||||
|
||||
对于一次性任务,使用 `--rm` 参数让容器退出后自动删除:
|
||||
@@ -163,11 +151,9 @@ Hello, World!
|
||||
|
||||
...
|
||||
```
|
||||
|
||||
#### 4. 配合日志查看
|
||||
|
||||
```bash
|
||||
|
||||
## 后台启动
|
||||
|
||||
$ docker run -d --name myapp myimage:latest
|
||||
@@ -184,7 +170,6 @@ $ docker logs -f myapp
|
||||
|
||||
$ docker logs -t myapp
|
||||
```
|
||||
|
||||
### 5.2.6 常见问题排查
|
||||
|
||||
#### Q:容器启动后立即退出
|
||||
@@ -227,7 +212,6 @@ $ docker logs -t myapp
|
||||
```bash
|
||||
$ docker attach mycontainer
|
||||
```
|
||||
|
||||
> **注意**:`attach` 会连接到容器的主进程。如果主进程不是交互式的,你可能只能看到输出。使用 `Ctrl+P` `Ctrl+Q` 可以安全退出而不停止容器。
|
||||
|
||||
### 5.2.7 延伸阅读
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
```bash
|
||||
$ docker stop 容器名或ID
|
||||
```
|
||||
|
||||
#### 工作原理
|
||||
|
||||
```mermaid
|
||||
@@ -30,11 +29,9 @@ flowchart TD
|
||||
A --> B["2. 等待容器优雅退出 (默认 10 秒)"]
|
||||
B --> C["3. 如果超时仍未退出,发送 SIGKILL 强制终止"]
|
||||
```
|
||||
|
||||
#### 自定义超时时间
|
||||
|
||||
```bash
|
||||
|
||||
## 等待 30 秒后强制终止
|
||||
|
||||
$ docker stop -t 30 mycontainer
|
||||
@@ -43,11 +40,9 @@ $ docker stop -t 30 mycontainer
|
||||
|
||||
$ docker stop -t 0 mycontainer
|
||||
```
|
||||
|
||||
#### 停止多个容器
|
||||
|
||||
```bash
|
||||
|
||||
## 停止多个指定容器
|
||||
|
||||
$ docker stop container1 container2 container3
|
||||
@@ -56,7 +51,6 @@ $ docker stop container1 container2 container3
|
||||
|
||||
$ docker stop $(docker ps -q)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.3.3 docker kill
|
||||
@@ -66,7 +60,6 @@ $ docker stop $(docker ps -q)
|
||||
```bash
|
||||
$ docker kill 容器名或ID
|
||||
```
|
||||
|
||||
#### 与 stop 的区别
|
||||
|
||||
| 命令 | 信号 | 使用场景 |
|
||||
@@ -77,7 +70,6 @@ $ docker kill 容器名或ID
|
||||
#### 发送自定义信号
|
||||
|
||||
```bash
|
||||
|
||||
## 发送 SIGHUP(让进程重新加载配置)
|
||||
|
||||
$ docker kill -s HUP mycontainer
|
||||
@@ -86,7 +78,6 @@ $ docker kill -s HUP mycontainer
|
||||
|
||||
$ docker kill -s TERM mycontainer
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.3.4 容器自动终止
|
||||
@@ -94,7 +85,6 @@ $ docker kill -s TERM mycontainer
|
||||
容器的生命周期与主进程绑定。主进程退出时,容器自动停止:
|
||||
|
||||
```bash
|
||||
|
||||
## 主进程是交互式 bash
|
||||
|
||||
$ docker run -it ubuntu bash
|
||||
@@ -104,7 +94,6 @@ root@abc123:/# exit # 退出 bash → 容器停止
|
||||
|
||||
$ docker run ubuntu echo "Hello" # echo 执行完 → 容器停止
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.3.5 查看已停止的容器
|
||||
@@ -115,7 +104,6 @@ CONTAINER ID IMAGE COMMAND STATUS NAMES
|
||||
ba267838cc1b ubuntu "/bin/bash" Exited (0) 2 minutes ago myubuntu
|
||||
c5d3a5e8f7b2 nginx "nginx" Up 5 minutes mynginx
|
||||
```
|
||||
|
||||
**STATUS 字段说明**:
|
||||
|
||||
| 状态 | 说明 |
|
||||
@@ -139,11 +127,9 @@ $ docker start 容器名或ID
|
||||
|
||||
$ docker start -ai 容器名
|
||||
```
|
||||
|
||||
#### 重启运行中的容器
|
||||
|
||||
```bash
|
||||
|
||||
## 先停止再启动
|
||||
|
||||
$ docker restart 容器名
|
||||
@@ -152,7 +138,6 @@ $ docker restart 容器名
|
||||
|
||||
$ docker restart -t 30 容器名
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.3.7 生命周期状态图
|
||||
@@ -172,7 +157,6 @@ stateDiagram-v2
|
||||
|
||||
Deleted --> [*]
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.3.8 批量操作
|
||||
@@ -182,19 +166,16 @@ stateDiagram-v2
|
||||
```bash
|
||||
$ docker stop $(docker ps -q)
|
||||
```
|
||||
|
||||
#### 删除所有已停止的容器
|
||||
|
||||
```bash
|
||||
$ docker container prune
|
||||
```
|
||||
|
||||
#### 停止并删除所有容器
|
||||
|
||||
```bash
|
||||
$ docker stop $(docker ps -q) && docker container prune -f
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.3.9 常见问题
|
||||
@@ -214,7 +195,6 @@ $ docker stop $(docker ps -q) && docker container prune -f
|
||||
确保容器主进程正确处理信号:
|
||||
|
||||
```dockerfile
|
||||
|
||||
## Dockerfile 示例
|
||||
|
||||
FROM node:22
|
||||
@@ -224,11 +204,9 @@ FROM node:22
|
||||
|
||||
CMD ["node", "server.js"]
|
||||
```
|
||||
|
||||
#### Q:容器无法停止
|
||||
|
||||
```bash
|
||||
|
||||
## 强制终止
|
||||
|
||||
$ docker kill 容器名
|
||||
@@ -237,5 +215,4 @@ $ docker kill 容器名
|
||||
|
||||
$ docker inspect 容器名
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -27,7 +27,6 @@ Docker 提供两种进入容器的命令:
|
||||
#### docker exec 基本用法
|
||||
|
||||
```bash
|
||||
|
||||
## 进入容器并启动交互式 shell
|
||||
|
||||
$ docker exec -it 容器名 /bin/bash
|
||||
@@ -36,7 +35,6 @@ $ docker exec -it 容器名 /bin/bash
|
||||
|
||||
$ docker exec -it 容器名 /bin/sh
|
||||
```
|
||||
|
||||
#### 参数说明
|
||||
|
||||
| 参数 | 作用 |
|
||||
@@ -51,7 +49,6 @@ $ docker exec -it 容器名 /bin/sh
|
||||
#### docker exec 示例
|
||||
|
||||
```bash
|
||||
|
||||
## 启动一个后台容器
|
||||
|
||||
$ docker run -dit --name myubuntu ubuntu
|
||||
@@ -70,13 +67,11 @@ $ docker ps
|
||||
CONTAINER ID IMAGE STATUS NAMES
|
||||
69d137adef7a ubuntu Up 2 minutes myubuntu
|
||||
```
|
||||
|
||||
#### 执行单条命令
|
||||
|
||||
不进入交互模式,直接执行命令:
|
||||
|
||||
```bash
|
||||
|
||||
## 查看容器内进程
|
||||
|
||||
$ docker exec myubuntu ps aux
|
||||
@@ -89,11 +84,9 @@ $ docker exec myubuntu cat /etc/nginx/nginx.conf
|
||||
|
||||
$ docker exec -u root myubuntu apt update
|
||||
```
|
||||
|
||||
#### 只用 -i 不用 -t 的区别
|
||||
|
||||
```bash
|
||||
|
||||
## 只用 -i:可以执行命令,但没有提示符
|
||||
|
||||
$ docker exec -i myubuntu bash
|
||||
@@ -108,7 +101,6 @@ dev
|
||||
$ docker exec -it myubuntu bash
|
||||
root@69d137adef7a:/# # 有提示符
|
||||
```
|
||||
|
||||
> 💡 通常使用 `-it` 组合。只有在脚本中需要通过管道传入命令时才只用 `-i`。
|
||||
|
||||
---
|
||||
@@ -120,7 +112,6 @@ root@69d137adef7a:/# # 有提示符
|
||||
```bash
|
||||
$ docker attach 容器名
|
||||
```
|
||||
|
||||
#### 工作原理
|
||||
|
||||
`attach` 会附加到容器的 **主进程** (PID 1) 的标准输入输出:
|
||||
@@ -135,11 +126,9 @@ flowchart LR
|
||||
end
|
||||
Attach["docker attach"] -->|"附加到这里"| P1
|
||||
```
|
||||
|
||||
#### docker attach 示例
|
||||
|
||||
```bash
|
||||
|
||||
## 启动容器
|
||||
|
||||
$ docker run -dit --name myubuntu ubuntu
|
||||
@@ -150,7 +139,6 @@ $ docker run -dit --name myubuntu ubuntu
|
||||
$ docker attach myubuntu
|
||||
root@243c32535da7:/#
|
||||
```
|
||||
|
||||
#### ⚠️ 重要警告
|
||||
|
||||
**从 attach 会话中输入 `exit` 或按 `Ctrl+D` 会导致容器停止!**
|
||||
@@ -163,7 +151,6 @@ $ docker ps
|
||||
CONTAINER ID IMAGE STATUS NAMES
|
||||
243c32535da7 ubuntu Exited (0) 2 seconds ago myubuntu
|
||||
```
|
||||
|
||||
**原因**:attach 附加到主进程,退出主进程就等于退出容器。
|
||||
|
||||
#### 安全退出 attach
|
||||
@@ -182,7 +169,6 @@ $ docker ps # 容器仍在运行
|
||||
CONTAINER ID IMAGE STATUS NAMES
|
||||
243c32535da7 ubuntu Up 5 minutes myubuntu
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.4.5 exec vs attach 对比
|
||||
@@ -219,7 +205,6 @@ flowchart LR
|
||||
Container1 -.-> note1
|
||||
Container2 -.-> note2
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.4.6 最佳实践
|
||||
@@ -227,7 +212,6 @@ flowchart LR
|
||||
#### 1. 首选 docker exec
|
||||
|
||||
```bash
|
||||
|
||||
## 进入容器调试
|
||||
|
||||
$ docker exec -it myapp bash
|
||||
@@ -240,7 +224,6 @@ $ docker exec myapp tail -f /var/log/app.log
|
||||
|
||||
$ docker exec myapp python manage.py migrate
|
||||
```
|
||||
|
||||
#### 2. 生产环境避免进入容器
|
||||
|
||||
笔者建议:生产环境应尽量避免进入容器直接操作,而是通过:
|
||||
@@ -254,7 +237,6 @@ $ docker exec myapp python manage.py migrate
|
||||
某些精简镜像 (如基于 `scratch` 或 `distroless`) 没有 shell:
|
||||
|
||||
```bash
|
||||
|
||||
## 这会失败
|
||||
|
||||
$ docker exec -it myapp bash
|
||||
@@ -264,7 +246,6 @@ OCI runtime exec failed: exec failed: unable to start container process: exec: "
|
||||
|
||||
$ docker debug myapp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.4.7 常见问题
|
||||
@@ -280,11 +261,9 @@ $ docker debug myapp
|
||||
```bash
|
||||
$ docker exec -it myapp /bin/sh
|
||||
```
|
||||
|
||||
#### Q:需要 root 权限
|
||||
|
||||
```bash
|
||||
$ docker exec -u root -it myapp bash
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -11,7 +11,6 @@ CONTAINER ID IMAGE COMMAND CREATED
|
||||
7691a814370e ubuntu:24.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
|
||||
$ docker export 7691a814370e > ubuntu.tar
|
||||
```
|
||||
|
||||
这样将导出容器快照到本地文件。
|
||||
|
||||
### 5.5.2 导入容器快照
|
||||
@@ -24,11 +23,9 @@ $ docker image ls
|
||||
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
|
||||
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
|
||||
```
|
||||
|
||||
此外,也可以通过指定 URL 或者某个目录来导入,例如
|
||||
|
||||
```bash
|
||||
$ docker import http://example.com/exampleimage.tgz example/imagerepo
|
||||
```
|
||||
|
||||
*注:用户既可以使用 `docker load` 来导入镜像存储文件到本地镜像库,也可以使用 `docker import` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息 (即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。*
|
||||
|
||||
@@ -9,7 +9,6 @@
|
||||
```bash
|
||||
$ docker rm 容器名或ID
|
||||
```
|
||||
|
||||
> 💡 `docker rm` 是 `docker container rm` 的简写,两者等效。
|
||||
|
||||
---
|
||||
@@ -28,11 +27,9 @@ $ docker rm 容器名或ID
|
||||
$ docker rm mycontainer
|
||||
mycontainer
|
||||
```
|
||||
|
||||
#### 强制删除运行中的容器
|
||||
|
||||
```bash
|
||||
|
||||
## 不加 -f 会报错
|
||||
|
||||
$ docker rm running_container
|
||||
@@ -43,18 +40,15 @@ Error: cannot remove running container
|
||||
$ docker rm -f running_container
|
||||
running_container
|
||||
```
|
||||
|
||||
> ⚠️ 强制删除会向容器发送 SIGKILL 信号,可能导致数据丢失。建议先 `docker stop` 优雅停止。
|
||||
|
||||
#### 删除容器及其数据卷
|
||||
|
||||
```bash
|
||||
|
||||
## 删除容器时同时删除其匿名卷
|
||||
|
||||
$ docker rm -v mycontainer
|
||||
```
|
||||
|
||||
> 注意:只删除匿名卷,命名卷不会被删除。
|
||||
|
||||
---
|
||||
@@ -64,7 +58,6 @@ $ docker rm -v mycontainer
|
||||
#### 删除所有已停止的容器
|
||||
|
||||
```bash
|
||||
|
||||
## 方式一:使用 prune 命令(推荐)
|
||||
|
||||
$ docker container prune
|
||||
@@ -80,11 +73,9 @@ Total reclaimed space: 150MB
|
||||
|
||||
$ docker container prune -f
|
||||
```
|
||||
|
||||
#### 删除所有容器:包括运行中的
|
||||
|
||||
```bash
|
||||
|
||||
## 先停止所有容器,再删除
|
||||
|
||||
$ docker stop $(docker ps -q)
|
||||
@@ -94,11 +85,9 @@ $ docker rm $(docker ps -aq)
|
||||
|
||||
$ docker rm -f $(docker ps -aq)
|
||||
```
|
||||
|
||||
#### 按条件删除
|
||||
|
||||
```bash
|
||||
|
||||
## 删除所有已退出的容器
|
||||
|
||||
$ docker rm $(docker ps -aq -f status=exited)
|
||||
@@ -111,7 +100,6 @@ $ docker rm $(docker ps -aq -f name=test)
|
||||
|
||||
$ docker container prune --filter "until=24h"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.6.4 常用过滤条件
|
||||
@@ -130,7 +118,6 @@ $ docker container prune --filter "until=24h"
|
||||
#### 示例
|
||||
|
||||
```bash
|
||||
|
||||
## 删除所有基于 nginx 镜像的容器
|
||||
|
||||
$ docker rm $(docker ps -aq -f ancestor=nginx)
|
||||
@@ -139,7 +126,6 @@ $ docker rm $(docker ps -aq -f ancestor=nginx)
|
||||
|
||||
$ docker rm $(docker ps -aq -f status=created)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.6.5 容器与镜像的依赖关系
|
||||
@@ -147,7 +133,6 @@ $ docker rm $(docker ps -aq -f status=created)
|
||||
> 有容器依赖的镜像无法删除。
|
||||
|
||||
```bash
|
||||
|
||||
## 尝试删除有容器依赖的镜像
|
||||
|
||||
$ docker image rm nginx
|
||||
@@ -158,7 +143,6 @@ Error: image is being used by stopped container abc123
|
||||
$ docker rm abc123
|
||||
$ docker image rm nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.6.6 清理策略建议
|
||||
@@ -166,7 +150,6 @@ $ docker image rm nginx
|
||||
#### 开发环境
|
||||
|
||||
```bash
|
||||
|
||||
## 定期清理已停止的容器
|
||||
|
||||
$ docker container prune -f
|
||||
@@ -175,11 +158,9 @@ $ docker container prune -f
|
||||
|
||||
$ docker system prune -f
|
||||
```
|
||||
|
||||
#### 生产环境
|
||||
|
||||
```bash
|
||||
|
||||
## 使用 --rm 参数运行临时容器
|
||||
|
||||
$ docker run --rm ubuntu echo "Hello"
|
||||
@@ -190,7 +171,6 @@ $ docker run --rm ubuntu echo "Hello"
|
||||
|
||||
$ docker container prune --filter "until=168h" # 保留 7 天内的
|
||||
```
|
||||
|
||||
#### 完整清理脚本
|
||||
|
||||
```bash
|
||||
@@ -213,7 +193,6 @@ docker network prune -f
|
||||
echo "清理完成!"
|
||||
docker system df
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
### 5.6.7 常见问题
|
||||
@@ -223,7 +202,6 @@ docker system df
|
||||
```bash
|
||||
Error: container is running
|
||||
```
|
||||
|
||||
解决:先停止容器,或使用 `-f` 强制删除
|
||||
|
||||
```bash
|
||||
@@ -234,7 +212,6 @@ $ docker rm mycontainer
|
||||
|
||||
$ docker rm -f mycontainer
|
||||
```
|
||||
|
||||
#### Q:删除后磁盘空间没释放
|
||||
|
||||
可能原因:
|
||||
@@ -246,7 +223,6 @@ $ docker rm -f mycontainer
|
||||
解决:
|
||||
|
||||
```bash
|
||||
|
||||
## 查看空间占用
|
||||
|
||||
$ docker system df
|
||||
@@ -255,5 +231,4 @@ $ docker system df
|
||||
|
||||
$ docker system prune -a --volumes
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
Reference in New Issue
Block a user