Merge pull request #281 from khs1994/master

Update container image chapter
pull/286/head
Baohua Yang 2017-12-05 10:19:08 +08:00 committed by GitHub
commit 7c84589565
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 75 additions and 173 deletions

View File

@ -39,7 +39,7 @@
* [参考文档](image/dockerfile/references.md)
* [Dockerfile 多阶段构建](image/multistage-builds.md)
* [其它制作镜像的方式](image/other.md)
* [删除本地镜像](image/rmi.md)
* [删除本地镜像](image/rm.md)
* [实现原理](image/internal.md)
* [操作容器](container/README.md)
* [启动](container/run.md)

View File

@ -4,5 +4,3 @@
简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。
Docker 在 1.13 版本中引进了新的管理命令management commands在 Docker 1.13+ 推荐使用 `docker container` 子命令来管理 Docker 容器。

View File

@ -27,30 +27,20 @@ $ docker run -d ubuntu:17.10 /bin/sh -c "while true; do echo hello world; sleep
**注:** 容器是否会长久运行,是和 `docker run` 指定的命令有关,和 `-d` 参数无关。
使用 `-d` 参数启动后会返回一个唯一的 id也可以通过 `docker ps` 命令来查看容器信息。
使用 `-d` 参数启动后会返回一个唯一的 id也可以通过 `docker container ls` 命令来查看容器信息。
```bash
$ docker ps
```
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77b2dc01fe0f ubuntu:17.10 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
```
要获取容器的输出信息,可以通过 `docker logs` 命令。
要获取容器的输出信息,可以通过 `docker container logs` 命令。
```bash
$ docker logs [container ID or NAMES]
$ docker container logs [container ID or NAMES]
hello world
hello world
hello world
. . .
```
# Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker container` 来管理镜像。
```bash
$ docker container run -d
$ docker container ls
$ docker container logs
```

View File

@ -12,7 +12,7 @@
$ docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ docker ps
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds nostalgic_hypatia
@ -36,7 +36,7 @@ root@243c32535da7:/#
$ docker run -dit ubuntu
69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6
$ docker ps
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
69d137adef7a ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds zealous_swirles
@ -54,13 +54,3 @@ root@69d137adef7a:/#
如果从这个 stdin 中 exit不会导致容器的停止。这就是为什么推荐大家使用 `docker exec` 的原因。
更多参数说明请使用 `docker exec --help` 查看。
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker container` 来管理容器。
```bash
$ docker container attach
$ docker container exec
```

View File

@ -1,6 +1,7 @@
## 导出和导入容器
### 导出容器
如果要导出本地某个容器,可以使用 `docker export` 命令。
```bash
$ docker ps -a
@ -8,29 +9,24 @@ CONTAINER ID IMAGE COMMAND CREATED
7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test
$ docker export 7691a814370e > ubuntu.tar
```
这样将导出容器快照到本地文件。
### 导入容器快照
可以使用 `docker import` 从容器快照文件中再导入为镜像,例如
```bash
$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker images
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` 来导入一个容器快照到本地镜像库。这两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也要大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。*
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker container` 来管理容器。
```bash
$ docker container export
$ docker image import
```

View File

@ -1,24 +1,18 @@
## 删除容器
可以使用 `docker rm` 来删除一个处于终止状态的容器。例如
可以使用 `docker container rm` 来删除一个处于终止状态的容器。例如
```bash
$ docker rm trusting_newton
$ docker container rm trusting_newton
trusting_newton
```
如果要删除一个运行中的容器,可以添加 `-f` 参数。Docker 会发送 `SIGKILL` 信号给容器。
## 清理所有处于终止状态的容器
`docker ps -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
`docker container ls -a` 命令可以查看所有已经创建的包括终止状态的容器,如果数量太多要一个个删除可能会很麻烦,用下面的命令可以清理掉所有处于终止状态的容器。
```bash
$ docker container prune
```
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker container` 来管理容器。
```bash
$ docker container rm trusting_newton
```

View File

