2.1.3、初识镜像

初识镜像

《理解Docker架构》 我们已经了解Docker镜像是容器的基础。在《容器化的应用之:Hello World》 章节里,我们使用Docker已经构建好的镜像,例如, ubuntu 镜像和 training/webapp 镜像。

我们还了解了从 Docker 商店下载镜像到本地的 Docker 主机上。如果一个镜像在宿主机上没有,它将被从一个注册中心下载下来:默认从 Docker Hub Registry

在这一节中,我们将探讨更多的关于 Docker 镜像的内容:

  • 管理和使用本地 Docker 主机镜像。
  • 创建基本镜像。
  • 上传 Docker 镜像到 Docker Hub Registry

列出主机上的的镜像

让我们先从列出主机本地的镜像开始。你可以使用 docker images 做到,像这样:

$ docker images
REPOSITORY       TAG      IMAGE ID      CREATED      VIRTUAL SIZE
training/webapp  latest   fc77f57ad303  3 weeks ago  280.5 MB
ubuntu           13.10    5e019ab7bf6d  4 weeks ago  180 MB
ubuntu           saucy    5e019ab7bf6d  4 weeks ago  180 MB
ubuntu           12.04    74fe38d11401  4 weeks ago  209.6 MB
ubuntu           precise  74fe38d11401  4 weeks ago  209.6 MB
ubuntu           12.10    a7cf8ae4e998  4 weeks ago  171.3 MB
ubuntu           quantal  a7cf8ae4e998  4 weeks ago  171.3 MB
ubuntu           14.04    99ec81b80c55  4 weeks ago  266 MB
ubuntu           latest   99ec81b80c55  4 weeks ago  266 MB
ubuntu           trusty   99ec81b80c55  4 weeks ago  266 MB
ubuntu           13.04    316b678ddf48  4 weeks ago  169.4 MB
ubuntu           raring   316b678ddf48  4 weeks ago  169.4 MB
ubuntu           10.04    3db9c44f4520  4 weeks ago  183 MB
ubuntu           lucid    3db9c44f4520  4 weeks ago  183 MB

你可以看到,我们之前在《用户手册》中使用的过的镜像。当我们使用那个镜像启动一个容器时,Docker会先从Docker Hub上把它们下载下来本地。

这里我们列出镜像的三个很重要的信息:

  • 它们来自哪个仓库,例如, ubuntu
  • 每个镜像的标签(tag),例如,14.04
  • 每个镜像都拥有唯一的ID。

注意:在以前的版本,docker images 命令支持 --tree 和--dot 参数,可以可视化的显示镜像数据。在1.7版本后(包括),这个功能已经给分离出来了。如果你喜欢这个功能,在dockviz 工具那里,你仍然可以找到它。

一个仓库可能存储着一个镜像源的多个版本。在我们的ubuntu 镜像仓库里,我们可以看到它的多个版本10.04, 12.04, 12.10, 13.04, 13.10 和14.04。每个版本的镜像通过一个标签(tag)来辨别,你可以参考类似这样一个带标签的镜像:

ubuntu:14.04

所以当我们运行一个容器,我们参考一个带标签的镜像,像这样:

$ docker run -t -i ubuntu:14.04 /bin/bash

如果你需要运行一个Ubuntu 12.04的镜像,我们可以这样:

$ docker run -t -i ubuntu:12.04 /bin/bash

如果你不指定一个镜像的版本标签,例如,你只使用  ubuntu,Docker 将默认使用 ubuntu:latest 镜像。

提示:我们建议你使用镜像是最好使用一个指定的标签,例如,ubuntu:12.04。 这样你总能知道当前你使用的是那个版本的镜像。

获取一个新镜像

现在如何获取一个新镜像?当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。但是这样会增加容器启动的时间。如果我们想预先下载这个镜像,我们可以使用  docker pull 命令来下载它。我们将下载 centos 镜像。

$ docker pull centos
Pulling repository centos
b7de3133ff98: Pulling dependent layers
5cc9e91966f7: Pulling fs layer
511136ea3c5a: Download complete
ef52fb1fe610: Download complete
. . .

Status: Downloaded newer image for centos

我们看到镜像的每一层都被下载下来,现在我们可以直接使用这个镜像来运行容器,而不需要在下载这个镜像了。

$ docker run -t -i centos /bin/bash
bash-4.1#

