使用镜像
获取镜像
从 Docker 仓库获取镜像的命令是 docker pull
。其命名格式为:
docker pull [选项] [Docker Registry 地址[:端口]/] 仓库名[:标签]
复制代码
具体的选项可以通过 docker pull --help
命令查看。
镜像名称的格式为:
- Docker 仓库地址: <域名/IP>[:端口]。默认地址是Docker Hub
- 仓库名:分为两段式,<用户名>/<软件名>。对于 Docker Hub 而言默认为library,也就是官方镜像。
比如:
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
bf5d46315322: Pull complete
9f13e0ac480c: Pull complete
e8988b5b3097: Pull complete
40af181810e7: Pull complete
e6f7c7e5c03e: Pull complete
Digest: sha256:147913621d9cdea08853f6ba9116c2e27a3ceffecf3b49298
3ae97c3d643fbbe
Status: Downloaded newer image for ubuntu:18.04
复制代码
运行
有了镜像后,我们就能够以这个镜像为基础启动并运行一个容器。以上面的ubuntu:18.04 为例,如果我们打算启动里面的 bash 并且进行交互式操作的话,可以执行下面的命令。
xin@xin:~$ docker run -it --rm \
> ubuntu:18.04 \
> bash
root@d4b54a08d26f:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
root@d4b54a08d26f:/#
复制代码
docker run
就是容器运行的命令。
-it
:这两个参数,一个是-i
:交互式操作,一个是-t
终端。这里打算进入 bash 执行一些命令并查看返回结果,因此需要交互式终端。--rm
:这个参数是容器退出后随之将其删除。默认情况下,为了排除故障需求,退出的容器并不会立即删除,除非手动docker rm
。这里只是谁便知晓个命令,查看结果,不需要排除故障和保留结果,所以使用--rm
可以避免浪费空间。ubuntu:18.04
:这是指用unbuntu:18.04
镜像为基础来启动容器。bash
:放在镜像后面的是命令,希望有个交互式shell,因此用的是bash。
进入容器后,执行了cat /etc/os-release
,这是查看当前系统版本的命令,这里返回的是Ubuntu 18.04.1 LTS
系统。最后,使用exit
命令退出这个容器。
列出镜像
想要列出一件下载下来的镜像,可以使用 docker image ls
命令:
xin@xin:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 93fd78260bd1 4 weeks ago 86.2MB
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
复制代码
列表包含了 仓库名称、标签、镜像ID、创建时间、以及所占用的空间大小。
镜像体积
docker image ls
列表中的镜像体积综合并非是所有镜像实际硬盘消耗,由于Docker镜像是多层存储结果,并且可以继承和复用,因此不同镜像可能会因为使用相同的镜像基础,从而拥有共同的层。由于Docker使用UnionFS,相同的层字需要保存一份即可,因此实际镜像占用空间很可能要比这个列表镜像大小的综合要小很多。
可以通过以下命令来查看镜像、容器、数据卷所占用的空间大小。
xin@xin:~$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 1 86.18MB 86.18MB (99%)
Containers 3 0 0B 0B
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
复制代码
虚悬镜像
所谓的虚悬镜像也就是没有仓库名也没有标签的镜像,通过docker image ls
列出来的镜像列表展示出来的均为<none>
。
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 12 MB
复制代码
这个镜像原本是又镜像名称和标签的,随着镜像的维护,发布了新版本后,重新进行了 docker pull 仓库名:标签
时,这个镜像名被转移到了新下载的镜像上,而旧的镜像上的这个名称则被取消了,从而成为了<nonce>
。除了docker pull
可能会导致这种情况。docker build
也同样会导致这种情况。这类无标签的镜像也就被称为了虚悬镜像(dangling image)
,可以用下面的命令专门显示这类的镜像:
xin@xin:~$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 00285df0df87 5 days ago 12 MB
复制代码
一般来说,虚悬镜像已经没有存在的价值了,是可以随意删除的,可以用下面的命令删除:
xin@xin:~$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
复制代码
由于我的docker中已经没有了虚悬镜像,所以显示回收的空间为0B。
中间层镜像
Docker为了加速镜像的构建以及重复利用资源,它会利用中间层镜像。所以在使用一段时间后,可能会看到一些以来的中间层镜像,默认的docker image ls
列表中只会显示顶层镜像,如果希望显示中间层镜像在内的所有镜像的话,需要加上-a
参数。
docker image ls -a
复制代码
列出部分镜像
在使用docker image ls
这条命令时,会列出所有顶级镜像,但是有时候我们只希望列出一部分的镜像。docker image ls
有好几个参数可以帮助我们做到这个事情。
更具仓库名列出镜像:
xin@xin:~$ docker image ls ubuntu
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 93fd78260bd1 4 weeks ago 86.2MB
复制代码
也可以更具仓库名和标签名,列出特定的某个镜像:
xin@xin:~$ docker image ls ubuntu:18.04
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 93fd78260bd1 4 weeks ago 86.2MB
复制代码
除此之外,docker image ls
还支持强大的过滤器参数,--filter
,或者简写成 -f
。
我们希望看到hello-world:latest
之后建立的镜像,可以用下面的命令:
xin@xin:~$ docker image ls -f since=hello-world:latest
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 93fd78260bd1 4 weeks ago 86.2MB
复制代码
因为,docker在初始化的时候,第一个镜像就是hello-world
,之后再拉取了一个ubuntu:18.04
的镜像,所以在hello-world:latest
之后的镜像就是它了。
如果,想要看ubuntu:18.04
之前构建的镜像,只需要把since
换成before即可:
xin@xin:~$ docker image ls -f before=ubuntu:18.04
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
复制代码
如果,镜像构建时,定义了LABEL
,还可以通过LABEL
来过滤:
$ docker image ls -f label=com.example.version=0.1
...
复制代码
以特定格式显示
默认情况下,docker image ls
会输出一个完整的表格,但是我们并非所有的时候都会需要这些内容。比如,刚才删除虚悬镜像的时候,我们需要利用docker image ls
把所有的虚悬镜像的ID列出来,然后才可以交给docker image rm
命令作为参数来删除指定的这些镜像,这个时候就用到了 -q
参数。
xin@xin:~$ docker image ls -q
93fd78260bd1
4ab4c602aa5e
复制代码
--filter
配合-q
产生出指定范围的ID列表来,然后传给另外一个docker
命令作为参数,从而针对这组实体成批的经行某种操作的做法在Docker命令使用过程中是非常常见的,不仅仅是镜像,将来我们会在各种命令看到这类搭配来完成很强大的功能。
有些时候,我们可能只是对表格的结构不满意,希望自己组织列;或者不希望有标题,这样方便其他程序解析结果等,这就用到了GO的模板语法。
比如,下面的命令会直接列出镜像结果,并且只包含镜像ID和仓库名:
xin@xin:~$ docker image ls --format "{{.ID}}: {{.Repository}}"
93fd78260bd1: ubuntu
4ab4c602aa5e: hello-world
复制代码
是不是感觉到很强大呢!或者,你也可以打打算以表格等距显示,并且有标题行,和默认的一样,不过需要自己自定义列:
xin@xin:~$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"
IMAGE ID REPOSITORY TAG
93fd78260bd1 ubuntu 18.04
4ab4c602aa5e hello-world latest
复制代码
删除本地镜像
如果想要删除笨的的镜像,可以使用 docker image rm
命令,其格式为:
docker image rm [选项] <镜像1> [<镜像2> ...]
复制代码
用ID、镜像名、摘要删除镜像
其中,<镜像>可以是镜像短ID、镜像长ID、镜像名 或者 镜像摘要。
比如我们现在就有一些镜像:
xin@xin:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 93fd78260bd1 4 weeks ago 86.2MB
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB
复制代码
我们可用镜像的完整id,可以用镜像的短ID,一般来说我们都是使用短ID的,因为短ID只要取镜像ID的前3个字符以上,就可以区分别的镜像了。
比如,我想删除hello-world:latest
,它的镜像ID是4ab4c602aa5e
,然后执行命令:
xin@xin:~$ docker image rm 4ab
Untagged: hello-world:latest
Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f
Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b
复制代码
就这样,一个镜像就被删除了。想要删除镜像当然是不止这一种方式,还可以通过 <仓库名>:<标签名>
,来删除镜像。
xin@xin:~$ docker image rm hello-world:latest
Untagged: hello-world:latest
Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f
Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b
复制代码
如果,你觉得上面删除的方式都不够精确,我们可以使用镜像摘要
来删除镜像。
xin@xin:~$ docker image ls --digests
REPOSITORY TAG DIGEST IMAGE ID CREATED SIZE
ubuntu 18.04 sha256:6d0e0c26489e33f5a6f0020edface2727db9489744ecc9b4f50c7fa671f23c49 93fd78260bd1 4 weeks ago 86.2MB
hello-world latest sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788 4ab4c602aa5e 3 months ago 1.84kB
xin@xin:~$ docker image rm hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
复制代码
就这样,我们可以不同的方式进行镜像的删除。
用 docker image ls 命令来配合
有时候,我们需要删掉多个镜像的时候,一个一个的通过镜像ID来删除,这样的效率太慢了。所以,我们可以使用 docker image ls -q
来配合使用 docker image rm
进行批量删除希望删除的镜像。
比如,我们想删掉仓库名为 hello-world
的镜像:
xin@xin:~$ docker image rm $(docker image ls -q hello-world)
Untagged: hello-world:latest
Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f
Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b
复制代码
或者删除在 hello-world:latest
之后的镜像:
xin@xin:~$ docker image rm $(docker image ls -q -f since=hello-world:latest)
Untagged: redis:latest
Untagged: redis@sha256:bf65ecee69c43e52d0e065d094fbdfe4df6e408d47a96e56c7a29caaf31d3c35
...
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:6d0e0c26489e33f5a6f0020edface2727db9489744ecc9b4f50c7fa671f23c49
...
复制代码
是否感觉很爽呢,短短的一行命令就可以完成这么多繁琐的步骤呢。
小结
到目前为止,我们学会了简单的操作镜像命令以及对镜像有了一个基本的了解:
- 镜像有虚悬镜像和中间层镜像
- docker pull 命令可以拉取镜像
- docker run 命令可以运行指定仓库名和标签名的镜像
- docker image ls 可以列出所有的镜像,也可以通过 -f 参数来筛选想要列出的镜像,-q 参数可以通过go模板语法显示特定格式的镜像列表
- docker image rm 命令可以删除镜像,可以通过用ID、镜像名、摘要删除镜像。也可以通过docker image ls命令进行镜像的批量删除。