diff --git a/SUMMARY.md b/SUMMARY.md index 7ee07fe..76d602a 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -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) diff --git a/image/README.md b/image/README.md index b9563f2..ddc4c52 100644 --- a/image/README.md +++ b/image/README.md @@ -11,5 +11,3 @@ Docker 运行容器前需要本地存在对应的镜像,如果本地不存在 * 管理本地主机上的镜像; * 介绍镜像实现的基本原理。 - -Docker 在 1.13 版本引进了新的管理命令(management commands),在 Docker 1.13+ 推荐使用 `docker image` 子命令来管理 Docker 镜像。 diff --git a/image/build.md b/image/build.md index 1680d9d..88a8254 100644 --- a/image/build.md +++ b/image/build.md @@ -218,11 +218,3 @@ $ docker build - < context.tar.gz ``` 如果发现标准输入的文件格式是 `gzip`、`bzip2` 以及 `xz` 的话,将会使其为上下文压缩包,直接将其展开,将里面视为上下文,并开始构建。 - -# Docker 1.13+ - -在 Docker 1.13+ 版本中推荐使用 `docker image` 来管理镜像。 - -```bash -$ docker image build -``` diff --git a/image/commit.md b/image/commit.md index 074c5c1..68ae6a6 100644 --- a/image/commit.md +++ b/image/commit.md @@ -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 diff --git a/image/internal.md b/image/internal.md index 66fc111..e2b4849 100644 --- a/image/internal.md +++ b/image/internal.md @@ -1,7 +1,9 @@ ## 镜像的实现原理 Docker 镜像是怎么实现增量的修改和维护的? + 每个镜像都由很多层次构成,Docker 使用 [Union FS](http://en.wikipedia.org/wiki/UnionFS) 将这些不同的层结合到一个镜像中去。 通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,Live CD 正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。 + Docker 在 AUFS 上构建的容器也是利用了类似的原理。 diff --git a/image/list.md b/image/list.md index 7199113..4c3e9e7 100644 --- a/image/list.md +++ b/image/list.md @@ -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` 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 ``。除了 `docker pull` 可能导致这种情况,`docker build` 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 `` 的镜像。这类无标签镜像也被称为 **虚悬镜像(dangling image)** ,可以用下面的命令专门显示这类镜像: ```bash -$ docker images -f dangling=true +$ docker image ls -f dangling=true REPOSITORY TAG IMAGE ID CREATED SIZE 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 -``` diff --git a/image/multistage-builds.md b/image/multistage-builds.md index 97be68f..44a93d8 100644 --- a/image/multistage-builds.md +++ b/image/multistage-builds.md @@ -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 diff --git a/image/other.md b/image/other.md index 2ce3db1..97c234b 100644 --- a/image/other.md +++ b/image/other.md @@ -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 -``` diff --git a/image/pull.md b/image/pull.md index fd3fae3..5daf529 100644 --- a/image/pull.md +++ b/image/pull.md @@ -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 -``` diff --git a/image/rmi.md b/image/rm.md similarity index 86% rename from image/rmi.md rename to image/rm.md index e18d59c..5ea41f9 100644 --- a/image/rmi.md +++ b/image/rm.md @@ -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 -```