使用Docker镜像(第三章)

  • 关键词:如何使用Docker镜像

使用Docker镜像

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

获取镜像

  • 1.获取镜像:

docker [image] pull NAME[:TAG] => docker pull ubuntu:18.04

NAME是镜像仓库名称(区分镜像),TAG是镜像的标签(表示版本信息)。

如果不显示指定TAG,则默认会选择latest版本。注意,镜像的latest标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。为了稳定性,不要在生产环境中忽略镜像的标签信息。

下载的镜像文件一般由若干层(layer)组成,每层都有唯一的ID。使用docker pull命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储了层的一份内容,减小内存空间。

是否会出现不同的镜像仓库服务器可能会出现镜像重名的情况?

严格地讲,镜像的仓库名称中还应该添加仓库地址(即Registry,仓库服务器)。

示例:docker pull registory.hub.docker.com/ubuntu:18.04

pull子命令 说明
-a, –all-ags=true|false 是否获取仓库中的所有镜像,默认为否
–disable-content-trust 取消镜像的内容校验,默认为真

使用镜像代理服务器加速docker镜像获取过程,可以在docker服务启动配置中增加–registry-mirror=proxy_URL来指定镜像代理服务地址。

  • 2.下载镜像到本地后,利用镜像创建一个容器,在其中运行bash应用,执行打印“hello world”命令:

docker run -it ubuntu:18.04 bash + echo “Hello World” + exit

  • 查看镜像信息(使用images命令列出镜像):

docker images或docker image ls 命令可以列出本地主机上已有镜像的基本信息(仓库、标签信息、ID、创建时间、镜像大小)

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

更多子命令选项还可以通过man docker-images来查看。

  • 3.使用tag命令添加镜像标签:

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

实际上指向了同一个镜像文件,只是别名不同而巳。docker tag命令添加的标签实际上起到了类似链接的作用。

  • 使用inspect命令查看详细信息:

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

docker [image] inspect ubuntu:18.04

上面代码返回的是一个JSON格式的消息, 如果我们只要其中一项内容时, 可以使用-f来指定:

获取镜像的Architecture:docker [image] inspect -f .Architecture ubuntu:18.04

  • 4.使用history命令查看镜像历史:

docker history ubuntu: 18.04

搜寻镜像

使用docker search命令可以搜索Docker Hub官方仓库中的镜像。语法为 docker search [option] keyword。

search子命令 说明
-f, –filter filter 过滤输出内容
–format string 格式化输出内容
–limit int 限制输出结果个数,默认为25个
–no-trunc 不截断输出结果

搜索官方提供的带nginx关键字的镜像:docker search –filter=is-official=true nginx

搜索所有收藏数超过4的关键词包括tensorflow的镜像:docker search –filter=stars=4 tensorflow

删除和清理镜像

Docker镜像的rm和prune子命令。

  • 1.使用标签删除镜像:

使用docker rmi或 docker image rm命令可以删除镜像,命令格式为docker rmi IMAGE [OPTIONS] [IMAGE…],其中IMAGE可以为标签或ID。

rmi子命令 说明
-f, -force 强制删除镜像,即使有容器依赖它
-no-prune 不要清理未带标签的父镜像

要删除掉myubuntu:latest镜像:docker rmi myubuntu:latest

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

  • 2.使用镜像ID来删除镜像:

当使用docker rmi命令,并且后面跟上镜像的ID时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

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

先利用ubuntu:18.04镜像创建一个简单的容器来输出一段话:docker run ubuntu: 18. 04 echo ‘hello! I am here!’

使用docker ps -a命令可以看到本机上存在的所有容器:docker ps -a

试图删除该新建镜像,Docker会提示有容器正在运行,无法删除:docker rmi ubuntu:18.04

如果要想强行删除镜像,可以使用-f参数:docker rmi -f ubuntu:18.04

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

首先删除容器a:docker rm a

然后使用ID来删除镜像:docker rmi b

  • 3.清理镜像:

使用Docker一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prune命令来进行清理。

prune子命令 说明
-a, -all 删除所有无用镜像,不光是临时镜像
-filter filter 只清理符合给定过滤器的镜像
-f, -force 强制删除镜像,而不进行提示确认

自动清理临时的遗留镜像文件层,最后会提示释放的存储空间:docker image prune -f

创建镜像

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

  • 1.基于已有容器创建:

该方法主要是使用 docker [container] commit命令。

命令格式为:docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

image

首先,启动一个镜像,并在其中进行修改操作。例如:创建一个test文件,之后退出。docker run -it ubuntu:18.04 /bin/bash + touch test + exit

可以使用 docker [container] commit 命令来提交为一个新的镜像。提交时可以使用 ID 或名称来指定容器,docker [container] commit “Added a new file” -a “Docker Newbee” a925cb40b3f0 test:0.1

此时查看本地镜像列表,docker images

  • 2.基于本地模板导入:

用户也可以直接从一个操作系统模板文件导入一个镜像。

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

要直接导入一个镜像,可以使用OpenVZ提供的模板来创建,或者使用其他已导出的镜像模板来创建。

cat ubuntu-18.04-x86_64-minimal.tar.gz docker import - ubuntu:18.04
  • 3.基于Dockerfile创建:

Dockerfile是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。

创建镜像的过程可以使用 docker [image] build命令,编译成功后本地将多出一个python:3镜像。

存出和载入镜像

用户可以使用docker [image] save和docker [image] load命令来存出和载入镜像。

  • 1.存出镜像

如果要导出镜像到本地文件,可以使用docker [image] save命令。该命令支持-o,-output string参数。

  • 2.载入镜像

用户可以使用docker [image] load将导出的tar文件再导入到本地镜像库。支持-i,-input string选项,从指定文件中读入镜像内容。

docker load -i ubuntu_18.04.tar 或者 docker load < ubuntu_18.04.tar

上传镜像

可以使用docker [image] push命令上传镜像到仓库,默认上传到Docker Hub官方仓库(需要登陆)。

命令格式:docker [image] push MAME[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

用户user上传本地的test:latest镜像,可以先添加新的标签user/test:latest,然后用docker [image] push命令上传镜像:

docker tag test:latest user/test:latest

docker push user/test:latest

第一次上传时,会提示输入登陆信息或进行注册,之后登陆信息会记录到本地~/.docker目录下。