检索镜像

Docker 的优点之一是,人多人出于各种诉求而创建了各种各样的Docker镜像。而且些镜像大多数会被上传到了 Docker Hub 。这样,我们就可以从 Docker Hub网站搜索我们想要的镜像。

我们也可以在命令行使用 docker search 命令检索镜像。假设我们的团队需要一个安装了 Ruby 和 Sinatra 的镜像来构建我们的 web 应用程序开发环境。我们可以通过 docker search 命令搜索包含 sinatra的镜像,寻找适合我们的镜像。

$ docker search sinatra
NAME                                   DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
training/sinatra                       Sinatra training image                          0                    [OK]
marceldegraaf/sinatra                  Sinatra test app                                0
mattwarren/docker-sinatra-demo                                                         0                    [OK]
luisbebop/docker-sinatra-hello-world                                                   0                    [OK]
bmorearty/handson-sinatra              handson-ruby + Sinatra for Hands on with D...   0
subwiz/sinatra                                                                         0
bmorearty/sinatra                                                                      0
. . .

我们看到返回了大量的  sinatra镜像。而列表中有镜像名称、描述、星级(表示镜像的流行程度-如果用户喜欢这个镜像他就会增加它的星级 ),和是否是正式版以及自动的构建状态。官方仓库是Docker公司精心整理出来Docker 镜像库。自动化构建的镜像仓库是允许你验证镜像的内容和来源。

通过检索镜像,我们决定使用 training/sinatra 镜像。到目前为止,我们已经看到了两种类型的镜像仓库,像ubuntu这类镜像,称为基础镜像或根镜像。这些镜像是由 Docker 官方提供构建、验证和支持。这些镜像都可以通过用自己的名字来标记。

我们也可以检索其它用户的发布镜像,例如,我们已经选择的  training/sinatra 。个人镜像属于Docker社区成员,由他们构建和维护。你可以用用户名称来识别这些镜像,因为这些镜像的前缀都是以用户名来标记的 ,像  training,就是由它的用户创建的。

拉取我们的镜像

我们已经确定了要使用的镜像,training/sinatra现在我们使用  docker pull 命令来下载这个镜像。

$ docker pull training/sinatra

现在,团队可以使用这个镜像来运行属于他们的容器。

$ docker run -t -i training/sinatra /bin/bash
root@a8cb6ce02d85:/#

创建属于我们的镜像

团队发现  training/sinatra 镜像非常有用,但是它不能满足我们的要求,我们需要针对这个镜像做出一些更改。这里我们有两种方法,更新镜像创建镜像。

  1. 我们可以基于这个镜像的容器,将变更的内容提交到镜像里。
  2. 我们可以使用一个Dockerfile 去指定命令创建一个镜像。

更新并提交一个镜像

为了更新镜像,首先,我们需要基于这个镜像创建一个容器,像这样:

$ docker run -t -i training/sinatra /bin/bash
root@0b2616b0e5a8:/#

注意:记住刚才创建的容器ID,0b2616b0e5a8,待会我们需要用到它。

在运行的容器内使用 gem 来安装  json 。

root@0b2616b0e5a8:/# gem install json

在完成操作之后,输入  exit 命令来退出这个容器。

现在我们有一个根据我们需求做出更改的容器。之后,我们可以使用  docker commit 命令来提交容器副本到镜像。

$ docker commit -m "Added json gem" -a "Kate Smith" \
0b2616b0e5a8 ouruser/sinatra:v2
4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c

这里我们使用了  docker commit 命令。我们指定了两个标志(flags) : -m和 -a -m 标志允许我们指定一个提交信息,和你使用版本控制系统(svn)类似。 -a 标志允许我们为更新指定一个作者。

我们还要指定想要创建的新镜像容器来源 (我们先前记录的ID) 0b2616b0e5a8 和为镜像指定一个标签(targ):

ouruser/sinatra:v2

我们分解一下前边的步骤。我们先给这个镜像分配了一个新用户  ouruser,接着,我们也可以为镜像指定一个名字,这里我们保留了原有镜像名称 ouruser。最后,为镜像指定一个标签(tag): v2

我们可以使用  docker images 命令来查看我们的新建的镜像 ouruser/sinatra 

