使用 Docker 镜像

围绕Docker镜像的一系列重要命令操作,包括获取、查看、搜索、删除、创建、存出和载入、上传等。

Docker 运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker 会尝试先从默认镜像仓库下载(默认使用 Docker Hub 公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。

1. 获取镜像

docker pull NAME [:TAG]

NAME 是镜像仓库的名称(用来区分镜像),TAG 是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息。 例如,获取一个 Ubuntu 14.04 系统的基础镜像可以使用如下的命令: docker pull ubuntu:14.04 对于 Docker 镜像来说,如果不显式指定 TAG,则默认会选择 latest 标签,这会下载仓库中最新版本的镜像。 例如: docker pull ubuntu 下载最新的 Ubuntu 系统镜像,与 docker pull ubuntu:latest 一致。

一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新的非稳定版本而发布,内容是不稳定的。当前Ubuntu最新的发行版本为16.04,latest镜像实际上就是16.04镜像,用户可以下载ubuntu:16.04镜像并查看,两者的数字摘要值是一致的。从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。

严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,只是我们默认使用的是Docker Hub服务,该前缀可以忽略。 例如,docker pull ubuntu:14.04 命令相当于docker pull registry.hub.docker.com/ubuntu:14.04 命令,即从默认的注册服务器Docker Hub Registry 中的 ubuntu 仓库来下载标记为14.04的镜像。


子命令: -a,--all-tag=true|false 是否获取仓库中的所有镜像,默认为否。

2. 查看镜像信息

使用 images 命令列出镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

在列出的信息中,可以看到以下几个字段信息 REPOSITORY:来自于哪个仓库,比如ubuntu仓库用来保存ubuntu系列的基础镜像。

TAG:镜像的标签信息,比如14.04、latest用来标注不同的版本信息。标签只是标记,并不能标识镜像内容。

IMAGE ID:镜像的ID(唯一标识镜像),如ubuntu:latest和ubuntu:16.04镜像的ID都是2fa927b5cdd3,说明它们目前实际上指向同一个镜像。

CREATED:创建时间,说明镜像最后的更新时间。

SIZE:镜像大小,优秀的镜像往往体积都较小。


子命令: -a,--all=true|false 列出所有的镜像文件(包括临时文件),默认为否 -digests=true|false 列出镜像的数字摘要值,默认为否 -f,--filter=[] 过滤列出的镜像,如dangling=true只显示没有被使用的镜像;也可指定带有特定标注的镜像等。

--format="TEMPLATE" 控制输出格式,如.ID代表ID信息,.Repository代表仓库信息等

--no-trunc=true|false 对输出结果中太长的部分是否进行截断,如镜像的ID信息,默认为是

-q,--quiet=true|false 仅输出ID信息,默认为否。

其中,对输出结果进行控制的选项如 -f,–filter=[]、–no-trunc=true|false、-q,–quiet=true|false等,大部分子命令都支持。

使用tag命令添加镜像标签

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

例如添加一个新的myubuntu:latest镜像标签: docker tag ubuntu:latest myubuntu:latest

之后,用户就可以直接使用myubuntu:latest来表示这个镜像了。 docker tag命令添加的标签实际上起到了类似链接的作用。

使用inspect命令查看详细信息

docker inspect OPTIONS] NAME|ID [NAME|ID...]

使用 docker inspect 命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等。 例如: docker inspect ubuntu:14.04

返回的是一个JSON格式的消息,如果我们只要其中一项内容时,可以使用参数-f来指定,例如,获取镜像的Architecture:

docker inspect -f {{".Architecture"}} amd64

使用history命令查看镜像历史

docker history [OPTIONS] IMAGE

该命令将列出各层的创建信息。

例如查看 ubuntu:14.04 镜像的创建过程

docker history ubuntu:14.04

3. 搜索镜像

docker search [OPTIONS] TERM

搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。

支持的参数:

--automated=true|false 仅显示自动创建的镜像,默认为否

