Docker Images介绍

Docker Images理解

镜像(Image)是一个只读的模版,而这个模版是多个只读层组成的。它们重叠在一起,除最下层外,每一层都有一个指针指向下一层。从docker的角度看这些层可以在内部实现,可以在宿主机的文件系统上访问到。在用户的角度看,只存在一个文件系统。这一切都是统一文件系统(union filesystem)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角。

获取镜像获取镜像

在docker中使用image时要先从镜像仓库下载镜像,然后才能使用。镜像仓库可以是官方提供的公共镜像库Docker Hub,也可以是自行搭建的私有仓库。 不管是公共镜像库还是私有仓库,获取镜像的命令是相同的。都是使用docker pull来获取镜像

格式为

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

举个例子,下载一个nginx镜像

[root@ice ~]# docker pull nginx
Using default tag: latest
Trying to pull repository docker.io/library/nginx ...
latest: Pulling from docker.io/library/nginx
be8881be8156: Pull complete
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
Status: Downloaded newer image for docker.io/nginx:latest

从上面的命令可以看出我们成功的下载了nginx镜像。 但下载打印的信息都是什么呢?这就需要分析一下

分析镜像打印信息

Using default tag: latest

这条信息翻译成中文的意思是docker将使用默认的标签latest。

通俗一点就是如果下载时你不指定tag,那docker将使用一个叫latest的标签。

latest翻译成中文是最新的意思。但这并不意味着我们下载的镜像是最新的。这是因为tag是仓库拥有者手工决定的。

举个例子: 我们使用nginx:1.15和nginx:1.14两个镜像做一下对比