$ docker images
REPOSITORY          TAG     IMAGE ID       CREATED       VIRTUAL SIZE
training/sinatra    latest  5bc342fa0b91   10 hours ago  446.7 MB
ouruser/sinatra     v2      3c59e02ddd1a   10 hours ago  446.7 MB
ouruser/sinatra     latest  5db5f8471261   10 hours ago  446.7 MB

为了使用我们的新镜像去创建一个容器,我们可以这样:

$ docker run -t -i ouruser/sinatra:v2 /bin/bash
root@78e82f680994:/#

使用 Dockerfile 构建一个镜像

使用  docker commit  命令能够非常简单的扩展镜像。但是它有点麻烦,并且在一个团队中很难共享它。为解决这个问题,我们使用一个新的命令  docker build从零开始来创建一个新的镜像。

为此,我们需要创建一个  Dockerfile 文件,包含一组指令来告诉 Docker 如何构建我们的镜像。

首先,我们要创建一个目录,在里面Dockerfile 文件。

$ mkdir sinatra
$ cd sinatra
$ touch Dockerfile

如果你是在 Windows 上使用的 Docker Machine,你可以通过使用 cd 命令来访问你的本地主机目录 /c/Users/your_user_name

每一条指令都会创建一个新的镜像层。我们来看一个简单的例子,演示如何为我们的开发团队构建一个属于我们的的 Sinatra 镜像:

# This is a comment
FROM ubuntu:14.04
MAINTAINER Kate Smith <ksmith@example.com>
RUN apt-get update && apt-get install -y ruby ruby-dev
RUN gem install sinatra

让我们看一下我们的  Dockerfile 做了什么。每一条指令的前缀都必须是大写的声明。

INSTRUCTION statement

注意:我们使用# 来注释。

第一条指令  FROM 是告诉 Docker 使用的哪个镜像做源,在这个案例中,我们使用的是 Ubuntu 14.04 镜像。

然后,我们使用 MAINTAINER 指令去指定谁在维护我们的新镜像。

最后,我们指定了两个 RUN 指令。 RUN 指令在镜像内执行一条命令,例如:安装一个包。这里我们更新了 APT 的缓存,并且安装 Ruby 和 RubyGems ,然后使用 gem 安装 Sinatra 。

注意:这里还有很多Dockerfile可用指令There are a lot more instructions available to us in a Dockerfile.

现在,我们使用 Dockerfile 文件,通过 docker build  命令来构建一个镜像。

$ docker build -t ouruser/sinatra:v2 .
Sending build context to Docker daemon 2.048 kB
Sending build context to Docker daemon 
Step 0 : FROM ubuntu:14.04
 ---> e54ca5efa2e9
Step 1 : MAINTAINER Kate Smith <ksmith@example.com>
 ---> Using cache
 ---> 851baf55332b
Step 2 : RUN apt-get update && apt-get install -y ruby ruby-dev
 ---> Running in 3a2558904e9b
