使用镜像
获取镜像
从 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 命令进行镜像的批量删除.
来源: https://juejin.im/post/5c4d29ef6fb9a049e2326319