故意/一不小心创建了很多httpd容器 (或者包含 httpd 关键字) ,有的在运行,有的已经停止了,有的已经退出,如果我想强制一键删除,该怎么办呢?
其实很简单,只需要一条命令:
# 强制删除所有 httpd 容器创建的,包括运行中的
docker rm -f $(docker ps -a -q --filter ancestor=httpd)
# 删除包含 httpd 关键字的,包括运行中的
docker rm -f $(docker ps | grep httpd | awk '{print $1}')
or
docker ps | grep httpd | awk '{print $1}' | xargs -n1 -I {} docker rm -f {}
注意:rm -f 强制删除容器,会为你带来风险!
为了避免风险,一般使用:
# 删除已经停止的容器,docker ps -a -q 会输出所有httpd容器的ID,但是 rm 只会删除已经停止的容器
docker rm $(docker ps -a -q --filter ancestor=httpd)
# 删除所有包含 httpd 关键字的 已经停止的 容器
docker rm $(docker ps -a | grep httpd | awk '{print $1}')
什么?你想了解这些语句是如何运行的?那么我们看看下面吧。先知道怎么查看某一类容器,再学会删除,岂不美哉。
1. 查看容器
请参考:docker ps 命令官方文档
docker ps
默认输出运行中的容器(running),包括暂时停止的容器(paused)!!!docker ps -a
输出所有状态的容器
1.1 精确匹配:使用 docker ps 的 --filter 参数 (支持多重过滤)
docker ps --filter
or docker ps -f
status
: 指定容器的状态,created, restarting, running, removing, paused, exited, or deadancestor
: 指定容器的镜像,比如<image-name>[:<tag>],
<image id>
, or<image@digest>
1.1.1 指定 ancestor=httpd (ancestor 会匹配镜像或其子孙镜像)
# 输出所有状态的 httpd 容器
[root@CentOS7 ~]# docker ps -a --filter ancestor=httpd
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae4eda988cde httpd "httpd-foreground" About an hour ago Exited (0) 41 minutes ago wonderful_franklin
a2aeb6c27349 httpd "httpd-foreground" About an hour ago Up About an hour 80/tcp laughing_burnell
b8fc8231aaea httpd "httpd-foreground" About an hour ago Up About an hour 80/tcp practical_brattain
9ccf7d1be502 httpd "httpd-foreground" 6 days ago Up 6 days 80/tcp, 0.0.0.0:8888->8888/tcp happy_fermi
# 输出所有 Exited 状态的 httpd 容器
[root@CentOS7 ~]# docker ps --filter ancestor=httpd --filter status=exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae4eda988cde httpd "httpd-foreground" 2 hours ago Exited (0) About an hour ago wonderful_franklin
b8fc8231aaea httpd "httpd-foreground" 2 hours ago Exited (137) About a minute ago practical_brattain
# 输出所有 Paused 状态的 httpd 容器
[root@CentOS7 ~]# docker ps --filter ancestor=httpd --filter status=paused
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ccf7d1be502 httpd "httpd-foreground" 6 days ago Up 6 days (Paused) 80/tcp, 0.0.0.0:8888->8888/tcp happy_fermi
# 输出所有 Paused 和 Exited 的 httpd 容器
[root@CentOS7 ~]# docker ps --filter ancestor=httpd --filter status=paused --filter status=exited
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ae4eda988cde httpd "httpd-foreground" 2 hours ago Exited (0) About an hour ago wonderful_franklin
b8fc8231aaea httpd "httpd-foreground" 2 hours ago Exited (137) 4 minutes ago practical_brattain
9ccf7d1be502 httpd "httpd-foreground" 6 days ago Up 6 days (Paused) 80/tcp, 0.0.0.0:8888->8888/tcp happy_fermi
1.1.2 只输出容器 ID
上面我们已经学会了查看容器的信息,但是删除的时候,我们需要的是容器ID呀!
很简单,我们只需要多指定一个 -q
参数即可。
[root@CentOS7 ~]# docker ps -a -q --filter ancestor=httpd
470d314fbf25
0b2ca82d029b
1e8bcca975dd
0ab1199e0cf1
1.2 模糊匹配:使用 grep 过滤
如果你还不了解 Linux grep 命令,请自行百度。
1.2.1 查看包含 httpd 关键字的容器
# 输出所有状态的包含 httpd 关键字的容器
[root@CentOS7 ~]# docker ps -a | grep httpd
ae4eda988cde httpd "httpd-foreground" 2 hours ago Exited (0) About an hour ago wonderful_franklin
a2aeb6c27349 httpd "httpd-foreground" 2 hours ago Up 2 hours 80/tcp laughing_burnell
b8fc8231aaea httpd "httpd-foreground" 2 hours ago Exited (137) 5 minutes ago practical_brattain
9ccf7d1be502 httpd "httpd-foreground" 6 days ago Up 6 days (Paused) 80/tcp, 0.0.0.0:8888->8888/tcp happy_fermi
# 输出所有 Paused 状态的包含 httpd 关键字的容器
[root@CentOS7 ~]# docker ps -a | grep httpd | grep Paused
9ccf7d1be502 httpd "httpd-foreground" 6 days ago Up 6 days (Paused) 80/tcp, 0.0.0.0:8888->8888/tcp happy_fermi
# 输出所有 运行中 状态的包含 httpd 关键字的容器
[root@CentOS7 ~]# docker ps -a | grep httpd | grep Up
a2aeb6c27349 httpd "httpd-foreground" 2 hours ago Up 2 hours 80/tcp laughing_burnell
9ccf7d1be502 httpd "httpd-foreground" 6 days ago Up 6 days (Paused) 80/tcp, 0.0.0.0:8888->8888/tcp happy_fermi
# 输出所有 Paused 状态的包含 httpd 关键字的容器
[root@CentOS7 ~]# docker ps -a | grep httpd | grep Exited
ae4eda988cde httpd "httpd-foreground" 2 hours ago Exited (0) About an hour ago wonderful_franklin
b8fc8231aaea httpd "httpd-foreground" 2 hours ago Exited (137) 5 minutes ago practical_brattain
1.2.2 只输出容器 ID
Linux grep 似乎不能指定 “-q” 参数呀,那么怎么办呢?我们注意到容器 ID 都是在第一列,那这就简单了,对文本的列操作,使用 Linux awk
命令。多使用一个管道,增加awk '{print $1}'
取出第一列就可以咯。
[root@CentOS7 ~]# docker ps -a | grep httpd | awk '{print $1}'
470d314fbf25
0b2ca82d029b
1e8bcca975dd
0ab1199e0cf1
2. 停止容器
docker stop <container>
,可以指定 -t
参数,设置停止倒计时,单位秒。
# 停止 httpd 容器
docker stop $(docker ps -q -f ancestor=httpd)
# 停止包含 httpd 关键字的容器
docker stop $(docker ps | grep httpd | awk '{print $1}')
3. 删除容器
删除容器主要依靠 docker rm <container>
命令,不指定参数,默认只会删除已经退出的容器。
3.1 强制删除一个容器
# 查看 httpd 容器
[root@CentOS7 ~]# docker ps -a --filter ancestor=httpd
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
688b3b6699fc httpd "httpd-foreground" 3 minutes ago Up 3 minutes 80/tcp sleepy_bose
# 删除一个容器
[root@CentOS7 ~]# docker rm -f 688b3b6699fc
688b3b6699fc
3.2 删除某一类容器
我们已经知道如何输出容器 ID (不记得了,请回头看1.1.2 或 1.2.2 ),并且知道了如何使用 rm 命令删除一个容器,接下来我们只需要获取所有容器 ID,执行删除命令就可以了。不要忘了 -a
参数哦。
3.2.1 先停止 httpd 容器,再做删除
- 精确删除 httpd 容器
# 查看运行中的 httpd 容器
docker ps -f ancestor=httpd
# 停止
docker stop $(docker ps -q -f ancestor=httpd)
# 删除,必须要-a参数
docker rm $(docker ps -a -q -f ancestor=httpd)
- 删除包含 httpd 关键字的容器
# 查看运行中的 包含 httpd 关键字的容器
docker ps | grep httpd
# 停止
docker stop $(docker ps | grep httpd | awk '{print $1}')
# 删除,必须要-a参数
docker rm $(docker ps -a | grep httpd | awk '{print $1}')
3.2.2 强制删除 httpd 容器
# 删除所有 httpd 镜像创建的容器 ,包括运行中的
docker rm -f $(docker ps -a -q --filter ancestor=httpd)
or
docker rm -f $(docker ps | grep httpd | awk '{print $1}')
or
docker ps | grep httpd | awk '{print $1}' | xargs -n1 -I {} docker rm -f {}
4. 总结
# 删除已经停止的容器,docker ps -a -q 会输出所有httpd容器的ID,但是 rm 只会删除已经停止的容器
docker rm $(docker ps -a -q --filter ancestor=httpd)
# 删除所有包含 httpd 关键字的 已经停止的 容器
docker rm $(docker ps -a | grep httpd | awk '{print $1}')
# 强制删除所有 httpd 容器创建的,包括运行中的
docker rm -f $(docker ps -a -q --filter ancestor=httpd)
# 删除包含 httpd 关键字的,包括运行中的
docker rm -f $(docker ps | grep httpd | awk '{print $1}')
or
docker ps | grep httpd | awk '{print $1}' | xargs -n1 -I {} docker rm -f {}