Selecting previously unselected package libasan0:amd64.
(Reading database ... 11518 files and directories currently installed.)
Preparing to unpack .../libasan0_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libasan0:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libatomic1:amd64.
Preparing to unpack .../libatomic1_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libatomic1:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libgmp10:amd64.
Preparing to unpack .../libgmp10_2%3a5.1.3+dfsg-1ubuntu1_amd64.deb ...
Unpacking libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ...
Selecting previously unselected package libisl10:amd64.
Preparing to unpack .../libisl10_0.12.2-1_amd64.deb ...
Unpacking libisl10:amd64 (0.12.2-1) ...
Selecting previously unselected package libcloog-isl4:amd64.
Preparing to unpack .../libcloog-isl4_0.18.2-1_amd64.deb ...
Unpacking libcloog-isl4:amd64 (0.18.2-1) ...
Selecting previously unselected package libgomp1:amd64.
Preparing to unpack .../libgomp1_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libgomp1:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libitm1:amd64.
Preparing to unpack .../libitm1_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libitm1:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libmpfr4:amd64.
Preparing to unpack .../libmpfr4_3.1.2-1_amd64.deb ...
Unpacking libmpfr4:amd64 (3.1.2-1) ...
Selecting previously unselected package libquadmath0:amd64.
Preparing to unpack .../libquadmath0_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libquadmath0:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libtsan0:amd64.
Preparing to unpack .../libtsan0_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libtsan0:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package libyaml-0-2:amd64.
Preparing to unpack .../libyaml-0-2_0.1.4-3ubuntu3_amd64.deb ...
Unpacking libyaml-0-2:amd64 (0.1.4-3ubuntu3) ...
Selecting previously unselected package libmpc3:amd64.
Preparing to unpack .../libmpc3_1.0.1-1ubuntu1_amd64.deb ...
Unpacking libmpc3:amd64 (1.0.1-1ubuntu1) ...
Selecting previously unselected package openssl.
Preparing to unpack .../openssl_1.0.1f-1ubuntu2.4_amd64.deb ...
Unpacking openssl (1.0.1f-1ubuntu2.4) ...
Selecting previously unselected package ca-certificates.
Preparing to unpack .../ca-certificates_20130906ubuntu2_all.deb ...
Unpacking ca-certificates (20130906ubuntu2) ...
Selecting previously unselected package manpages.
Preparing to unpack .../manpages_3.54-1ubuntu1_all.deb ...
Unpacking manpages (3.54-1ubuntu1) ...
Selecting previously unselected package binutils.
Preparing to unpack .../binutils_2.24-5ubuntu3_amd64.deb ...
Unpacking binutils (2.24-5ubuntu3) ...
Selecting previously unselected package cpp-4.8.
Preparing to unpack .../cpp-4.8_4.8.2-19ubuntu1_amd64.deb ...
Unpacking cpp-4.8 (4.8.2-19ubuntu1) ...
Selecting previously unselected package cpp.
Preparing to unpack .../cpp_4%3a4.8.2-1ubuntu6_amd64.deb ...
Unpacking cpp (4:4.8.2-1ubuntu6) ...
Selecting previously unselected package libgcc-4.8-dev:amd64.
Preparing to unpack .../libgcc-4.8-dev_4.8.2-19ubuntu1_amd64.deb ...
Unpacking libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ...
Selecting previously unselected package gcc-4.8.
Preparing to unpack .../gcc-4.8_4.8.2-19ubuntu1_amd64.deb ...
Unpacking gcc-4.8 (4.8.2-19ubuntu1) ...
Selecting previously unselected package gcc.
Preparing to unpack .../gcc_4%3a4.8.2-1ubuntu6_amd64.deb ...
Unpacking gcc (4:4.8.2-1ubuntu6) ...
Selecting previously unselected package libc-dev-bin.
Preparing to unpack .../libc-dev-bin_2.19-0ubuntu6_amd64.deb ...
Unpacking libc-dev-bin (2.19-0ubuntu6) ...
Selecting previously unselected package linux-libc-dev:amd64.
Preparing to unpack .../linux-libc-dev_3.13.0-30.55_amd64.deb ...
Unpacking linux-libc-dev:amd64 (3.13.0-30.55) ...
Selecting previously unselected package libc6-dev:amd64.
Preparing to unpack .../libc6-dev_2.19-0ubuntu6_amd64.deb ...
Unpacking libc6-dev:amd64 (2.19-0ubuntu6) ...
Selecting previously unselected package ruby.
Preparing to unpack .../ruby_1%3a1.9.3.4_all.deb ...
Unpacking ruby (1:1.9.3.4) ...
Selecting previously unselected package ruby1.9.1.
Preparing to unpack .../ruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ...
Unpacking ruby1.9.1 (1.9.3.484-2ubuntu1) ...
Selecting previously unselected package libruby1.9.1.
Preparing to unpack .../libruby1.9.1_1.9.3.484-2ubuntu1_amd64.deb ...
Unpacking libruby1.9.1 (1.9.3.484-2ubuntu1) ...
Selecting previously unselected package manpages-dev.
Preparing to unpack .../manpages-dev_3.54-1ubuntu1_all.deb ...
Unpacking manpages-dev (3.54-1ubuntu1) ...
Selecting previously unselected package ruby1.9.1-dev.
Preparing to unpack .../ruby1.9.1-dev_1.9.3.484-2ubuntu1_amd64.deb ...
Unpacking ruby1.9.1-dev (1.9.3.484-2ubuntu1) ...
Selecting previously unselected package ruby-dev.
Preparing to unpack .../ruby-dev_1%3a1.9.3.4_all.deb ...
Unpacking ruby-dev (1:1.9.3.4) ...
Setting up libasan0:amd64 (4.8.2-19ubuntu1) ...
Setting up libatomic1:amd64 (4.8.2-19ubuntu1) ...
Setting up libgmp10:amd64 (2:5.1.3+dfsg-1ubuntu1) ...
Setting up libisl10:amd64 (0.12.2-1) ...
Setting up libcloog-isl4:amd64 (0.18.2-1) ...
Setting up libgomp1:amd64 (4.8.2-19ubuntu1) ...
Setting up libitm1:amd64 (4.8.2-19ubuntu1) ...
Setting up libmpfr4:amd64 (3.1.2-1) ...
Setting up libquadmath0:amd64 (4.8.2-19ubuntu1) ...
Setting up libtsan0:amd64 (4.8.2-19ubuntu1) ...
Setting up libyaml-0-2:amd64 (0.1.4-3ubuntu3) ...
Setting up libmpc3:amd64 (1.0.1-1ubuntu1) ...
Setting up openssl (1.0.1f-1ubuntu2.4) ...
Setting up ca-certificates (20130906ubuntu2) ...
debconf: unable to initialize frontend: Dialog
debconf: (TERM is not set, so the dialog frontend is not usable.)
debconf: falling back to frontend: Readline
debconf: unable to initialize frontend: Readline
debconf: (This frontend requires a controlling tty.)
debconf: falling back to frontend: Teletype
Setting up manpages (3.54-1ubuntu1) ...
Setting up binutils (2.24-5ubuntu3) ...
Setting up cpp-4.8 (4.8.2-19ubuntu1) ...
Setting up cpp (4:4.8.2-1ubuntu6) ...
Setting up libgcc-4.8-dev:amd64 (4.8.2-19ubuntu1) ...
Setting up gcc-4.8 (4.8.2-19ubuntu1) ...
Setting up gcc (4:4.8.2-1ubuntu6) ...
Setting up libc-dev-bin (2.19-0ubuntu6) ...
Setting up linux-libc-dev:amd64 (3.13.0-30.55) ...
Setting up libc6-dev:amd64 (2.19-0ubuntu6) ...
Setting up manpages-dev (3.54-1ubuntu1) ...
Setting up libruby1.9.1 (1.9.3.484-2ubuntu1) ...
Setting up ruby1.9.1-dev (1.9.3.484-2ubuntu1) ...
Setting up ruby-dev (1:1.9.3.4) ...
Setting up ruby (1:1.9.3.4) ...
Setting up ruby1.9.1 (1.9.3.484-2ubuntu1) ...
Processing triggers for libc-bin (2.19-0ubuntu6) ...
Processing triggers for ca-certificates (20130906ubuntu2) ...
Updating certificates in /etc/ssl/certs... 164 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....done.
 ---> c55c31703134
