Docker:镜像
Docker 架构
Docker
使用C/S
架构,使用远程接口来管理容器,如上图。
为了方便程序员之间进行交流,以及一些通用容器的下载,Docker
官方维护了一个巨大的仓库,称为registry
镜像仓库。
在镜像仓库中,存储着大量的镜像image
,镜像就是将容器打包好,当作一个容器模板,使用镜像可以大批量的产生相同的容器。
比如说有一个程序员配置了一个mysql
的镜像,并上传到了registry
镜像仓库,当其他人从registry
下载,就可以得到一个一模一样的容器,并在内部完成mysql
的开发。
镜像不是一个可以进行操作的容器,它只是一个模板,可以用镜像产生容器,随后在容器内进行具体的操作。比如说对于一个相同的mysql
镜像,有的程序员用它生成容器后,在容器内部使用Java
操作数据库,而有的程序员生成容器后用C++
操作数据库。那么最开始这两个容器是一样的,但是当配置了Java
或者C++
相关的库之后,两个容器就是不同的个体了。
这很像面向对象中的类与对象,镜像是一个类,而容器是对象,不同对象内的相同成员值可能不同。
docker daemon
是Docker
最核心的后台进程,它会接收并处理用户的命令。当用户通过镜像创建容器时,docker daemon
会检测本地是否有对应的镜像,如果有就直接通过镜像创建,如果没有则会去registry
下载镜像。
registry 镜像仓库
registry
镜像仓库负责存储和管理镜像,并且提供了登录认证,版本控制等功能。
对于每个镜像,完整的镜像名称为name:tag
,其中tag
称为标签,可以简单的理解为版本。比如上图中,nginx
镜像有两个tag
,分别是1.20.1
和1.18.1
,不同版本的镜像内容不同,用户使用镜像时要指明所使用的标签tag
,否则默认使用最新版。
对于每个镜像仓库,其都是由一个或多个tag
共同构成的,比如ubuntu:16.04
和ubuntu: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 tag
给hello-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 ls
或docker 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
这一栏,就说明hello
和hello-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>
镜像都删除了。
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » Docker:镜像
发表评论 取消回复