Docker 架构

在这里插入图片描述

Docker使用C/S架构,使用远程接口来管理容器,如上图。

为了方便程序员之间进行交流,以及一些通用容器的下载,Docker官方维护了一个巨大的仓库,称为registry镜像仓库。

在镜像仓库中,存储着大量的镜像image,镜像就是将容器打包好,当作一个容器模板,使用镜像可以大批量的产生相同的容器。

比如说有一个程序员配置了一个mysql的镜像,并上传到了registry镜像仓库,当其他人从registry下载,就可以得到一个一模一样的容器,并在内部完成mysql的开发。

镜像不是一个可以进行操作的容器,它只是一个模板,可以用镜像产生容器,随后在容器内进行具体的操作。比如说对于一个相同的mysql镜像,有的程序员用它生成容器后,在容器内部使用Java操作数据库,而有的程序员生成容器后用C++操作数据库。那么最开始这两个容器是一样的,但是当配置了Java或者C++相关的库之后,两个容器就是不同的个体了。

这很像面向对象中的类与对象,镜像是一个类,而容器是对象,不同对象内的相同成员值可能不同。

docker daemonDocker最核心的后台进程,它会接收并处理用户的命令。当用户通过镜像创建容器时,docker daemon会检测本地是否有对应的镜像,如果有就直接通过镜像创建,如果没有则会去registry下载镜像。


registry 镜像仓库

registry镜像仓库负责存储和管理镜像,并且提供了登录认证,版本控制等功能。

在这里插入图片描述

对于每个镜像,完整的镜像名称为name:tag,其中tag称为标签,可以简单的理解为版本。比如上图中,nginx镜像有两个tag,分别是1.20.11.18.1,不同版本的镜像内容不同,用户使用镜像时要指明所使用的标签tag,否则默认使用最新版。

对于每个镜像仓库,其都是由一个或多个tag共同构成的,比如ubuntu:16.04ubuntu:18.04共同构成ubuntu镜像仓库。

如果要提交自己的镜像到仓库,那么还涉及到登录之类的认证操作,对于Docker官方提供的最大镜像仓库docker hub,国内访问还是比较麻烦的,对于pull这样的拉取操作,可以通过镜像加速完成,但是对于push这样把自己的镜像提交上去,就需要科学上网了。


命令

docker login

docker login用于登录远程仓库。

语法:

docker login [option] [server]
  • server:提供远程仓库的服务,默认为dockerhub

选项:

  • -u:用户名
  • -p:密码

一般不使用-p选项显式地输入密码,如果不带-p选项,会在输入完指令后,提示再次输入密码。

在这里插入图片描述

此处我使用了国内的阿里云的容器镜像服务,所以可以不需要科学上网,就可以测试docker login。最后的registry.cn-hangzhou.aliyuncs.com,就是提供镜像仓库的服务阿里云,也就是刚才的[server]参数。


docker pull

docker pull用于拉取镜像。

语法:

docker pull [options] name[:tag]
  • name[:tag]:要拉取的镜像名称,tag指定标签,如果不指定标签,则拉取name:latest即最新版

name前面,可以添加地址,这样可以到指定的服务去拉取镜像,如果不指定,则默认到dockerhub拉取镜像。比如:

docker pull registry.cn-hangzhou.aliyuncs.com/docker-hxy/test_docker

test_docker是最终的镜像名称,而前面的一长串地址,是该仓库的服务提供方。

此处我直接使用默认的dockerhub拉取一个hello-world镜像:

docker pull hello-world

如果你尝试拉取失败了,可以去了解如何配置docker镜像加速,这可以在不科学上网的情况下,从dockerhub拉取镜像。

在这里插入图片描述

这样就拉取成功了,直接拉取hello-world,可以看到其最终其实是拉取了docker.io/library/hello-world:latest,前面的一长串是官方仓库的地址,而:latest表示默认使用了最新版。


docker push

docker push用于提交本地镜像到镜像仓库。

语法:

docker push [option] name[:tag]

示例:

在这里插入图片描述

此处把刚才的hello-world提交到我的阿里云仓库上,首先通过docker taghello-world打一个标签,主要是为了给hello-world前面加上前缀registry.cn-hangzhou.aliyuncs.com/docker-hxy/,这样才能提交到目标仓库,否则默认提交到dockerhub,后面:v1是打标签,表示这个是第一版本。

在这里插入图片描述

此时我的阿里云仓库就有了hello-world镜像仓库。


docker logout

docker logout用于登出用户。

语法:

