Skip to content

镜像

镜像是 Docker 三大核心概念中最重要的,自 Docker 诞生之日起镜像就是相关社区最为热门的关键词

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

获取镜像

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

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

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

1
2
3
➜  ~ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
...

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

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

1
2
3
4
5
6
➜  ~ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu
Digest: sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d
Status: Image is up to date for ubuntu:latest
docker.io/library/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

1
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”命令:

1
2
3
4
5
➜  ~ docker run -it ubuntu:18.04 bash
root@37a273e95c20:/# echo "Hello World"
Hello World
root@37a273e95c20:/# exit
exit
1
2
3
4
5
6
7
8
➜  ~ docker search ubuntu
NAME                                                      DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
ubuntu                                                    Ubuntu is a Debian-based Linux operating sys…   11157               [OK]
dorowu/ubuntu-desktop-lxde-vnc                            Docker image to provide HTML5 VNC interface …   450                                     [OK]
rastasheep/ubuntu-sshd                                    Dockerized SSH service, built on top of offi…   246                                     [OK]
consol/ubuntu-xfce-vnc                                    Ubuntu container with "headless" VNC session…   222                                     [OK]
ubuntu-upstart                                            Upstart is an event-based replacement for th…   110                 [OK]
...
1
2
3
4
5
6
7
➜  ~ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
7595c8c21622: Pulling fs layer
d13af8ca898f: Pulling fs layer
70799171ddba: Pulling fs layer
b6c12202c5ef: Waiting
error pulling image configuration: Get https://production.cloudflare.docker.com/registry-v2/docker/registry/v2/blobs/sha256/2e/2eb2d388e1a255c98029f40d6d7f8029fb13f1030abc8f11ccacbca686a8dc12/data?verify=1595942246-RYWxPExORyfYQ1CgqtROY0F09kU%3D: Service Unavailable

出现上面的情况可以尝试换镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
➜  ~ docker search ubuntu:18.04
NAME                                        DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
gotoeasy/ubuntu-desktop                     在 ubuntu:18.04 的基础上,安装中文桌面环境,…                  1
rocm/dev-ubuntu-18.04                       Docker image based on Ubuntu:18.04 with the …   1
rrvieira/ubuntu                             Custom image built from Ubuntu:18.04            1
ercircle/ubuntu_server                      java1.8,tomcat1.9,mysql 5.7 ubuntu:18.04 mys…   1                                       [OK]
matrix1986/rust                             rust build, run with ubuntu:18.04               0
nologinb/java8                              My variant of oracle java8 based on ubuntu:1…   0                                       [OK]
arnow117/ubuntu_base                        essential binaries under Ubuntu:18.04           0                                       [OK]
...

daemon.json 配置文件

https://docs.docker.com/engine/reference/commandline/dockerd/

mac 所在位置:~/.docker/daemon.json

1
2
3
4
5
6
7
{
  "debug" : true,
  "experimental" : false,
  "registry-mirrors" : [
    "https://registry.docker-cn.com"
  ]
}

mac 还可以在 preferences 中进行设置

1
2
3
4
https://docker.mirrors.ustc.edu.cn
https://registry.docker-cn.com
https://cr.console.aliyun.com/
http://hub-mirror.c.163.com

查看镜像信息

使用 images 命令列出镜像

使用 docker imagesdocker image ls 命令可以列出本地主机上已有镜像的基本信息

1
2
3
4
5
6
➜  ~ docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED             SIZE
ubuntu                                             latest               1e4467b07108        3 days ago          73.9MB
ubuntu                                             18.04                2eb2d388e1a2        3 days ago          64.2MB
clux/muslrust                                      nightly-2020-07-09   e0dabacde3db        2 weeks ago         981MB
alpine                                             3.12.0               a24bb4013296        8 weeks ago         5.57MB

在列出信息中,可以看到几个字段信息:

  • 来自于哪个仓库,比如 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等。

使用 tag 命令添加镜像标签

为了方便在后续工作中使用特定镜像,还可以使用 docker tag 命令来为本地镜像任意添加新的标签。
例如,添加一个新的 myubuntu:latest 镜像标签

1
2
3
4
5
6
➜  ~ docker tag ubuntu:latest myubuntu:latest
➜  ~ docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED             SIZE
myubuntu                                           latest               1e4467b07108        3 days ago          73.9MB
ubuntu                                             latest               1e4467b07108        3 days ago          73.9MB
ubuntu                                             18.04                2eb2d388e1a2        3 days ago          64.2MB