@ -1,26 +1,33 @@
## 启动容器
启动容器有两种方式一种是基于镜像新建一个容器并启动另外一个是将在终止状态stopped的容器重新启动。
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(`stopped`)的容器重新启动。
因为 Docker 的容器实在太轻量级了,很多时候用户都是随时删除和新创建容器。
### 新建并启动
所需要的命令主要为 `docker run`
例如,下面的命令输出一个 “Hello World”之后终止容器。
```bash
$ docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
```
这跟在本地直接执行 `/bin/echo 'hello world'` 几乎感觉不出任何区别。
下面的命令则启动一个 bash 终端,允许用户进行交互。
```bash
$ docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
```
其中,`-t` 选项让Docker分配一个伪终端pseudo-tty并绑定到容器的标准输入上 `-i` 则让容器的标准输入保持打开。
在交互模式下,用户可以通过所创建的终端来输入命令,例如
```bash
root@af8bae53bdd3:/# pwd
/
@ -39,23 +46,16 @@ bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr
* 执行完毕后容器被终止
### 启动已终止容器
可以利用 `docker start` 命令,直接将一个已经终止的容器启动运行。
可以利用 `docker container start` 命令,直接将一个已经终止的容器启动运行。
容器的核心为所执行的应用程序,所需要的资源都是应用程序运行所必需的。除此之外,并没有其它的资源。可以在伪终端中利用 `ps``top` 来查看进程信息。
```bash
root@ba267838cc1b:/# ps
PID TTY TIME CMD
1 ? 00:00:00 bash
11 ? 00:00:00 ps
```
可见,容器中仅运行了指定的 bash 应用。这种特点使得 Docker 对资源的利用率极高,是货真价实的轻量级虚拟化。
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker container` 来管理容器。
```bash
$ docker container run ubuntu:17.10 /bin/echo 'Hello world'
$ docker container start
```

View File

@ -1,12 +1,12 @@
## 终止容器
可以使用 `docker stop` 来终止一个运行中的容器。
可以使用 `docker container stop` 来终止一个运行中的容器。
此外当Docker容器中指定的应用终结时容器也自动终止。
此外,当 Docker 容器中指定的应用终结时,容器也自动终止。
例如对于上一章节中只启动了一个终端的容器,用户通过 `exit` 命令或 `Ctrl+d` 来退出终端时,所创建的容器立刻终止。
终止状态的容器可以用 `docker ps -a` 命令看到。例如
终止状态的容器可以用 `docker container ls -a` 命令看到。例如
```bash
docker ps -a
@ -15,18 +15,6 @@ ba267838cc1b ubuntu:14.04 "/bin/bash" 30 minutes a
98e5efa7d997 training/webapp:latest "python app.py" About an hour ago Exited (0) 34 minutes ago backstabbing_pike
```
处于终止状态的容器,可以通过 `docker start` 命令来重新启动。
处于终止状态的容器,可以通过 `docker container start` 命令来重新启动。
此外,`docker restart` 命令会将一个运行态的容器终止,然后再重新启动它。
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker container` 来管理容器。
```bash
$ docker container ls
$ docker container start
$ docker container restart
```
此外,`docker container restart` 命令会将一个运行态的容器终止,然后再重新启动它。

View File

@ -11,5 +11,3 @@ Docker 运行容器前需要本地存在对应的镜像,如果本地不存在
* 管理本地主机上的镜像;
* 介绍镜像实现的基本原理。
Docker 在 1.13 版本引进了新的管理命令management commands在 Docker 1.13+ 推荐使用 `docker image` 子命令来管理 Docker 镜像。

View File

@ -218,11 +218,3 @@ $ docker build - < context.tar.gz
```
如果发现标准输入的文件格式是 `gzip`、`bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。
# Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker image` 来管理镜像。
```bash
$ docker image build
```

View File

