[Docker] 删除所有httpd镜像创建的容器 - 详细解释

13 篇文章 0 订阅
7 篇文章 0 订阅

故意/一不小心创建了很多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 dead
  • ancestor : 指定容器的镜像,比如 <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 容器,再做删除
  1. 精确删除 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)
  1. 删除包含 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 {}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值