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/container/README.md b/container/README.md index f9efcce..5d571a9 100644 --- a/container/README.md +++ b/container/README.md @@ -4,5 +4,3 @@ 简单的说,容器是独立运行的一个或一组应用,以及它们的运行态环境。对应的,虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。 本章将具体介绍如何来管理一个容器,包括创建、启动和停止等。 - -Docker 在 1.13 版本中引进了新的管理命令(management commands),在 Docker 1.13+ 推荐使用 `docker container` 子命令来管理 Docker 容器。 diff --git a/container/daemon.md b/container/daemon.md index 582e2f4..c37c144 100644 --- a/container/daemon.md +++ b/container/daemon.md @@ -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 -``` diff --git a/container/enter.md b/container/enter.md index 7df65f4..789a6d0 100644 --- a/container/enter.md +++ b/container/enter.md @@ -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 -``` diff --git a/container/import_export.md b/container/import_export.md index 99874db..866c964 100644 --- a/container/import_export.md +++ b/container/import_export.md @@ -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 -``` diff --git a/container/rm.md b/container/rm.md index f54b5f8..4de8504 100644 --- a/container/rm.md +++ b/container/rm.md @@ -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 -``` diff --git a/container/run.md b/container/run.md index 10019f3..2314b92 100644 --- a/container/run.md +++ b/container/run.md @@ -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 -``` diff --git a/container/stop.md b/container/stop.md index 6113161..b4e358f 100644 --- a/container/stop.md +++ b/container/stop.md @@ -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` 命令会将一个运行态的容器终止,然后再重新启动它。 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 -```