@ -82,10 +82,10 @@ sha256:07e33465974800ce65751acc279adc6ed2dc5ed4e0838f8b86f0c87aa1795214
其中 `--author` 是指定修改的作者,而 `--message` 则是记录本次修改的内容。这点和 `git` 版本控制相似,不过这里这些信息可以省略留空。
我们可以在 `docker images` 中看到这个新定制的镜像:
我们可以在 `docker image ls` 中看到这个新定制的镜像:
```bash
$ docker images nginx
$ docker image ls nginx
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v2 07e334659748 9 seconds ago 181.5 MB
nginx 1.11 05a60462f8ba 12 days ago 181.5 MB

View File

@ -1,7 +1,9 @@
## 镜像的实现原理
Docker 镜像是怎么实现增量的修改和维护的?
每个镜像都由很多层次构成Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 将这些不同的层结合到一个镜像中去。
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。
Docker 在 AUFS 上构建的容器也是利用了类似的原理。

View File

@ -1,9 +1,9 @@
## 列出镜像
要想列出已经下载下来的镜像,可以使用 `docker images` 命令。
要想列出已经下载下来的镜像,可以使用 `docker image ls` 命令。
```bash
$ docker images
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
@ -20,9 +20,9 @@ ubuntu 14.04 1e0c3dd64ccd 4 weeks ago
### 镜像体积
如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。比如,`ubuntu:16.04` 镜像大小,在这里是 `127 MB`,但是在 [Docker Hub](https://hub.docker.com/r/library/ubuntu/tags/) 显示的却是 `50 MB`。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 `docker images` 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
如果仔细观察,会注意到,这里标识的所占用空间和在 Docker Hub 上看到的镜像大小不同。比如,`ubuntu:16.04` 镜像大小,在这里是 `127 MB`,但是在 [Docker Hub](https://hub.docker.com/r/library/ubuntu/tags/) 显示的却是 `50 MB`。这是因为 Docker Hub 中显示的体积是压缩后的体积。在镜像下载和上传过程中镜像是保持着压缩状态的,因此 Docker Hub 所显示的大小是网络传输中更关心的流量大小。而 `docker image ls` 显示的是镜像下载到本地后,展开的大小,准确说,是展开后的各层所占空间的总和,因为镜像到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小。
另外一个需要注意的问题是,`docker images` 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
另外一个需要注意的问题是,`docker image ls` 列表中的镜像体积总和并非是所有镜像实际硬盘消耗。由于 Docker 镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于 Docker 使用 Union FS相同的层只需要保存一份即可因此实际镜像硬盘占用空间很可能要比这个列表镜像大小的总和要小的多。
你可以通过以下命令来便捷的查看镜像、容器、数据卷所占用的空间。
@ -47,7 +47,7 @@ Build Cache 0B
这个镜像原本是有镜像名和标签的,原来为 `mongo:3.2`,随着官方镜像维护,发布了新版本后,重新 `docker pull mongo:3.2` 时,`mongo:3.2` 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 `<none>`。除了 `docker pull` 可能导致这种情况,`docker build` 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 `<none>` 的镜像。这类无标签镜像也被称为 **虚悬镜像(dangling image)** ,可以用下面的命令专门显示这类镜像:
```bash
$ docker images -f dangling=true
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 342 MB
```
@ -60,22 +60,22 @@ $ docker image prune
### 中间层镜像
为了加速镜像构建、重复利用资源Docker 会利用 **中间层镜像**。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 `docker images` 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 `-a` 参数。
为了加速镜像构建、重复利用资源Docker 会利用 **中间层镜像**。所以在使用一段时间后,可能会看到一些依赖的中间层镜像。默认的 `docker image ls` 列表中只会显示顶层镜像,如果希望显示包括中间层镜像在内的所有镜像的话,需要加 `-a` 参数。
```bash
$ docker images -a
$ docker image ls -a
```
这样会看到很多无标签的镜像,与之前的虚悬镜像不同,这些无标签的镜像很多都是中间层镜像,是其它镜像所依赖的镜像。这些无标签镜像不应该删除,否则会导致上层镜像因为依赖丢失而出错。实际上,这些镜像也没必要删除,因为之前说过,相同的层只会存一遍,而这些镜像是别的镜像的依赖,因此并不会因为它们被列出来而多存了一份,无论如何你也会需要它们。只要删除那些依赖它们的镜像后,这些依赖的中间层镜像也会被连带删除。
### 列出部分镜像
不加任何参数的情况下,`docker images` 会列出所有顶级镜像,但是有时候我们只希望列出部分镜像。`docker images` 有好几个参数可以帮助做到这个事情。
不加任何参数的情况下,`docker image ls` 会列出所有顶级镜像,但是有时候我们只希望列出部分镜像。`docker image ls` 有好几个参数可以帮助做到这个事情。
根据仓库名列出镜像
```bash
$ docker images ubuntu
$ docker image ls ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f753707788c5 4 weeks ago 127 MB
ubuntu latest f753707788c5 4 weeks ago 127 MB
@ -85,15 +85,15 @@ ubuntu 14.04 1e0c3dd64ccd 4 weeks ago
列出特定的某个镜像,也就是说指定仓库名和标签
```bash
$ docker images ubuntu:16.04
$ docker image ls ubuntu:16.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 f753707788c5 4 weeks ago 127 MB
```
除此以外,`docker images` 还支持强大的过滤器参数 `--filter`,或者简写 `-f`。之前我们已经看到了使用过滤器来列出虚悬镜像的用法,它还有更多的用法。比如,我们希望看到在 `mongo:3.2` 之后建立的镜像,可以用下面的命令:
除此以外,`docker image ls` 还支持强大的过滤器参数 `--filter`,或者简写 `-f`。之前我们已经看到了使用过滤器来列出虚悬镜像的用法,它还有更多的用法。比如,我们希望看到在 `mongo:3.2` 之后建立的镜像,可以用下面的命令:
```bash
$ docker images -f since=mongo:3.2
$ docker image ls -f since=mongo:3.2
REPOSITORY TAG IMAGE ID CREATED SIZE
redis latest 5f515359c7f8 5 days ago 183 MB
nginx latest 05a60462f8ba 5 days ago 181 MB
@ -104,16 +104,16 @@ nginx latest 05a60462f8ba 5 days ago
此外,如果镜像构建时,定义了 `LABEL`,还可以通过 `LABEL` 来过滤。
```bash
$ docker images -f label=com.example.version=0.1
$ docker image ls -f label=com.example.version=0.1
...
```
### 以特定格式显示
默认情况下,`docker images` 会输出一个完整的表格,但是我们并非所有时候都会需要这些内容。比如,刚才删除虚悬镜像的时候,我们需要利用 `docker images` 把所有的虚悬镜像的 ID 列出来,然后才可以交给 `docker rmi` 命令作为参数来删除指定的这些镜像,这个时候就用到了 `-q` 参数。
默认情况下,`docker image ls` 会输出一个完整的表格,但是我们并非所有时候都会需要这些内容。比如,刚才删除虚悬镜像的时候,我们需要利用 `docker image ls` 把所有的虚悬镜像的 ID 列出来,然后才可以交给 `docker image rm` 命令作为参数来删除指定的这些镜像,这个时候就用到了 `-q` 参数。
```bash
$ docker images -q
$ docker image ls -q
5f515359c7f8
05a60462f8ba
fe9198c04d62
@ -130,7 +130,7 @@ f753707788c5
比如下面的命令会直接列出镜像结果并且只包含镜像ID和仓库名
```bash
$ docker images --format "{{.ID}}: {{.Repository}}"
$ docker image ls --format "{{.ID}}: {{.Repository}}"
5f515359c7f8: redis
05a60462f8ba: nginx
fe9198c04d62: mongo
@ -143,7 +143,7 @@ f753707788c5: ubuntu
或者打算以表格等距显示,并且有标题行,和默认一样,不过自己定义列:
```bash
$ docker images --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID REPOSITORY TAG
5f515359c7f8 redis latest
05a60462f8ba nginx latest
@ -153,11 +153,3 @@ f753707788c5 ubuntu 16.04
f753707788c5 ubuntu latest
1e0c3dd64ccd ubuntu 14.04
```
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker image` 来管理镜像。
```bash
$ docker image ls
```

View File

@ -118,7 +118,7 @@ $ ./build.sh
对比两种方式生成的镜像大小
```bash
$ docker images
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
go/helloworld 2 f7cf3465432c 22 seconds ago 6.47MB
@ -166,7 +166,7 @@ $ docker build -t go/helloworld:3 .
对比三个镜像大小
```bash
$ docker images
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
go/helloworld 3 d6911ed9c846 7 seconds ago 6.47MB

View File

@ -20,10 +20,10 @@ sha256:f477a6e18e989839d25223f301ef738b69621c4877600ae6467c4e5289822a79B/78.42 M
这条命令自动下载了 `ubuntu-14.04-x86_64-minimal.tar.gz` 文件,并且作为根文件系统展开导入,并保存为镜像 `openvz/ubuntu:14.04`
导入成功后,我们可以用 `docker images` 看到这个导入的镜像:
导入成功后,我们可以用 `docker image ls` 看到这个导入的镜像:
```bash
$ docker images openvz/ubuntu
$ docker image ls openvz/ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
openvz/ubuntu 14.04 f477a6e18e98 55 seconds ago 214.9 MB
```
@ -47,7 +47,7 @@ Docker 还提供了 `docker load` 和 `docker save` 命令,用以将镜像保
比如我们希望保存这个 `alpine` 镜像。
```bash
$ docker images alpine
$ docker image ls alpine
REPOSITORY TAG IMAGE ID CREATED SIZE
alpine latest baa5d63471ea 5 weeks ago 4.803 MB
```
@ -70,13 +70,3 @@ Loaded image: alpine:latest
```bash
docker save <镜像名> | bzip2 | pv | ssh <用户名>@<主机名> 'cat | docker load'
```
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker image` 来管理镜像。
```bash
$ docker image import
$ docker image load
$ docker image save
```

View File

@ -5,7 +5,7 @@
从 Docker 镜像仓库获取镜像的命令是 `docker pull`。其命令格式为:
```bash
docker pull [选项] [Docker Registry地址]<仓库名>:<标签>
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
```
具体的选项可以通过 `docker pull --help` 命令看到,这里我们说一下镜像名称的格式。
@ -66,15 +66,3 @@ BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
进入容器后,我们可以在 Shell 下操作,执行任何所需的命令。这里,我们执行了 `cat /etc/os-release`,这是 Linux 常用的查看当前系统版本的命令,从返回的结果可以看到容器内是 `Ubuntu 16.04.4 LTS` 系统。
最后我们通过 `exit` 退出了这个容器。
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker image` 来管理镜像。
```bash
$ docker image pull ubunut:17.10
$ docker container run -it --rm \
ubuntu:17.10 \
bash
```

View File

@ -1,13 +1,11 @@
## 删除本地镜像
如果要删除本地的镜像,可以使用 `docker rmi` 命令,其格式为:
如果要删除本地的镜像,可以使用 `docker image rm` 命令,其格式为:
```bash
docker rmi [选项] <镜像1> [<镜像2> ...]
$ docker image rm [选项] <镜像1> [<镜像2> ...]
```
*注意 `docker rm` 命令是删除容器,不要混淆。*
### 用 ID、镜像名、摘要删除镜像
其中,`<镜像>` 可以是 `镜像短 ID`、`镜像长 ID`、`镜像名` 或者 `镜像摘要`
@ -15,7 +13,7 @@ docker rmi [选项] <镜像1> [<镜像2> ...]
比如我们有这么一些镜像:
```bash
$ docker images
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 0584b3d2cf6d 3 weeks ago 196.5 MB
redis alpine 501ad78535f0 3 weeks ago 21.03 MB
@ -23,12 +21,12 @@ docker latest cf693ec9b5c7 3 weeks ago
nginx latest e43d811ce2f4 5 weeks ago 181.5 MB
```
我们可以用镜像的完整 ID也称为 `长 ID`,来删除镜像。使用脚本的时候可能会用长 ID但是人工输入就太累了所以更多的时候是用 `短 ID` 来删除镜像。`docker images` 默认列出的就已经是短 ID 了一般取前3个字符以上只要足够区分于别的镜像就可以了。
我们可以用镜像的完整 ID也称为 `长 ID`,来删除镜像。使用脚本的时候可能会用长 ID但是人工输入就太累了所以更多的时候是用 `短 ID` 来删除镜像。`docker image ls` 默认列出的就已经是短 ID 了一般取前3个字符以上只要足够区分于别的镜像就可以了。
比如这里,如果我们要删除 `redis:alpine` 镜像,可以执行:
```bash
$ docker rmi 501
$ docker image rm 501
Untagged: redis:alpine
Untagged: redis@sha256:f1ed3708f538b537eb9c2a7dd50dc90a706f7debd7e1196c9264edeea521a86d
Deleted: sha256:501ad78535f015d88872e13fa87a828425117e3d28075d0c117932b05bf189b7
@ -42,7 +40,7 @@ Deleted: sha256:4fc455b921edf9c4aea207c51ab39b10b06540c8b4825ba57b3feed1668fa7c7
我们也可以用`镜像名`,也就是 `<仓库名>:<标签>`,来删除镜像。
```bash
$ docker rmi centos
$ docker image rm centos
Untagged: centos:latest
Untagged: centos@sha256:b2f9d1c0ff5f87a4743104d099a3d561002ac500db1b9bfa02a783a46e0d366c
Deleted: sha256:0584b3d2cf6d235ee310cf14b54667d889887b838d3f3d3033acd70fc3c48b8a
@ -52,11 +50,11 @@ Deleted: sha256:97ca462ad9eeae25941546209454496e1d66749d53dfa2ee32bf1faabd239d38
当然,更精确的是使用 `镜像摘要` 删除镜像。
```bash
$ docker images --digests
$ docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
node slim sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228 6e0c4c8e3913 3 weeks ago 214 MB
$ docker rmi node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228
$ docker image rm node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228
Untagged: node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b164422be228
```
@ -70,26 +68,20 @@ Untagged: node@sha256:b4f0e0bdeb578043c1ea6862f0d40cc4afe32a4a582f3be235a3b16442
除了镜像依赖以外,还需要注意的是容器对镜像的依赖。如果有用这个镜像启动的容器存在(即使容器没有运行),那么同样不可以删除这个镜像。之前讲过,容器是以镜像为基础,再加一层容器存储层,组成这样的多层存储结构去运行的。因此该镜像如果被这个容器所依赖的,那么删除必然会导致故障。如果这些容器是不需要的,应该先将它们删除,然后再来删除镜像。
### 用 docker images 命令来配合
### 用 docker image ls 命令来配合
像其它可以承接多个实体的命令一样,可以使用 `docker images -q` 来配合使用 `docker rmi`,这样可以成批的删除希望删除的镜像。比如之前我们介绍过的,删除虚悬镜像的指令是:
```bash
$ docker rmi $(docker images -q -f dangling=true)
```
我们在“镜像列表”章节介绍过很多过滤镜像列表的方式都可以拿过来使用。
像其它可以承接多个实体的命令一样,可以使用 `docker image ls -q` 来配合使用 `docker image rm`,这样可以成批的删除希望删除的镜像。我们在“镜像列表”章节介绍过很多过滤镜像列表的方式都可以拿过来使用。
比如,我们需要删除所有仓库名为 `redis` 的镜像:
```bash
$ docker rmi $(docker images -q redis)
$ docker image rm $(docker image ls -q redis)
```
或者删除所有在 `mongo:3.2` 之前的镜像:
```bash
$ docker rmi $(docker images -q -f before=mongo:3.2)
$ docker image rm $(docker image ls -q -f before=mongo:3.2)
```
充分利用你的想象力和 Linux 命令行的强大,你可以完成很多非常赞的功能。
@ -103,11 +95,3 @@ $ docker rmi $(docker images -q -f before=mongo:3.2)
所以对于 CentOS/RHEL 的用户来说,在没有办法使用 `UnionFS` 的情况下,一定要配置 `direct-lvm``devicemapper`,无论是为了性能、稳定性还是空间利用率。
*或许有人注意到了 CentOS 7 中存在被 backports 回来的 `overlay` 驱动,不过 CentOS 里的这个驱动达不到生产环境使用的稳定程度,所以不推荐使用。*
## Docker 1.13+
在 Docker 1.13+ 版本中推荐使用 `docker image` 来管理镜像。
```bash
$ docker image rm
```