使用 Docker 镜像
镜像是 Docker 三大核心概念中最重要的,自 Docker 诞生之日起镜像就是相关社区最为热门的关键词。
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在,Docker 会尝试先从默认镜像仓库下载(默认使用 Docker Hub 公共注册服务器中的仓库),用户也可以通过配置,使用自定义的镜像仓库。
本章将围绕镜像这一核心概念介绍具体操作,包括如何使用 pull
命令从 Docker Hub 仓库中下载镜像到本地;如何查看本地已有的镜像信息和管理镜像标签;如何在远端仓库使用 search
命令进行搜索和过滤;如何删除镜像标签和镜像文件;如何创建用户定制的镜像并且保存为外部文件。最后,还将介绍如何往 Docker Hub 仓库中推送自己的镜像。
获取镜像
镜像是运行容器的前提,官方的 Docker Hub 网站已经提供了数十万个镜像供大家开放下载。但是,根据 Docker 公司政策,2020 年 11 月 01 日起将逐步向 Docker Hub 匿名和免费用户实施速率和拉取请求次数限制。因此,如果您在个人版中构建服务拉取 Docker Hub 镜像,将可能受此影响导致构建失败。
关于 Docker Hub 拉取请求次数限制的详细介绍,请参见 Download rate limit。
解决方法
要解决此问题,需要配置国内仓库源。
$ sudo vim /etc/docker/daemon.json
#新建daemon.json文件,并配置以下内容
{
"registry-mirrors": ["<国内加速镜像源地址>"]
}
#保存推出
#国内加速镜像源地址
https://registry.docker-cn.com
http://hub-mirror.c.163.com
https://3laho3y3.mirror.aliyuncs.com
http://f1361db2.m.daocloud.io
https://mirror.ccs.tencentyun.com
#然后重新加载配置,重启服务
$ sudo systemctl daemon-reload
$ sudo systemctl restart 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
e4ca327ec0e7: Pull complete
Digest: sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79
Status: Downloaded newer image for ubuntu:18.04
docker.io/library/ubuntu:18.04
对于 Docker 镜像来说,如果不显式指定 TAG,则默认会选择 latest 标签,这会下载仓库中最新版本的镜像。
下面的例子将从 centos 仓库下载一个最新版本的 centos 操作系统的镜像:
$ docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
该命令实际上下载的就是 centos:latest 镜像。
注意
一般来说,镜像的 latest 标签意味着该镜像的内容会跟踪最新版本的变更而变化,内容是不稳定的。因此,从稳定性上考虑,不要在生产环境中忽略镜像的标签信息或使用默认的 latest 标记的镜像。
下载过程中可以看出,镜像文件一般由若干层(layer)组成,e4ca327ec0e7 这样的串是层的唯一 id(实际上完整的 id 包括 256 比特,64 个十六进制字符组成)。使用 docker pull
命令下载中会获取并输出镜像的各层信息。当不同的镜像包括相同的层时,本地仅存储了层的一份内容,减小了存储空间。
你可能会想到,在不同的镜像仓库服务器的情况下,可能会出现镜像重名的情况。
严格地讲,镜像的仓库名称中还应该添加仓库地址(即 registry,注册服务器)作为前缀,只是默认使用的是官方 Docker Hub 服务,该前缀可以忽略。
例如,docker pull ubuntu:18.04
命令相当于 docker pull registry.hub.docker.com/ubuntu:18.04
命令,即从默认的注册服务器 Docekr Hub Registry 中的 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:取消镜像的内容校验,默认为真。
另外,有时需要使用镜像代理服务来加速 Docke 镜像获取过程,可以在 Docker 服务 启动配置中增加 --registry-mirror=proxy_URL 来指定镜像代理服务地址(如 https:// registry.docker-en.com)
下载镜像到本地后,即可随时使用该镜像了,例如利用该镜像创建一个容器,在其中运 行 bash 应用,执行打印"HelloWorld"命令:
$ docker run -it ubuntu:18.04 bash
root@65663247040f:/# echo "Hello World"
Hello World
root@65663247040f:/# exit
exit
$
查看镜像信息
主要介绍 Docker 镜像的 ls
、tag
和 inspect
子命令。
1、使用 images 命令列出镜像
使用 docker images
或 docker image ls
命令可以列出本地主机上已有镜像的基本信息。
例如,下面的命令列出了之前下载的镜像信息:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 54919e10a95d 2 days ago 63.1MB
hello-world latest d1165f221234 6 months ago 13.3kB
centos latest 300e315adb2f 8 months ago 209MB
在列出信息中,可以看到几个字段信息:
来自于哪个仓库,比如 ubuntu 表示 ubuntu 系列的基础镜像;
镜像的标答信息,比如 18.04、latest 表示不同的版本信息。标签只是标记,并不能标 识镜像内容;
镜像的 ID(唯一标识镜像),如果两个镜像的 ID 相同,说明它们实际上指向了同一个镜像,只是具有不同标签名称而已;
创建时间,说明镜像最后的更新时间;
镜像大小,优秀的镜像往往体积都较小。
其中镜像的 ID 信息十分重要,它唯一标识了镜像。在使用镜像 ID 的时候,一般可以使用该 ID 的前若干个字符组成的可区分串来替代完整的 ID。
TAG 信息用于标记来自同一个仓库的不同镜像。例如 ubuntu 仓库中有多个镜像,通过 TAG 信息来区分发行版本,如 18.04、18.10 等。
镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。
images 子命令主要支持如下选项,用户可以自行进行尝试:
-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 等。
更多子命令选项还可以通过 man docker-images
来查看。
2、使用 tag 命令添加镜像标签
为了方便在后续工作中使用特定镜像,还可以使用 docker tag
命令来为本地镜像任意添加新的标签。 例如,添加 一 个新的 centos:latest 镜像标签:
$ docker tag centos:latest mycentos
再次使用 docker images
列出本地主机上镜像信息, 可以看到多了一 个 mycentos:latest 标签的镜像:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 54919e10a95d 2 days ago 63.1MB
hello-world latest d1165f221234 6 months ago 13.3kB
centos latest 300e315adb2f 8 months ago 209MB
mycentos latest 300e315adb2f 8 months ago 209MB
之后, 用户就可以直接使用 mycentos:latest 来表示这个镜像了。 细心的你可能注意到, 这些 mycentos:latest 镜像的 ID 跟 centos:latest 是完全一致的,它们实际上指向了同一个镜像文件,只是别名不同而巳。docker tag
命令添加的标签实际上起到了类似链接的作用。
3、使用 inspect 命令查看详细信息
使用 docker [image] inspect
命令可以获取该镜像的详细信息,包括制作者、适应架构、各层的数字摘要等:
$ docker inspect ubuntu:18.04
[
{
"Id": "sha256:54919e10a95d6f756f7286dc0fa6b3e25b637a7f90e361504b0b14ab6762a547",
"RepoTags": [
"ubuntu:18.04"
],
"RepoDigests": [
"ubuntu@sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79"
],
"Parent": "",
"Comment": "",
"Created": "2021-08-31T01:20:48.414661265Z",
...
上面代码返回的是一个 JSON 格式的消息,如果我们只要其中一项内容时,可以使用 -f 来指定,例如,获取镜像的 Architecture:
$ docker inspect -f {{".Architecture"}} ubuntu:18.04
amd64
4、使用 history 命令查看镜像历史
既然镜像文件由多个层组成, 那么怎么知道各个层的内容具体是什么呢?这时候可以使用 history
子命令,该命令将列出各层的创建信息。
例如,查看 ubuntu:18.04 镜像的创建过程,可以使用如下命令:
$ docker history ubuntu:18.04
IMAGE CREATED CREATED BY SIZE COMMENT
54919e10a95d 2 days ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 2 days ago /bin/sh -c #(nop) ADD file:425a053fd043786e9… 63.1MB
注意
过长的命令被自动截断了,可以使用前面提到的 --no-trunc 选项来输出完整命令。
搜寻镜像
本节主要介绍 Docker 镜像的 search
子命令。使用 docker search
命令可以搜索 Docker Hub 官方仓库中的镜像。 语法为 docker search [option] keyword
。支持的命令选项主要包括:
-f,--filter filter:过滤输出内容;
--format string:格式化输出内容;
--limit int:限制输出结果个数,默认为 25 个;
--no-trunc:不截断输出结果。
例如,搜索官方提供的带 nginx 关键字的镜像,如下所示:
$ docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 15394 [OK]
再比如,搜索所有收藏数超过 4 的关键词包括 tensorflow 的镜像:
$ docker search --filter=stars=4 tensorflow
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
tensorflow/tensorflow Official Docker images for the machine learn… 1944
jupyter/tensorflow-notebook Jupyter Notebook Scientific Python Stack w/ … 280
tensorflow/serving Official images for TensorFlow Serving (http… 117
rocm/tensorflow Tensorflow with ROCm backend support 62
xblaster/tensorflow-jupyter Dockerized Jupyter with tensorflow 56 [OK]
floydhub/tensorflow tensorflow 29 [OK]
opensciencegrid/tensorflow-gpu TensorFlow GPU set up for OSG 12
emacski/tensorflow-serving Project images from https://github.com/emacs… 10
tokunagaken/tensorflow-keras-jupyter-py3 TensorFlow-gpu 1.13.1 Keras 2.2.4 python 3.5… 5
tensorflow/tf_grpc_test_server Testing server for GRPC-based distributed ru… 4
可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。默认的输出结果将按照星级评价进行排序。
删除和清理镜像
主要介绍 Docker 镜像的 rm
和 prune
子命令。
1、使用标签删除镜像
使用 docker rmi
或 docker image rm
命令可以删除镜像,命令格式为 docker rmi IMAGE [IMAGE...]
,其中 IMAGE 可以为标签或 ID。
支持选项包括:
- -f,-force:强制删除镜像,即使有容器依赖它;
- -no-prune:不要清理未带标签的父镜像。
例如,要删除掉 mycentos:latest 镜像,可以使用如下命令:
$ docker rmi mycentos:latest
Untagged: mycentos:latest
你可能会想到,本地的 centos:latest 镜像是否会受到此命令的影响。无须担心,当同一个镜像拥有多个标签的时候,docker rmi
命令只是删除了该镜像多个标签中的指定标签而巳,并不影响镜像文件。因此上述操作相当于只是删除了镜像 300e315adb2f 的一个标签副本而已。
保险起见,再次查看本地的镜像,发现 centos:latest 镜像(准确地说,300e315adb2f 镜像)仍然存在:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 54919e10a95d 2 days ago 63.1MB
hello-world latest d1165f221234 6 months ago 13.3kB
centos latest 300e315adb2f 8 months ago 209MB
但当镜像只剩下一个标签的时候就要小心了,此时再使用 docker rmi
命令会彻底删除镜像。
例如通过执行 docker rmi
命令来删除只有一个标签的镜像,可以看出会删除这个镜像文件的所有文件层:
$ docker rmi hello-world:latest
Untagged: hello-world:latest
Untagged: hello-world@sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd
说明
如果在删除镜像,遇到下面的 Erroe 时,需要先删除容器,再删除镜像。
# 1、删除镜像时出现 Error
$ docker rmi hello-world:latest
Error response from daemon: conflict: unable to remove repository reference "hello-world:latest" (must force) - container 882249d25e88 is using its referenced image d1165f221234
# 2、先删除容器(可以查到镜像所在容器的CONTAINER ID)
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
882249d25e88 hello-world "/hello" 4 hours ago Exited (0) 4 hours ago priceless_neumann
dba94731dbca centos "bash" 4 hours ago Exited (0) 4 hours ago romantic_benz
810d3dbcd35b ubuntu:18.04 "bash" 4 hours ago Exited (0) 4 hours ago naughty_hoover
#删除容器(对应的CONTAINER ID)
$ docker rm 882249d25e88
882249d25e88
# 3、最后删除镜像
$ docker rmi hello-world:latest
Untagged: hello-world:latest
Untagged: hello-world@sha256:7d91b69e04a9029b99f3585aaaccae2baa80bcf318f4a5d2165a9898cd2dc0a1
Deleted: sha256:d1165f2212346b2bab48cb01c1e39ee8ad1be46b87873d9ca7a4e434980a7726
Deleted: sha256:f22b99068db93900abe17f7f5e09ec775c2826ecfe9db961fea68293744144bd
2、使用镜像 ID 来删除镜像
当使用 docker rmi
命令,并且后面跟上镜像的 ID (也可以是能进行区分的部分 ID 前缀)时, 会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:先利用 ubuntu:18.04 镜像创建一个简单的容器来输出 一 段话:
$ docker run ubuntu:18.04 echo 'hello! I am here!'
hello! i am here!
使用 docker ps -a
命令可以看到本机上存在的所有容器:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
586d17fcdf93 ubuntu:18.04 "echo 'hello! i am h…" 25 seconds ago Exited (0) 23 seconds ago vigilant_wu
dba94731dbca centos "bash" 4 hours ago Exited (0) 4 hours ago romantic_benz
810d3dbcd35b ubuntu:18.04 "bash" 4 hours ago Exited (0) 4 hours ago naughty_hoover
可以看到,后台存在一个退出状态的容器,是刚基于 ubuntu:18.04 镜像创建的。试图删除该镜像,Docker 会提示有容器正在运行,无法删除:
$ docker rmi ubuntu:18.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:18.04" (must force) - container 810d3dbcd35b is using its referenced image 54919e10a95d
如果要想强行删除镜像, 可以使用 -f 参数:
$ docker rmi -f ubuntu:18.04
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79
Deleted: sha256:54919e10a95d6f756f7286dc0fa6b3e25b637a7f90e361504b0b14ab6762a547
注意,通常并不推荐使用 -f 参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
首先删除容器 586d17fcdf93:
$ docker rm 586d17fcdf93
然后使用 ID 来删除镜像,此时会正常打印出删除的各层信息:
$ docker rmi 54919e10a95d
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:9bc830af2bef73276515a29aa896eedfa7bdf4bdbc5c1063b4c457a4bbb8cd79
Deleted: sha256:54919e10a95d6f756f7286dc0fa6b3e25b637a7f90e361504b0b14ab6762a547
Deleted: sha256:6babb56be2593d69d561cae7ad16b670a1ee7c0a32b4fa715007fba7febd5ddb
3、清理镜像
使用 Docker 一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过 docker image prune
命令来进行清理。
支待选项包括:
-a,-all:删除所有无用镜像,不光是临时镜像;
-filter filter:只清理符合给定过滤器的镜像;
-f,-force:强制删除镜像,而不进行提示确认。
例如,如下命令会自动清理临时的遗留镜像文件层,最后会提示释放的存储空间:
$ docker image prune -f
. . .
Total reclaimed space: 1.4 GB
创建镜像
创建镜像的方法主要有三种:基于已有镜像的容器创建、基于本地模板导入、基于 Dockerfile 创建。
这里主要介绍 Docker 的 commit
、import
和 build
子命令。
1、基于已有容器创建
该方法主要是使用 docker [container] commit
命令。
命令格式为 docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
,主要选项包括:
-a,--author="":作者信息;
-c,--change=[]:提交的时候执行 Dockerfile 指令,
包括CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR 等;
-m,--message= “”:提交消息;
-p,--pause=true:提交时暂停容器运行。
下面将演示如何使用该命令创建一个新镜像。
首先,启动一个镜像,并在其中进行修改操作。例如,创建一个 test 文件,之后退出,代码如下:
$ docker run -it ubuntu:18.04 /bin/bash
root@38e4a9445436:/# touch test
root@38e4a9445436:/# exit
exit
记住容器的 ID 为 38e4a9445436。此时该容器与原 ubuntu:18.04 镜像相比,已经发生了改变,可以使用 docker [container] commit
命令来提交为一个新的镜像。提交时可以使用 ID 或名称来指定容器:
$ docker commit -m "ADDed a new file" -a "Docker Newbee" 38e4a9445436 test:0.1
sha256:fdebc600d6f4ff0296917924668be67608af1af4ae10e4a9583478d9815a7969
顺利的话,会返回新创建镜像的 ID 信息,例如:
fdebc600d6f4ff0296917924668be67608af1af4ae10e4a9583478d9815a7969。
此时查看本地镜像列表,会发现新创建的镜像已经存在了:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test 0.1 fdebc600d6f4 28 seconds ago 63.1MB
ubuntu 18.04 54919e10a95d 2 days ago 63.1MB
centos latest 300e315adb2f 8 months ago 209MB
2、基于本地模板导入
用户也可以直接从一个操作系统模板文件导人一个镜像,主要使用 docker [container] import 命令。命令格式为 docker [image] import [OPTIONS] file|URL| - [REPOSITORY [:TAG]]
要直接导人一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已导出的镜像模板来创建。OPENVZ 模板的下载地址为 https://download.openvz.org/template/precreated/。
例如,下载了 ubuntu-18.04 的模板压缩包,之后使用以下命令导人即可:
$ wget https://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
--2021-09-02 16:25:09-- https://download.openvz.org/template/precreated/centos-7-x86_64-minimal.tar.gz
正在解析主机 download.openvz.org (download.openvz.org)... 185.231.241.69
正在连接 download.openvz.org (download.openvz.org)|185.231.241.69|:443... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度: 145639219 (139M) [application/x-gzip]
正在保存至: “centos-7-x86_64-minimal.tar.gz”
centos-7-x86_64-minimal.tar.gz 100%[======================================================================>] 138.89M 2.15MB/s 用时 4m 48ss
2021-09-02 16:29:59 (494 KB/s) - 已保存 “centos-7-x86_64-minimal.tar.gz” [145639219/145639219])
$ cat centos-7-x86_64-minimal.tar.gz | docker import - centos:7
sha256:f1dbb0e36a07382f4f6b2001836374e51d297c841fb1fe4e85dfa92ba3f43139
然后查看新导人的镜像,已经在本地存在了 :
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7 f1dbb0e36a07 8 seconds ago 435MB
test 0.1 fdebc600d6f4 2 hours ago 63.1MB
ubuntu 18.04 54919e10a95d 2 days ago 63.1MB
centos latest 300e315adb2f 8 months ago 209MB
3、基于 Dockefile 创建
基于 Dockerfile 创建是最常见的方式。Dockerfile 是一个文本文件,利用给定的指令描述基于某个父镜像创建新镜像的过程。
下面给出 Dockerfile 的一个简单示例,基于 debian:stretch-slim 镜像安装 Python 3 环境,构成一个新的 python:3 镜像:
FROM debian:stretch-slim
LABEL version="1.0" maintainer="docker user <docker_user@githubs>"
RUN apt-get update && \
apt-get instal l-y python3 && \
apt-get clean && \
rm -rf /var/lib/apt/lists/*
创建镜像的过程可以使用 docker [image] build
命令,编译成功后本地将多出一个 python:3 镜像:
$ docker build -t python:3 .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM debian:stretch-slim
---> 750df3e387d7
Step 2/3 : LABEL version="1.0" maintainer="docker user <docker_user@githubs>"
---> Using cache
---> 89c03eb7f46d
Step 3/3 : RUN apt-get update && apt-get install -y python3 && apt-get clean && rm -rf /var/lib/apt/lists/*
---> Running in 81e5fe4c9c9a
Get:1 http://security.debian.org/debian-security stretch/updates InRelease [53.0 kB]
Ign:2 http://deb.debian.org/debian stretch InRelease
Get:3 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [710 kB]
......
Setting up python3 (3.5.3-1) ...
running python rtupdate hooks for python3.5...
running python post-rtupdate hooks for python3.5...
Processing triggers for libc-bin (2.24-11+deb9u4) ...
Removing intermediate container 81e5fe4c9c9a
---> cb3faf5fd7e5
Successfully built cb3faf5fd7e5
Successfully tagged python:3
# 编译完成,再次查看下镜像,多出一个 python 的镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3 cb3faf5fd7e5 15 hours ago 95.2MB
centos 7 f1dbb0e36a07 16 hours ago 435MB
test 0.1 fdebc600d6f4 18 hours ago 63.1MB
ubuntu 18.04 54919e10a95d 2 days ago 63.1MB
debian stretch-slim 750df3e387d7 2 weeks ago 55.3MB
centos latest 300e315adb2f 8 months ago 209MB
更多使用 Dockerfile 的技巧将将在后面进行介绍。
存出和载人镜像
主要介绍 Docker 镜像的 save
和 load
子命令。用户可以使用 docker save
和 docker
[image] load
命令来存出和载人镜像 。
1、存出镜像
如果要导出镜像到本地文件,可以使用 docker [image] save
命令。该命令支持 -o、-output string 参数,导出镜像到指定的文件中。
例如,导出本地的 ubuntu:18.04 镜像为文件 ubuntu_18.04.tar,如下所示:
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python 3 cb3faf5fd7e5 15 hours ago 95.2MB
centos 7 f1dbb0e36a07 16 hours ago 435MB
test 0.1 fdebc600d6f4 18 hours ago 63.1MB
ubuntu 18.04 54919e10a95d 2 days ago 63.1MB
debian stretch-slim 750df3e387d7 2 weeks ago 55.3MB
centos latest 300e315adb2f 8 months ago 209MB
$ docker save -o ubuntu_18.04.tar ubuntu:18.04
$ ls -lh
总用量 63M
-rw-r--r-- 1 kei docker 197 9月 2 16:57 Dockerfile
-rw------- 1 kei docker 63M 9月 3 08:48 ubuntu_18.04.tar
之后,用户就可以通过复制 ubuntu_18.04.tar 文件将该镜像分享给他人。
2、载入镜像
可以使用 docker [image] load
将导出的 tar 文件再导人到本地镜像库。支持 -i、-input string 选项,从指定文件中读人镜像内容。
例如,从文件 ubuntu_18.04.tar 导人镜像到本地镜像列表,如下所示:
$ docker load -i ubuntu_ 18 04.tar
Loaded image: ubuntu:18.04
或者 :
$ docker load < ubuntu_18 04.tar
Loaded image: ubuntu:18.04
这将导人镜像及其相关的元数据信息(包括标签等)。导入成功后,可以使用 docker images
命令进行查看,与原镜像一致。
上传镜像
主要介绍 Docker 镜像的 push
子命令。可以使用 docker [image] push
命令上传镜像到仓库,默认上传到 Docker Hub 官方仓库(需要登录)。
命令格式为 docker push NAME [:TAG] | [image] [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
。
用户在 Docker Hub 网站注册后可以上传自制的镜像。
例如,用户 user 上传本地的 test:latest 镜像,可以先添加新的标签 user/test:latest,然后用 docker [image] push
命令上传镜像:
$ 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 :
第一次上传时,会提示输入登录信息或进行注册,之后登录信息会记录到本地 ~/.docker
目录下。
小结
具体介绍了围绕 Docker 镜像的一系列重要命令操作,包括获取、查看、搜索、删除、创建、存出和载入、上传等。你可以使用 docker image help
命令查看 Docker 支持的镜像操作子命令。
镜像是使用 Docker 的前提,也是最基本的资源。所以,在平时的 Docker 使用中,要注意积累自己定制的镜像文件,并将自己创建的高质量镜像分享到社区中。