可以看到多了一个myubuntu:latest标签的镜像,之后,用户就可以直接使用 `myubuntu:latest 来表示这个镜像了

可以发现,myubuntu:latest镜像的 ID 跟ubuntu:latest是完全一致的,它们实际上指向了同一个镜像文件,只是别名不同而已。
docker tag命令添加的标签实际上起到了类似链接的作用

使用 inspect 命令查看详细信息

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
docker inspect ubuntu:18.04
[
    {
        "Id": "sha256:2eb2d388e1a255c98029f40d6d7f8029fb13f1030abc8f11ccacbca686a8dc12",
        "RepoTags": [
            "ubuntu:18.04"
        ],
        "RepoDigests": [
            "ubuntu@sha256:a61728f6128fb4a7a20efaa7597607ed6e69973ee9b9123e3b4fd28b7bba100b"
        ],
        "Parent": "",
        "Comment": "",
        "Created": "2020-07-24T14:38:22.027273323Z",
        ...
]

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

1
2
➜  ~ docker inspect -f {{".Architecture"}} ubuntu:18.04
amd64

使用 history 命令查看镜像历史

既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?
这时候可以使用 history 子命令,该命令将列出各层的创建信息

例如,查看 ubuntu:18.04 镜像的创建过程,可以使用如下命令:

1
2
3
4
5
6
7
➜  ~ docker history ubuntu:18.04
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
2eb2d388e1a2        3 days ago          /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B
<missing>           3 days ago          /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B
<missing>           3 days ago          /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B
<missing>           3 days ago          /bin/sh -c [ -z "$(apt-get indextargets)" ]     987kB
<missing>           3 days ago          /bin/sh -c #(nop) ADD file:7d9bbf45a5b2510d4…   63.2MB

注意,过长的命令被自动截断了,可以使用前面提到的--no-trunc选项来输出完整命令

搜寻镜像

使用 docker search 命令可以搜索 Docker Hub 官方仓库中的镜像。
语法为docker search [option] keyword。支持的命令选项主要包括:

-f, --filter filter: 过滤输出内容
--format string: 格式化输出内容
--limit int: 限制输出结果个数,默认为 25 个
--no-trunv: 不截断输出结果

例如,搜索官方提供的带 nging 关键字的镜像,如下所示:

1
2
3
➜  ~ docker search --filter=is-official=true nginx
NAME                DESCRIPTION                STARS               OFFICIAL            AUTOMATED
nginx               Official build of Nginx.   13519               [OK]

再比如,搜索所有收藏数超过 4 的关键词包括 tensorflow 的镜像

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
➜  ~ docker search --filter=stars=4 tensorflow
NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
tensorflow/tensorflow            Official Docker images for the machine learn…   1728
jupyter/tensorflow-notebook      Jupyter Notebook Scientific Python Stack w/ …   227
tensorflow/serving               Official images for TensorFlow Serving (http…   94
xblaster/tensorflow-jupyter      Dockerized Jupyter with tensorflow              54                                      [OK]
rocm/tensorflow                  Tensorflow with ROCm backend support            48
floydhub/tensorflow              tensorflow                                      24                                      [OK]
bitnami/tensorflow-serving       Bitnami Docker Image for TensorFlow Serving     14                                      [OK]
opensciencegrid/tensorflow-gpu   TensorFlow GPU set up for OSG                   12
ibmcom/tensorflow-ppc64le        Community supported ppc64le docker images fo…   5
tensorflow/tf_grpc_test_server   Testing server for GRPC-based distributed ru…   4

可以看到返回了很多包含关键字的镜像,其中包括镜像名字、描述、收藏数(表示该镜像的受欢迎程度)、是否官方创建等。
默认的输出结果将按照星级评价进行排序

删除和清理镜像

使用标签删除镜像

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

支持选项包括:

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

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

1
2
➜  ~ docker rmi myubuntu:latest
Untagged: myubuntu:latest

你可能会想到,本地的ubuntu:latest镜像是否会受到此命令的影响。
无须担心,当同一个镜像拥有多个标签的时候,docker rmi命令只是删除了该镜像多个标签中的指定标签而已,并不影响镜像文件。
因此上述操作相当于只是删除了镜像的一个标签副本而已。

保险起见,再次查看本地的镜像,发现ubuntu:latest镜像仍然存在:

1
2
3
4
➜  ~ docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED             SIZE
ubuntu                                             latest               1e4467b07108        4 days ago          73.9MB
ubuntu                                             18.04                2eb2d388e1a2        4 days ago          64.2MB

但当镜像只剩下一个标签的时候就要小心了,此时再使用 docker rmi 命令会彻底删除镜像

例如通过执行docker rmi命令来删除只有一个标签的镜像,可以看出会删除这个镜像文件的所有文件层

1
2
3
4
5
➜  ~ docker rmi busybox:latest
Untagged: busybox:latest
Untagged: busybox@sha256:4f47c01fa91355af2865ac10fef5bf6ec9c7f42ad2321377c21e844427972977
Deleted: sha256:018c9d7b792b4be80095d957533667279843acf9a46c973067c8d1dff31ea8b4
Deleted: sha256:514c3a3e64d4ebf15f482c9e8909d130bcd53bcc452f0225b0a04744de7b8c43

使用镜像 ID 来删除镜像

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

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,例如:先利用 ubuntu:18.04 镜像创建一个简单的容器来输出一段话:

1
2
➜  ~ docker run ubuntu:18.04 echo 'hello! I an here'
hello! I an here

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

1
2
3
➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
db91281ec5c5        ubuntu:18.04        "echo 'hello! I an h…"   45 seconds ago      Exited (0) 44 seconds ago                       sweet_ishizaka

可以看到,后台存在一个退出状态的容器,是刚基于 ubuntu:18.04 镜像创建的

试图删除该镜像,Docker 会提示有容器正在运行,无法删除

1
2
➜  ~ docker rmi ubuntu:18.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:18.04" (must force) - container db91281ec5c5 is using its referenced image 2eb2d388e1a2

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

1
2
3
4
➜  ~ docker rmi -f ubuntu:18.04
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:a61728f6128fb4a7a20efaa7597607ed6e69973ee9b9123e3b4fd28b7bba100b
Deleted: sha256:2eb2d388e1a255c98029f40d6d7f8029fb13f1030abc8f11ccacbca686a8dc12

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

首先删除容器 db91281ec5c5

1
2
3
4
5
➜  ~ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
db91281ec5c5        2eb2d388e1a2        "echo 'hello! I an h…"   5 minutes ago       Exited (0) 5 minutes ago                       sweet_ishizaka
➜  ~ docker rm db91281ec5c5
db91281ec5c5

然后使用 ID 来删除镜像,此时会正常打印出删除的各层信息

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
➜  ~ docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED             SIZE
ubuntu                                             latest               1e4467b07108        4 days ago          73.9MB
alpine                                             3.12.0               a24bb4013296        8 weeks ago         5.57MB
➜  ~ docker rmi ubuntu
Untagged: ubuntu:latest
Untagged: ubuntu@sha256:5d1d5407f353843ecf8b16524bc5565aa332e9e6a1297c73a92d3e754b8a636d
Deleted: sha256:1e4467b07108685c38297025797890f0492c4ec509212e2e4b4822d367fe6bc8
Deleted: sha256:7515ee845913c8df9826c988341a09e0240e291c66bdc436a067e070d7910a1f
Deleted: sha256:50ebe6a0675f1ed7ca499a2ec7d8cc993d495dd66ca1035c218ec5efcb6fbb8c
Deleted: sha256:2515e0ecfb82d58c004c4b53fcf9230d9eca8d0f5f823c20172be01eec587ccb
Deleted: sha256:ce30112909569cead47eac188789d0cf95924b166405aa4b71fb500d6e4ae08d

清理镜像

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

支持选项包括:

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

例如,如下命令会自动清理临时的遗留镜像文件层,最后会提示释放的存储空间

1
2
3
docker image prune -f
...
Total reclaimed space: 1.4GB
1
docker images | grep none | awk '{print $3}' | xargs docker rmi

创建镜像

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

基于已有容器创建

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

命令格式为docker [container] commit [options] container[respository[:tag]],主要选项包括:

-a, --author="": 作者信息
-c, --change=[]: 提交的时候执行 Dockerfile 指令,包括 CMD|ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR
-m, --message="": 提交信息
-p, --pause=true: 提交时暂停容器运行

下面将演示如何使用该命令创建一个新镜像。
首先,启动一个镜像,并在其中进行修改操作。
例如,创建一个 test 文件,之后退出,代码如下

1
2
3
4
➜  ~ docker run -it ubuntu:18.04 /bin/bash
root@32c1a033cc33:/# touch test
root@32c1a033cc33:/# exit
exit

记住容器的 ID 为32c1a033cc33

此时该容器与原 ubuntu:18.04 镜像相比,已经发生了改变,可以使用docker [container] commit命令来提交为一个新的镜像。
提交时可以使用 ID 或名称来指定容器

1
2
➜  ~ docker commit -m "Added a new file" -a "Docker Newbee" 32c1a033cc33 test:0.1
sha256:c464799e79eedb1e90c62aceae93082c07275f2472a55ac4bd907b838e672c6b

执行顺利的话,会返回新创建镜像的 ID 信息,此时查看本地镜像列表,会发现新创建的镜像已经存在了:

1
2
3
➜  ~ docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED              SIZE
test                                               0.1                  c464799e79ee        About a minute ago   64.2MB

基于本地模板导入

用户也可以直接从一个操作系统模板文件导入一个镜像,主要使用docker [container] import命令。
命令格式为docker [image] import [options] file | URL | -[repository[:tag]]

要直接导入一个镜像,可以使用 OpenVZ 提供的模板来创建,或者用其他已导出的镜像模板来创建。
OpenVZ 模板的下载地址为 https://download.openvz.org/template/precreated/

例如,下载了 ubuntu-14.04 的模板压缩包ubuntu-14.04-x86_64-minimal.tar.gz,之后使用以下命令导入即可

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
➜  Downloads cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
sha256:f2e5b3306e87be1678f079103296c2bde6aff87289fe9cc2791e1f06ee721624
➜  Downloads docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED              SIZE
ubuntu                                             14.04                f2e5b3306e87        About a minute ago   215MB
➜  Downloads docker run -ti ubuntu:14.04 /bin/bash
root@c1dbe30e9bef:/# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l

root@c1dbe30e9bef:/# exit
exit

基于 Dockerfile 创建

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

下面给出 Dockerfile 的一个简单示例,基于 ubuntu:18.04 镜像安装 Python3 环境,构成一个新的 python:3 镜像:

1
2
3
4
5
6
7
FROM ubuntu:18.04
LABEL version="1.0" maintainer="zhaoyz@nocilanto.com"

RUN apt-get update && \
    apt-get install -y python3 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
docker build -t python:3 .
➜  ~ docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED             SIZE
python                                             3                    eb2a7cf1220a        9 seconds ago       99.6MB
➜  ~ docker run -ti --rm python:3 /bin/bash
root@600c74b27fd0:/# python3
Python 3.6.9 (default, Jul 17 2020, 12:50:27)
[GCC 8.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
root@600c74b27fd0:/# python3 --version
Python 3.6.9
root@600c74b27fd0:/#

存出和载入镜像

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

存出镜像

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

例如,导出本地的ubuntu:18.04镜像为文件ubuntu_18.04.tar,如下所示:

1
docker save -o ubuntu_18.04.tar ubuntu:18.04

之后,用户就可以通过复制ubuntu_18.04.tar文件将该镜像分享给他人

载入镜像

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

例如,从文件ubuntu_18.04.tar导入镜像到本地镜像列表,如下所示:

1
docker load -i ubuntu_18.04.tar

或者

1
docker load < ubuntu_18.04.tar

这将导入镜像及其相关的元数据信息(包括标签等)。
导入成功后,可以使用 docker images 命令进行查看,与原镜像一致

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
➜  Desktop docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED             SIZE
ubuntu                                             18.04                2eb2d388e1a2        5 days ago          64.2MB
➜  Desktop docker rmi ubuntu:18.04
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:a61728f6128fb4a7a20efaa7597607ed6e69973ee9b9123e3b4fd28b7bba100b
➜  Desktop docker load -i ubuntu_18.04.tar
Loaded image: ubuntu:18.04
➜  Desktop docker images
REPOSITORY                                         TAG                  IMAGE ID            CREATED             SIZE
ubuntu                                             18.04                2eb2d388e1a2        5 days ago          64.2MB

上传镜像

可以使用docker [image] push命令上传镜像到仓库,默认上传到 Docker Hub 官方仓库(需要登录)。
命令格式为docker [image] push NAME[:TAG]|[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

用户在 Docker Hub 网站注册后可以上传自制的镜像

例如,用户 nocilantro 上传本地的test:latest镜像,首先需要登录 docker hub,例如 mac 可以点击左上角 docker 图标进行登录;
可以先添加的标签nocilantro/test:latest,然后用docker [image] push命令上传镜像

1
2
➜  Desktop docker tag test:latest nocilantro/test:latest
docker push nocilantro/test:latest

上传完后可以再上 docker hub 检查一下