Docker 入门到实战 之 镜像(image)详解

在一个新的Docker环境中是没有镜像的存在的,我们需要从镜像仓库拉取需要的镜像。常见的镜像仓库服务是 Docker Hub,但是也存在其他镜像仓库服务。

Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库下载该镜像。

下面介绍Docker关于净镜像的命令操作:

1、查找远程仓库镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。

docker search [NAME]

“NAME”字段是仓库名称。简单模式下,该命令会搜索所有“NAME”字段中包含特定字符串的仓库。 

列表头说明: 

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED: 自动构建。

 上面返回的镜像中既有官方的也有非官方的,可以使用 --filter "is-official=true",使命令返回内容只显示官方镜像;使用 --filter "is-automated=true",只显示自动创建的仓库。

$ docker search [NAME] --filter "is-official=true"

$ docker search [NAME] --filter "is-automated=true"

关于 docker search  需要注意的最后一点是,默认情况下,Docker 只返回 25 行结果。但是,可以通过指定 --limit 参数来增加返回内容行数,最多为 100 行。 

1、获取镜像

从 Docker 镜像仓库获取镜像的命令是 docker pull。其命令格式为:

docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]

具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。

  • Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。

  • 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为 library,也就是官方镜像。

Linux Docker 主机本地镜像仓库通常位于 /var/lib/docker/<storage-driver>,Windows Docker 主机则是 C:\ProgramData\docker\windowsfilter。

下面以拉取 centos 镜像为例:

[root@Roker ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
6910e5a164f7: Pull complete 
Digest: sha256:4062bbdd1bb0801b0aa38e0f83dece70fb7a5e9bce223423a68de2d8b784b43b
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest

上面的命令中没有给出 Docker 镜像仓库地址,因此将会从 Docker Hub 获取镜像。而镜像名称是 centos,因为这里没有设置标签,所以便会获取官方镜像 library/centos仓库中标签为 latest 的镜像。(Using default tag: latest)

从下载过程中可以看到我们之前提及的分层存储的概念,镜像是由多层存储所构成。下载也是一层层的去下载,并非单一文件。下载过程中给出了每一层的 ID 的前 12 位。并且下载结束后,给出该镜像完整的 sha256 的摘要,以确保下载一致性。

在使用上面命令的时候,你可能会发现,你所看到的层 ID 以及 sha256 的摘要和这里的不一样。这是因为官方镜像是一直在维护的,有任何新的 bug,或者版本更新,都会进行修复再以原来的标签发布,这样可以确保任何使用这个标签的用户可以获得更安全、更稳定的镜像。

3、列出本地镜像列表

通过命令

docker image ls

docker images

[root@Roker ~]# docker image ls
REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
redis                latest              5f515359c7f8        5 days ago          183 MB
nginx                latest              05a60462f8ba        5 days ago          181 MB
mongo                3.2                 fe9198c04d62        5 days ago          342 MB
<none>               <none>              00285df0df87        5 days ago          342 MB
ubuntu               18.04               f753707788c5        4 weeks ago         127 MB
ubuntu               latest              fRoker753707788c5        4 weeks ago         127 MB

列表头说明: 

  • REPOSITORY:表示镜像的仓库源

  • TAG:镜像的标签

  • IMAGE ID:镜像ID

  • CREATED:镜像创建时间

  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本。

查看中间层镜像:

docker images -a

前面有提到,Docker 镜像由一些松耦合的只读镜像层组成,所以镜像是构建是层层构建,很多镜像依赖这些中间层。后面再学习dockerfile的时候会有更直观的感受。如果不同镜像之间有复用的中间层,这里就会看见一些没有镜像名和标签的镜像。

4、删除镜像

在我们不需要一些镜像的时候,就可以通过下面的命令将其删除:

docker rmi [OPTIONS] IMAGE [IMAGE...]

强制删除镜像

如果环境中有基于该镜像的容器运行着的时候,执行上述命令的时候会出现这样的错误

Error response from daemon: conflict: unable to delete e9d3f7300f03 (must be forced) - image is referenced in one or more repositories

那么需要先删除tag 再rm 由此tag 启动过的container,最后删除image。

或者直接强制删除:

docker rmi -f <image name>

清除所有虚悬镜像

在使用docker images查看本地镜像时(不加-a参数时),我们也可能会发现一些没有镜像名和标签的镜像:

不同于上面提到的中间层镜像,我们称这种镜像为虚悬镜像(dangling image),

这个镜像原本是有镜像名和标签的,原来为 mongo:3.2,随着官方镜像维护,发布了新版本后,重新 docker pull mongo:3.2 时,mongo:3.2 这个镜像名被转移到了新下载的镜像身上,而旧的镜像上的这个名称则被取消,从而成为了 <none>。除了 docker pull 可能导致这种情况,docker build 也同样可以导致这种现象。由于新旧镜像同名,旧镜像名称被取消,从而出现仓库名、标签均为 <none> 的镜像。这类无标签镜像也被称为 虚悬镜像(dangling image) ,可以用下面的命令专门显示这类镜像

[root@Roker ~]# docker image ls -f dangling=true
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              00285df0df87        5 days ago          342 MB

一般来说,虚悬镜像已经失去了存在的价值,是可以随意删除的,可以用下面的命令删除。

另外,在使用docker build构建镜像的时候,如果构建失败也会产生虚悬镜像。一般来说虚悬镜像已经没有实际用处,可以随意删除,一条命令就能清除所有虚悬镜像:

docker image prune

5、创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1、从已经创建的容器中更新镜像,并且提交这个镜像
  • 2、使用 Dockerfile 指令来创建一个新的镜像

6、更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器。

[root@Roker ~]# docker run -t -i ubuntu:15.10 /bin/bash
root@e218edb10161:/# 

在运行的容器内使用 apt-get update 命令进行更新。

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

此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

[root@Roker ~]# docker commit -m="has update" -a="runoob" e218edb10161 roker/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

各个参数说明:

  • -m: 提交的描述信息

  • -a: 指定镜像作者

  • e218edb10161:容器 ID

  • roker/ubuntu:v2: 指定要创建的目标镜像名

7、构建镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

[root@VM_0_12_centos ~]# cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。

第一条FROM,指定使用哪个镜像源。

RUN 指令告诉 docker 在镜像内执行命令,安装了什么。

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

[root@Roker ~]# docker build -t runoob/centos:6.7 .
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
 ---&gt; d95b5ca17cc3
Step 2 : MAINTAINER Fisher "[email protected]"
 ---&gt; Using cache
 ---&gt; 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---&gt; Using cache
 ---&gt; 0397ce2fbd0a
Step 4 : RUN useradd runoob
......

参数说明:

  • -t :指定要创建的目标镜像名

  • . :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

使用docker images 查看创建的镜像已经在列表中存在,镜像ID为860c279d2fec

[root@Roker ~]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
roker/centos        latest              860c279d2fec        About a minute ago   190.6 MB
roker/ubuntu        v2                  70bf1840fd7c        17 hours ago         158.5 MB
ubuntu              14.04               90d5884b1ee0        6 days ago           188 MB
php                 5.6                 f40e9e0f10c8        10 days ago          444.8 MB
nginx               latest              6f8d099c3adc        12 days ago          182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago          324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago          194.4 MB
ubuntu              15.10               4e3b13c8a266        5 weeks ago          136.3 MB
hello-world         latest              690ed74de00f        6 months ago         960 B
centos              6.7                 d95b5ca17cc3        6 months ago         190.6 MB
training/webapp     latest              6fae60ef3446        12 months ago        348.8 MB

我们可以使用新的镜像来创建容器

[root@Roker~]# docker run -t -i roker/centos:6.7  /bin/bash
[root@41c28d18b5fb /]# id roker
uid=500(roker) gid=500(runoob) groups=500(roker)

从上面看到新镜像已经包含我们创建的用户 roker。

8、设置镜像标签

我们可以使用 docker tag 命令,为镜像添加一个新的标签。

[root@Roker ~]# docker tag 860c279d2fec roker/centos:dev

docker tag 镜像ID,这里是 860c279d2fec ,用户名称、镜像源名(repository name)和新的标签名(tag)。

使用 docker images 命令可以看到,ID为860c279d2fec的镜像多一个标签。

[root@Roker ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
roker/centos        latest              860c279d2fec        5 hours ago         190.6 MB
roker/centos        dev                 860c279d2fec        5 hours ago         190.6 MB
roker/ubuntu        v2                  70bf1840fd7c        22 hours ago        158.5 MB
ubuntu              14.04               90d5884b1ee0        6 days ago          188 MB
php                 5.6                 f40e9e0f10c8        10 days ago         444.8 MB
nginx               latest              6f8d099c3adc        13 days ago         182.7 MB
mysql               5.6                 f2e8d6c772c0        3 weeks ago         324.6 MB
httpd               latest              02ef73cf1bc0        3 weeks ago         194.4 MB
ubuntu              15.10               4e3b13c8a266        5 weeks ago         136.3 MB
hello-world         latest              690ed74de00f        6 months ago        960 B
centos              6.7                 d95b5ca17cc3        6 months ago        190.6 MB
training/webapp     latest              6fae60ef3446        12 months ago       348.8 MB

猜你喜欢

转载自blog.csdn.net/Roker_966/article/details/107161153