Removing intermediate container 3a2558904e9b
Step 3 : RUN gem install sinatra
 ---> Running in 6b81cb6313e5
unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping
unable to convert "\xC3" to UTF-8 in conversion from ASCII-8BIT to UTF-8 to US-ASCII for README.rdoc, skipping
Successfully installed rack-1.5.2
Successfully installed tilt-1.4.1
Successfully installed rack-protection-1.5.3
Successfully installed sinatra-1.4.5
4 gems installed
Installing ri documentation for rack-1.5.2...
Installing ri documentation for tilt-1.4.1...
Installing ri documentation for rack-protection-1.5.3...
Installing ri documentation for sinatra-1.4.5...
Installing RDoc documentation for rack-1.5.2...
Installing RDoc documentation for tilt-1.4.1...
Installing RDoc documentation for rack-protection-1.5.3...
Installing RDoc documentation for sinatra-1.4.5...
 ---> 97feabe5d2ed
Removing intermediate container 6b81cb6313e5
Successfully built 97feabe5d2ed

我们指定docker build 命令并使用  -t  (flag)来标志去标示新镜像属于  ouruser,仓库名称为  ouruser,标签是  v2

我们也可以使用. 来指定Dockerfile 文件在当前文件夹的位置。

注意:你也可以指定Dockerfile的路径。

现在,我们可以看到构建过程。Docker 做的第一件事是上传构建的上下文:主要是构建所需的文件内容。这样做是因为 Docker 进程构建镜像是实时构建的,并且是需要本地的上下文来做这些工作的。