更改nginx:1.14镜像的tag为latest

 [root@ice docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx 1.15 c82521676580 3 weeks ago 109 MB
docker.io/nginx 1.14 8ae4d16b741a 4 weeks ago 109 MB
[root@ice docker]# docker tag docker.io/nginx:1.14 docker.io/nginx:latest
[root@ice docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx 1.15 c82521676580 3 weeks ago 109 MB
docker.io/nginx 1.14 8ae4d16b741a 4 weeks ago 109 MB
docker.io/nginx latest 8ae4d16b741a 4 weeks ago 109 MB

接下来我们修改nginx:1.15的tag为default

[root@ice docker]# docker tag docker.io/nginx:1.15 docker.io/nginx:default
[root@ice docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx 1.15 c82521676580 3 weeks ago 109 MB
docker.io/nginx default c82521676580 3 weeks ago 109 MB
docker.io/nginx 1.14 8ae4d16b741a 4 weeks ago 109 MB
docker.io/nginx latest 8ae4d16b741a 4 weeks ago 109 MB

此时在我本地default标签反而是最新的。 所以不要认为带有latest标签的镜像就一定是最新的镜像,因为tag是仓库拥有者手工决定的。 建议下载时加上tag,防止出现同种镜像不同的版本。

Trying to pull repository docker.io/library/nginx ..

从这条信息可以看出docker默认从docker.io下载镜像,library为默认仓库,如果我们在docker hub上有私有仓库,可以把library替换成自己的仓库,这样就可以从你的私有仓库下载。

 be8881be8156: Pull complete 
32d9726baeef: Pull complete
87e5e6f71297: Pull complete
Digest: sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424

这几条信息是镜像的层数,可以看出我们下载的镜像是三层存储构成的。下载的时候是一层一层下载,并非单一文件。下载过程中给出每层ID的前12位。并且下载结束后,给出该镜像完整的sha256的摘要,以确保下载一致性

Status: Downloaded newer image for docker.io/nginx:latest

给出了状态信息,从docker.io下载了新的镜像

从公共仓库下载指定从公共仓库下载指定tag的镜像的镜像比如我们要下载nginx的镜像

打开Docker hub,找到nginx,选择DETAILS,选择TAGS

找到要tag的版本即可下载,比如要下载tag为1.15镜像,使用docker pull nginx:1.15

列出镜像列出镜像

使用docker image ls或docker images查看镜像

[root@ice docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx latest c82521676580 3 weeks ago 109 MB
  • REPOSITORY :来自于哪个仓库的镜像
  • TAG:镜像标签
  • IMAGE ID:镜像ID
  • CREATED:创建时间
  • SIZE:镜像大小
  • 镜像的大小镜像的大小

仔细观察一下会发现docker Hub上nginx:latest镜像大小和本地的nginx:latest镜像大小不同。 Docker HUb上显示的是45 MB,本地显示的是109 M。

这是因为Docker Hub中显示的SIZE是压缩后的SIZE,在镜像下载和上传过程中镜像保持压缩状态的,因此Docker Hub所显示的SIZE是网络传输中更关心的流量大小。而docker images 显示的是镜像下载到本地后,展开的大小,准确说是展开后的各层所占的空间的总和,因为镜像下载到本地后,查看空间的时候,更关心的是本地磁盘空间占用的大小

docker images列表中的镜像体积总和并非是所有镜像实际硬盘消耗,由于Docker镜像是多层存储结构,并且可以继承、复用,因此不同镜像可能会因为使用相同的基础镜像,从而拥有共同的层。由于Docker使用Union FS,相同的层只需要保存一份即可,因此实际镜像占用空间很可能要比这个列表镜像大小的总和要小的多。

可以通过docker system df命令来便捷的查看镜像、容器、数据卷所占用的空间

 [root@ice online]# docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 1 0 109 MB 109 MB (100%)
Containers 0 0 0 B 0 B
Local Volumes 0 0 0 B 0 B

删除镜像

我们可以用ID,镜像名、摘要来删除镜像。

使用docker image rm命令删除,其格式为

docker image rm [选项] [.....]

或者

docker rmi 镜像名

如果要强制删除镜像加上-f参数

docker rmi -f 镜像名

使用镜像名删除镜像使用镜像名删除镜像

比如我们要删除刚下载的nginx镜像

[root@ice online]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx 1.15 c82521676580 3 weeks ago 109 MB
docker.io/nginx latest c82521676580 3 weeks ago 109 MB
[root@ice online]# docker rmi docker.io/nginx
Untagged: docker.io/nginx:latest
[root@ice online]# docker images

REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx 1.15 c82521676580 3 weeks ago 109 MB

如果不加tag,docker会默认删除tag为latest标签的镜像

如果想删除tag为1.15的镜像只需添加:1.15,命令为

docker rmi docker.io/nginx:1.15

使用使用ID删除镜像删除镜像 比如我们要删除相同IMAGE ID镜像,可以直接使用IMAGE ID进行参数,但我们不必使用完整IMAGE ID,只需使用docker images列出的IMAGE ID即可,一般情况下取前3个字符以上,只要能区分于别的镜像就可以了

 [root@ice online]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/nginx 1.15 c82521676580 3 weeks ago 109 MB
docker.io/nginx latest c82521676580 3 weeks ago 109 MB
[root@ice online]# docker rmi c82521676580
Error response from daemon: conflict: unable to delete c82521676580 (must be forced) - image is referenced in multiple repositories
[root@ice online]# docker rmi -f c82521676580
Untagged: docker.io/nginx:1.15
Untagged: docker.io/nginx:latest
Untagged: docker.io/nginx@sha256:d85914d547a6c92faa39ce7058bd7529baacab7e0cd4255442b04577c4d1f424
Deleted: sha256:c82521676580c4850bb8f0d72e47390a50d60c8ffe44d623ce57be521bca9869
Deleted: sha256:2c1f65d17acf8759019a5eb86cc20fb8f8a7e84d2b541b795c1579c4f202a458
Deleted: sha256:8f222b457ca67d7e68c3a8101d6509ab89d1aad6d399bf5b3c93494bbf876407
Deleted: sha256:cdb3f9544e4c61d45da1ea44f7d92386639a052c620d1550376f22f5b46981af
[root@ice online]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE

当镜像被多个库引用的时候,要使用强制删除。当然你要确保这个镜像是不需要使用的


分享到:


相關文章: