第二章:镜像

[TOC]

获取镜像

pull -- Pull an image or a repository from a registry,从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。

  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。如果要下载其他hub上面的镜像,就需要指定域名了,如下载华为的:docker pull swr.cn-north-1.myhuaweicloud.com/fang141x/tank:v1.1

如下为获取一个centos的镜像:

➜  ~ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
aeb7866da422: Pull complete 
Digest: sha256:67dad89757a55bfdfabec8abd0e22f8c7c12a1856514726470228063ed86593b
Status: Downloaded newer image for centos:latest

搜索镜像

搜索官方提供的带nginx关键字的镜像。official是否是官方的

STARS为收藏数,--filter stars=4是指过滤出收藏数量在4以上的image

运行

  • -d: 后台运行容器,并返回容器ID

  • -i:以交互模式运行容器,通常与 -t 同时使用

  • -t:为容器重新分配一个伪输入终端

  • -p:端口映射,格式为:主机(宿主)端口:容器端口

  • -m:设置容器使用内存最大值

  • -v:给容器挂载存储卷,挂载到容器的某个目录

  • --name="nginx-lb": 为容器指定一个名称,后续可以通过名字进行容器管理,links特性需要使用名字

  • --rm:这个参数是说容器退出后随之将其删除。默认情况下,为了排障需求,退出的容器并不会立即删除,除非手动 docker rm。

  • --net: 指定容器的网络连接类型,支持 bridge/host/none/container四种类型;

    • --net=bridge: 使用docker daemon指定的网桥

    • --net=host: 容器使用主机的网络

    • --net=container:NAME_or_ID:使用其他容器的网路,共享IP和PORT等网络资源

    • --net=none:容器使用自己的网络(类似--net=bridge),但是不进行配置

其他参数如下:

运行刚刚下载的centos镜像包,这里使用了--rm表示可以使用exit直接退出运行,当容器退出后随之将其删除。但是以下使用了ctrl+p,ctrl+q返回了宿主机。

以下命令是运行tank镜像,使用本地的default.conf配置文件,将宿主机的端口8081映射到容器的8080端口上。

查看镜像

使用docker image ls或者docker images命令即可。可以使用--format参数来指定输出的格式。

有时会出现仓库名、标签均为 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image),可以使用ocker image prune删除,前提是容器必须完全退出才能删除。

删除镜像

使用docker image rm或者docker rmi来执行。删除image之前必须先删除container。如下,即使容器没有运行。

如果观察上面这几个命令的运行输出信息的话,你会注意到删除行为分为两类,一类是 Untagged,另一类是 Deleted。我们之前介绍过,镜像的唯一标识是其 ID 和摘要,而一个镜像可以有多个标签。

因此当我们使用上面命令删除镜像的时候,实际上是在要求删除某个标签的镜像。所以首先需要做的是将满足我们要求的所有镜像标签都取消,这就是我们看到的 Untagged 的信息。因为一个镜像可以对应多个标签,因此当我们删除了所指定的标签后,可能还有别的标签指向了这个镜像,如果是这种情况,那么 Delete 行为就不会发生。所以并非所有的 docker image rm 都会产生删除镜像的行为,有可能仅仅是取消了某个标签而已。

当该镜像所有的标签都被取消了,该镜像很可能会失去了存在的意义,因此会触发删除行为。镜像是多层存储结构,因此在删除的时候也是从上层向基础层方向依次进行判断删除。镜像的多层结构让镜像复用变动非常容易,因此很有可能某个其它镜像正依赖于当前镜像的某一层。这种情况,依旧不会触发删除该层的行为。直到没有任何层依赖当前层时,才会真实的删除当前层。

Last updated

Was this helpful?