然后,我们可以看到在 Dockerfile中的每一条命令都一步一步的被执行。我们会看到每一步都会创建一个新的容器,在容器内部运行指令并且提交更改 - 就像我们之前使用的  docker commit  工作流程一样。当所有的指令执行完成之后,我们会得到97feabe5d2ed 镜像(也帮助地标记为 ouruser/sinatra:v2), 然后所有中间容器会被清除。

注意:一个镜像不能超过127层,不管在什么存储驱动下。 这是一个全局的设置,为了从整体优化镜像的大小。

我们可以基于我们的新镜像创建一个容器。

$ docker run -t -i ouruser/sinatra:v2 /bin/bash
root@8196968dac35:/#

注意:这里只是简单的介绍如何创建镜像。我们跳过了很多可以使用的指令。为了帮助你编写清晰、易读、易维护的Dockerfile你可以移步《Dockerfile最佳实战》章节了解Dockerfile

更多

想要了解更多,请查看Dockerfile教程

设置镜像的标签

You can also add a tag to an existing image after you commit or build it. We can do this using the docker tag command. Let’s add a new tag to ourouruser/sinatra image.

你可以在提交或构建之后,为镜像来添加标签(tag)。我们可以使用docker tag 命令实现。让我们添加一个新的标签到我们的ouruser/sinatra  镜像中。

$ docker tag 5db5f8471261 ouruser/sinatra:devel

docker tag 命令需要使用镜像ID,这里是  5db5f8471261,用户名称、仓库名字和新的标签名(tag)。

让我们使用 docker images 命令来查看我们的新标签。

$ docker images ouruser/sinatra
REPOSITORY          TAG     IMAGE ID      CREATED        VIRTUAL SIZE
ouruser/sinatra     latest  5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     devel   5db5f8471261  11 hours ago   446.7 MB
ouruser/sinatra     v2      5db5f8471261  11 hours ago   446.7 MB

镜像摘要

v2 或后续版本格式的镜像会有内容寻址标识符,叫做 digest。只要用于生成镜像的输入不更改,这个摘要(digests)都是可以预测的。使用 --digests  标志来列出镜像 摘要:

$ docker images --digests | head
REPOSITORY                         TAG                 DIGEST                                                                     IMAGE ID            CREATED             VIRTUAL SIZE
ouruser/sinatra                    latest              sha256:cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf    5db5f8471261        11 hours ago        446.7 MB

When pushing or pulling to a 2.0 registry, the push or pull command output includes the image digest. You can pull using a digest value.

当在一个registry 2.0 上,推送或者拉取镜像的时候,push 和 pull 命令输出包含了镜像 摘要。 你可以使用一个摘要值来pull 镜像。

$ docker pull ouruser/sinatra@cbbf2f9a99b47fc460d422812b6a5adff7dfee951d8fa2e4a98caa0382cfbdbf

你也可以参考通过摘要进行 create run和 rmi 的命令,以及在 Dockerfile文件中使用FROM 来引用镜像

推送一个镜像到Docker Hub

一旦你构建或创建了一个新的镜像,你可以使用 docker push 命令将镜像推送到Docker Hub。这样,你就可以分享你的镜像,相反,你可以把镜像推送到一个私有仓库

$ docker push ouruser/sinatra
The push refers to a repository [ouruser/sinatra] (len: 1)
Sending image list
Pushing repository ouruser/sinatra (3 tags)
. . .

删除主机上的指定镜像

你也可以删除你主机上的镜像,类似于删处容器的方法,这里我们使用 docker rmi 命令。

让我们删除 training/sinatra这个没用的镜像。

$ docker rmi training/sinatra
Untagged: training/sinatra:latest
Deleted: 5bc342fa0b91cabf65246837015197eecfa24b2213ed6a51a8974ae250fedd8d
Deleted: ed0fffdcdae5eb2c3a55549857a8be7fc8bc4241fb19ad714364cbfd7a56b22f
Deleted: 5c58979d73ae448df5af1d8142436d81116187a7633082650549c52c3a2418f0

注意:删除主机上的镜前,请确保已经没有任何容器与之关联。

下一步

现在,我们已经知道如何在容器中构建单独的应用程序。现在,我们要学习如何把多个 Docker 容器连接在一起构建一个完整的应用程序。

考核你的Dockerfile知识,使用Dockerfile教程

请移步容器互联


 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值