当一个host
中镜像和容器较多,需要重置时可选择删除其中部分或全部的镜像和容器。那么你就需要下面的操作了。
1、删除容器
1)首先需要停止所有的容器
docker stop $(docker ps -a -q)
2)删除所有的容器(只删除单个时把后面的变量改为image id
即可)
docker rm $(docker ps -a -q)
2、删除镜像
1)查看host
中的镜像
docker images
2)删除指定id的镜像
docker rmi <image id>
想要删除untagged images
,也就是那些id为的image
的话可以用
docker rmi $(docker images | grep "^" | awk "{print $3}")
3)删除全部的images
docker rmi $(docker images -q)
3、当要删除的images
和其他的镜像有关联而无法删除时
可通过 -f
参数强制删除
docker rmi -f $(docker images -q)
Docker删除容器再删除镜像
1. 查询镜像
docker images
现在想删除第一个,ID为 99f85991949f
的镜像。
docker rmi ID
从上面看出,需要先停到ID为 67***
的容器。
2. 查询容器
docker ps -a
3. 先删除容器
docker rm ID
上面可以看出,容器已经删除。
4. 删除镜像
二、卸载
列出你安装过的包
$ yum list installed | grep docker
docker-engine.x86_64
1.7.1-1.el7 @/docker-engine-1.7.1-1.el7.x86_64.rpm
删除安装包
$ sudo yum -y remove docker-engine.x86_64
删除镜像/容器等
$ rm -rf /var/lib/docker
查看docker文件
find / -name docker
Docker常见命令
- 容器生命周期管理
-
docker run
:创建一个新的容器并运行一个命令- 语法:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
-
OPTIONS
说明:-
-d
: 后台运行容器,并返回容器ID; -
-i
: 以交互模式运行容器,通常与 -t 同时使用; -
-t
: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; -
-p
: 指定端口映射,格式为:主机(宿主)端口:容器端口; -
--name="nginx-lb"
: 为容器指定一个名称; -
-m
:设置容器使用内存最大值; -
--volume
,-v
: 绑定一个卷 -
--rm
: 容器退出后随之将其删除;默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动docker rm
。这里只是随便执行个命令,看看结果,不需要排障和保留结果,因此使用--rm
可以避免浪费空间;
-
- 实例:
docker run -it --rm ubuntu:16.04 bash
- 语法:
-
start/stop/restart
命令docker start 容器名或者容器ID
docker stop 容器名或者容器ID
docker restart 容器名或者容器ID
-
docker rm
: 删除一个或多个容器docker rm 容器名或者容器ID
-
docker exec
: 在运行的容器中执行命令- 语法:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-
OPTIONS
说明:-
-d
: 分离模式: 在后台运行 -
-i
: 即使没有附加也保持STDIN
打开 -
-t
: 分配一个伪终端
-
- 语法:
-
- 容器操作
-
docker ps
: 列出容器- 语法:
docker ps [OPTIONS]
-
OPTIONS
说明:-
-a
: 显示所有的容器,包括未运行的;
-
- 语法:
-
docker logs
: 获取容器的日志- 语法:
docker logs [OPTIONS] CONTAINER
-
OPTIONS
说明:-
-f
: 跟踪日志输出 -
--tail
: 仅列出最新N条容器日志
-
- 语法:
-
- 镜像仓库
-
docker pull
: 从镜像仓库中拉取或者更新指定镜像- 语法:
docker pull NAME[:TAG]
- 实例:
docker pull tomcat
docker pull tomcat:jre-9
- 语法:
-
docker images
: 列出本地镜像- 语法:
docker images [OPTIONS] [REPOSITORY[:TAG]]
- 实例:
docker images
- 语法:
-
docker rmi || docker image rm
: 删除本地一个或多个镜像- 语法:
docker rmi [OPTIONS] IMAGE [IMAGE...]
-
OPTIONS
说明:-
-f
: 强制删除 -
-no-prune
: 不移除该镜像的过程镜像,默认移除
-
- 语法:
-
docker save
: 将指定镜像保存成 tar 归档文件- 语法:
docker save [OPTIONS] IMAGE [IMAGE...]
-
OPTIONS
说明:-
-o
: 输出到的文件
-
- 语法:
-
docker build
: 构建镜像- 语法:
docker build -t name:tag
- 语法:
-
docker image prune
: 删除虚悬镜像
-
Docker清理
Docker的镜像(image
)、容器(container
)、数据卷(volume
), 都是由daemon
托管的。 因此,在需要清理时,也需要使用其自带的手段。
本文介绍一些Docker的清理技巧,以及它们的来源。
清理技巧
清理所有停止运行的容器:
docker container prune
# or
docker rm $(docker ps -aq)
清理所有悬挂(<none>
)镜像:
docker image prune
# or
docker rmi $(docker images -qf "dangling=true")
清理所有无用数据卷:
docker volume prune
清理停止的容器
docker rm -lv CONTAINER
-l
是清理link
,v
是清理volume
。 这里的CONTAINER
是容器的name
或ID
,可以是一个或多个。
参数列表:
Name, shorthand | Default | Description |
---|---|---|
–force, -f | false | Force the removal of a running container (uses SIGKILL) |
–link, -l | false | Remove the specified link |
–volumes, -v | false | Remove the volumes associated with the container |
清理所有停止的容器
通过docker ps
可以查询当前运行的容器信息。 而通过docker ps -a
,可以查询所有的容器信息,包括已停止的。
在需要清理所有已停止的容器时,通常利用shell的特性,组合一下就好。
docker rm $(docker ps -aq)
其中,ps
的-q
,是只输出容器ID,方便作为参数让rm
使用。 假如给rm
指定-f
,则可以清理所有容器,包括正在运行的。
这条组合命令,等价于另一条命令:
docker container prune
container
子命令,下面包含了所有和容器相关的子命令。 包括docker ps
,等价于docker container ps
或docker container ls
。 其余还有start
、stop
、kill
、cp
等,一级子命令相当于二级子命令在外面的alias。 而prune
则是特别提供的清理命令,这在其它的管理命令里还可以看到,比如image
、volume
。
按需批量清理容器
清除所有已停止的容器,是比较常用的清理。 但有时会需要做一些特殊过滤。
这时就需要使用docker ps --filter
。
比如,显示所有返回值为0
,即正常退出的容器:
docker ps -a --filter 'exited=0'
同理,可以得到其它非正常退出的容器。
目前支持的过滤器有:
- id (container’s id)
- label (
label=<key>
orlabel=<key>=<value>
)- name (container’s name)
- exited (int - the code of exited containers. Only useful with –all)
- status (
created|restarting|running|removing|paused|exited|dead
)- ancestor (
<image-name>[:<tag>]
,<image id>
or<image@digest>
) - filters containers that were created from the given image or a descendant.- before (container’s id or name) - filters containers created before given id or name
- since (container’s id or name) - filters containers created since given id or name
- isolation (
default|process|hyperv
) (Windows daemon only)- volume (volume name or mount point) - filters containers that mount volumes.
- network (network id or name) - filters containers connected to the provided network
- health (
starting|healthy|unhealthy|none
) - filters containers based on healthcheck status
清理失败
如果在清理容器时发生失败,通过重启Docker
的Daemon
,应该都能解决问题。
# systemd
sudo systemctl restart docker.service
# initd
sudo service docker restart
清理镜像
与清理容器的ps
、rm
类似,清理镜像也有images
、rmi
两个子命令。 images
用来查看,rmi
用来删除。
清理镜像前,应该确保该镜像的容器,已经被清除。
docker rmi IMAGE
其中,IMAGE
可以是name
或ID
。 如果是name
,不加TAG
可以删除所有TAG
。
另外,这两个命令也都属于alias。 docker images
等价于docker image ls
,而docker rmi
等价于docker image rm
。
按需批量清理镜像
与ps
类似,images
也支持--filter
参数。
与清理相关,最常用的,当属<none>
了。
docker images --filter "dangling=true"
这条命令,可以列出所有悬挂(dangling
)的镜像,也就是显示为<none>
的那些。
docker rmi $(docker images -qf "dangling=true")
这条组合命令,如果不写入Bash
的alias,几乎无法使用。 不过还有一条等价命令,非常容易使用。
docker image prune
prune
和images
类似,也同样支持--filter
参数。 其它的filter有:
- dangling (boolean - true or false)
- label (
label=<key>
orlabel=<key>=<value>
)- before (
<image-name>[:<tag>]
,<image id>
or<image@digest>
) - filter images created before given id or references- since (
<image-name>[:<tag>]
,<image id>
or<image@digest>
) - filter images created since given id or references- reference (pattern of an image reference) - filter images whose reference matches the specified pattern
清理所有无用镜像
这招要慎用,否则需要重新下载。
docker image prune -a
清理数据卷
数据卷不如容器或镜像那样显眼,但占的硬盘却可大可小。
数据卷的相关命令,都在docker volume
中了。
一般用docker volume ls
来查看,用docker volume rm VOLUME
来删除一个或多个。
不过,绝大多数情况下,不需要执行这两个命令的组合。 直接执行docker volume prune
就好,即可删除所有无用卷。
从文件系统删除
除配置文件以为,Docker
的内容相关文件,基本都放在/var/lib/docker/
目录下。
该目录下有下列子目录,基本可以猜测出用途:
- aufs
- containers
- image
- network
- plugins
- swarm
- tmp
- trust
- volumes
一般不推荐直接操作这些目录,除非一些极特殊情况。 操作不当,后果难料,需要慎重。