docker logout [server]

同样的,如果不指定server,默认登出dockerhub


image 镜像

先前在讲解Docker架构时,其实已经可以了解镜像的具体功能了。其实image本质上是一个只读文件,这个文件内部包含了文件系统、库、开发工具等等内容,实例化为容器时,容器就会读取这个image,初始化一个一模一样的环境。


命令

docker images

docker images用于列出本地的所有镜像,别名docker image lsdocker image list

语法:

docker images [option] [image:tag]

在这里插入图片描述

其中image id是一个哈希值,是由镜像的内容通过哈希函数生成的,如果两个镜像内容相同,那么他们的iamge id就相同。

如果在最后加上镜像名,则可以筛选指定的镜像:

在这里插入图片描述

此处筛选出了两个redis镜像,tag不同。如果在指定具体的标签,比如redis:latest,那么就只会输出一个镜像的信息。


docker tag

docker tag用于给一个镜像打标签,别名docker image tag

语法:

docker tag source_image[:tag] target_image[:tag]
  • source_image:源镜像
  • target_image:目标镜像

在这里插入图片描述

通过docker tag可以给镜像打上一个新的标签,此处就给helllo-world镜像打了一个v1的标签。可以发现,打标签后,两者的image id是相同的,因为两者的镜像内容相同,只是名字不同。

在这里插入图片描述

docker tag还可以给镜像起别名,此处就创建了一个hello镜像,它其实就是hello-world镜像的别名。常会通过这种方式,给镜像名前面加上一串仓库路径,方便提交。


docker rmi

docker rmi用于删除镜像,别名docker image rm或者docker image remove

语法:

docker rmi [option] image [image]

可以同时删除多个镜像,只需要把镜像名依次写到指令末尾即可。

选项:

  • -f:强制删除镜像,就算镜像正在被容器使用,也强制删除

如果镜像名不指定tag,默认使用latest

在这里插入图片描述

以上示例删除了两个镜像,第一个是之前打标签的hello-world:v1,删除时显示untagged,因为它检测到这个镜像和别的镜像的image id是相同的,这只是别的镜像的一个标签。所以只是解除了一个标签,没有实际删除镜像。

第二次删除,删掉了一个test_overlay镜像,这个镜像就是一个单独的镜像,默认删除latest,删除后先进行一次untag,然后delete删除镜像。


docker save

docker save用于对镜像进行打包,别名docker image save

语法:

docker save [option] image [image]

选项:

  • -o:输出到指定文件

示例:

在这里插入图片描述

把之前生成的hello镜像打包为hello.tar压缩包,压缩好后,就可以把这个文件发送给其它主机,其他主机就可以加载相同的镜像了。


docker load

docker load用于加载镜像,别名docker image load

语法:

docker load [options]

选项:

  • -i --input:指定导入的文件
  • -q --quite:输出精简信息

在这里插入图片描述

先把之前的hello镜像删掉,随后加载hello.tar文件,最后就把一个压缩文集加载成了hello镜像。


docker image inspect

docker image inspect用于查看一个镜像的详细信息。

语法:

docker image inspect [option] image [image]

在这里插入图片描述

此处以json的格式输出了镜像hello-world的相关信息,比如说之前生成了一个hello的标签,此处RepoTags这一栏,就说明hellohello-world这两个名字指向的是同一个镜像。

再比如说最底下说明了这个镜像内部的环境是linux amd64架构。


docker history

docker history用于显示镜像的分层情况,别名docker image history

语法:

docker history [option] image
  • -H:大小和日期采用人类更加易读的形式展示
  • --no-trunc:显示全部信息,不要隔断
  • -q:只显示image id

docker为了节省镜像的消耗,对镜像采用分层结构的存储,有可能不同镜像的某一层结构式相同的,那么最后这层的内容就只会存储一份。

在这里插入图片描述

以上是ubuntu镜像的分层,可以看出该镜像共分为了六层进行存储。


docker image prune

docker image prune用于删除不使用的镜像。

语法:

docker image prune [option]

参数:

  • -a:删除所有不使用的镜像
  • -f:不提示是否删除

在查询镜像时,有可能查询到<none>

在这里插入图片描述

这种镜像既没有repository也没有tag,称为虚悬镜像,使用时间长了就可能会出现这种镜像。此时可以通过docker image prune进行删除。

在这里插入图片描述

输入指令后,其会提示是否删除[y|N],如果加上-f选项就不会进行这个询问,直接删除。执行后就把所有<none>镜像都删除了。


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部