Docker技术入门与实战(第3版)
上QQ阅读APP看书,第一时间看更新

3.1 获取镜像

镜像是运行容器的前提,官方的Docker Hub网站已经提供了数十万个镜像供大家开放下载。本节主要介绍Docker镜像的pull子命令。

可以使用docker [image] pull命令直接从Docker Hub镜像源来下载镜像。该命令的格式为docker [image] pull NAME[:TAG]。

其中,NAME是镜像仓库名称(用来区分镜像), TAG是镜像的标签(往往用来表示版本信息)。通常情况下,描述一个镜像需要包括“名称+标签”信息。

例如,获取一个Ubuntu 18.04系统的基础镜像可以使用如下的命令:

        $ docker pull ubuntu:18.04
        18.04: Pulling from library/ubuntu
        ...
        Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
        Status: Downloaded newer image for ubuntu:18.04

对于Docker镜像来说,如果不显式指定TAG,则默认会选择latest标签,这会下载仓库中最新版本的镜像。

下面的例子将从Docker Hub的Ubuntu仓库下载一个最新版本的Ubuntu操作系统的镜像:

        $ docker pull ubuntu
        Using default tag: latest
        latest: Pulling from library/ubuntu
        ...
        Digest: sha256:e27e9d7f7f28d67aa9e2d7540bdc2b33254b452ee8e60f388875e5b7d9b2b696
        Status: Downloaded newer image for ubuntu:latest

该命令实际上下载的就是ubuntu:latest镜像。

注意

一般来说,镜像的latest标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的latest标记的镜像。

下载过程中可以看出,镜像文件一般由若干层(layer)组成,6c953ac5d795这样的串是层的唯一id(实际上完整的id包括256比特,64个十六进制字符组成)。使用docker pull命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储了层的一份内容,减小了存储空间。

读者可能会想到,在不同的镜像仓库服务器的情况下,可能会出现镜像重名的情况。

严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,注册服务器)作为前缀,只是默认使用的是官方Docker Hub服务,该前缀可以忽略。

例如,docker pull ubuntu:18.04命令相当于docker pull registry.hub.docker.com/ubuntu:18.04命令,即从默认的注册服务器Docker Hub Registry中的ubuntu仓库来下载标记为18.04的镜像。

如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:18.04镜像,可以使用如下命令,此时下载的镜像名称为hub.c.163.com/public/ubuntu:18.04

        $ docker pull hub.c.163.com/public/ubuntu:18.04

pull子命令支持的选项主要包括:

❑ -a, --all-tags=true|false:是否获取仓库中的所有镜像,默认为否;

❑ --disable-content-trust:取消镜像的内容校验,默认为真。

另外,有时需要使用镜像代理服务来加速Docker镜像获取过程,可以在Docker服务启动配置中增加--registry-mirror=proxy_URL来指定镜像代理服务地址(如https://registry.docker-cn.com)。

下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运行bash应用,执行打印“Hello World”命令:

        $ docker run -it ubuntu:18.04 bash
        root@65663247040f:/# echo "Hello World"
        Hello World
        root@65663247040f:/# exit