--no-trunc=true|false 输出信息不截断显示,默认为否

-s,--stars=X 指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像

注:最新的 docker 18 版本中,automatedstarts 都已经归并到 filter 中,--filter=stars--filter=is-automated

例如,搜索所有自动创建的评价为1+的带nginx关键字的镜像,如下所示:

$ docker search --automated -s 3 nginx
(version 18) $ docker search --filter=stars=3 --filter=is-automated=true nginx
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
jwilder/nginx-proxy                                    Automated Nginx reverse proxy for docker con…   1357                                    [OK]
richarvey/nginx-php-fpm                                Container running Nginx + PHP-FPM capable of…   586                                     [OK]
jrcs/letsencrypt-nginx-proxy-companion                 LetsEncrypt container to use with nginx as p…   385                                     [OK]
webdevops/php-nginx                                    Nginx with PHP-FPM                              106                                     [OK]
zabbix/zabbix-web-nginx-mysql                          Zabbix frontend based on Nginx web-server wi…   58                                      [OK]
bitnami/nginx                                          Bitnami nginx Docker Image                      54                                      [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5   ubuntu-16-nginx-php-phpmyadmin-mysql-5          36                                      [OK]
tobi312/rpi-nginx                                      NGINX on Raspberry Pi / armhf                   20                                      [OK]
wodby/drupal-nginx                                     Nginx for Drupal container image                9                                       [OK]
blacklabelops/nginx                                    Dockerized Nginx Reverse Proxy Server.          9                                       [OK]
webdevops/nginx                                        Nginx container                                 8                                       [OK]
nginxdemos/hello                                       NGINX webserver that serves a simple page co…   7                                       [OK]
1science/nginx                                         Nginx Docker images that include Consul Temp…   4                                       [OK]

返回信息包含关键字的镜像,其中包括镜像名字、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。

默认的输出结果将按照星级评价进行排序。

4. 删除镜像

使用标签删除镜像

docker rmi [OPTIONS] IMAGE [IMAGE...]

例如,要删除掉myubuntu:latest镜像,可以使用如下命令: docker rmi myubuntu:latest

当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。但当镜像只剩下一个标签的时候就要小心了,此时再使用docker rmi命令会彻底删除镜像。

使用镜像 ID 删除镜像

当使用 docker rmi 命令,并且后面跟上镜像的ID(也可以是能进行区分的部分ID串前缀)时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。

如果要想强行删除镜像,可以使用-f参数。

注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。

5. 创建镜像

创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。

基于已有镜像的容器创建

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

-a,--author="" 作者信息

-c,--change=[] 提交的时候执行Dockerfile指令,包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等

-m,--message="" 提交消息

-p,--pause=true 提交时暂停容器运行

例子: 先进入容器,进行一些变更

$ docker run -it ubuntu:14.04 /bin/bash
root@a925cb40b3f0:/# touch test
root@a925cb40b3f0:/# exit

提交改变生成一个新的镜像

$ docker commit -m "Added a new file" -a "Docker Newbee" a925cb40b3f0 test:0.1
9e9c814023bcffc3e67e892a235afe61b02f66a947d2747f724bd317dda02f27

基于本地模板导入

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

例如,下载了ubuntu-14.04的模板压缩包,之后使用以下命令导入:

$ cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

6. 导出和导入镜像

导出镜像

docker save [OPTIONS] IMAGE [IMAGE...]

例子: $ docker save -o ubuntu_14.04.tar ubuntu:14.04

导入镜像

docker load [OPTIONS]

例子: $ docker load --input ubuntu_14.04.tar$ docker load < ubuntu_14.04.tar

7. 上传镜像

docker push [OPTIONS] NAME[:TAG]

可以使用docker push命令上传镜像到仓库,默认上传到Docker Hub官方仓库

$ docker tag test:latest user/test:latest
$ docker push user/test:latest
The push refers to a repository [docker.io/user/test]
Sending image list
Please login prior to push:
Username:
Password:
Email: