docker是什么
- docker本质
- docker和虚拟机的区别
- docker架构
- [Docker Registry](#Docker Registry)
docker本质
Docker 本质其实是 LXC 之类的增强版,它本身不是容器,而是容器的易用工具。容
器是 linux 内核中的技术,Docker 只是把这种技术在使用上简易普及了。Docker 在早
期的版本其核心就是 LXC 的二次封装发行版。Docker 作为容器技术的一个实现,或者说让容器技术普及开来的最成功的实现。Docker 是基于 Go 语言实现的一个开源项目,它的主要目标是"Build,Ship andRun Any APP,Anywhere",即通过对组件的封装、分发、部署、运行等生命周期的管理,使得用户的应用及其运行环境能够做到"一次封装,到处运行"。早期 Docker 利用 LXC 做容器管理引擎,但是在创建容器时,不再使用模板去安装生成,而是通过镜像技术(把一个操作系统用户空间所需要使用到的组件事先编排好,并整体打包成一个文件,image 文件),镜像文件集中放在一个仓库中。当需要创建容器时,Docker 调用 LXC 的工具 lxc-create,但不再通过 lxc 的模板去安装,而是连接到镜像服务器上下载匹配的镜像文件,而后基于镜像启动容器。所以,Docker 极大的简化了容器的使用难度。以后我们创建启动容器,只需要一个命令,docker-run,docker-stop 就可以启动停止一个容器了。
docker和虚拟机的区别
从磁盘占用上来说,虚拟机所需要的磁盘空间会更大,而docker需要的磁盘空间会更少,因为对于虚拟机来说,它是从物理层开始往上进行模拟的,每个虚拟机都有自己的操作系统,而对于docker来说则不是,docker只是将程序和运行环境打包在了一起,多个docker之间共享宿主机的操作系统;
从cpu和内存占用上来说,虚拟操作系统非常占用cpu和内存,需要通过虚拟层调用,占用率高,而对于docker来说,docker引擎占用资源极低,直接作用于宿主机操作系统,占用率会比较少;
从启动速度上来说,虚拟机的启动速度比较慢,因为虚拟机需要启动自己的虚拟操作系统,而docker不用;
从应用部署上来说,虚拟机需要手动进行部署,速度慢,而docker可以体系化部署,可以自动化,速度较快;
从隔离性上来说,虚拟机的隔离性更高,docker隔离性较低;
从封装性上来说,虚拟机是打包整个操作系统,而docker是打包项目代码和依赖信息,docker会更加轻量化;
docker为什么比虚拟机资源利用率高,启动块?
一个虚拟机在启动的时候,徐要重新加载操作系统,而容器的启动不需要,因此docker在启动上比虚拟机更快;
容器通过docker engine创建出来,之后,容器可以自己于宿主机OS进行交互;而对于虚拟机来说,虚拟机传递出来的信息需要通过Hypervisor层才能于宿主机的操作系统进行交互,因此在cpu和内存利用率上,docker会比虚拟机更加高效;
docker架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器。
Docker 容器通过 Docker 镜像来创建。
- registry
docker 仓库,用来保存镜像文件的,可以理解为版本控制中的代码仓库(gitHub、gitee等)。docker这个仓库是由docker官方自己提供的,名字叫docker Hub;- Docker daemon
Docker daemon 是服务器组件,是docker最核心的后台进程,我们也把它称为守护进程,docker容器的创建就是由这个组件来完成的,当然,如果你的服务器山想要运行docker容器,该组件也是必不可少的;- docker client
docker 客户端可以通过命令行或者其它工具使用docker API来与docker daemon进行交互(类比于mysql);- docker Host
一个物理的或虚拟的机器,就是docker daemon进程跑起来的机器;- docker image
就是用来创建docker容器的模板,容器于镜像的关系,类比于类和对象的区别;- docker 容器
基于某个docker镜像跑起来的docker 容器;
现在我们用直白的语言来理解以上过程:你现在想要去买一个小米15的手机,于是走向了离你最近的小米之家,然后问了问店员:"你们这里有没有小米15?",无非就得到两种回答,第一种:"有的先生,你需要什么配置和颜色?";第二种:"不好意思先生,我们当前门店没有现货,如果您确实需要的话,我可以去市里面的仓库中给你调集一台过来";对于第一种情况,我们只需要详细告诉店员我们需要的配置和颜色,即可把小米15拿回家了,而对于第二种情况的话,则需要等待店员去仓库调取,我们才能拿到,在仓库中,又分为许许多多的小仓库,每个小仓库放的都是不同型号的手机,比如有些小仓库放的是小米14、有的是小米13等等,店员只需要找到小米15的小仓库,然后根据用户要求的配置和颜色,拿取对应的手机即可,在此之后,我们终于拿到了心心念念的小米15了,然后欣喜的开机,开始了与小米15没羞没臊的生活了...
在上面这个故事中,用户就类似我docker架构中的客户端,小米之家就类似于docker中的服务端,存放手机的仓库,就类似于docker Hub,未开机的手机类似于镜像,开机运行的手机,类似于容器;
Docker Registry
镜像仓库 (Docker Registry) 负责存储、管理和分发镜像,并且提供了登录认证能力,建立了仓库的索引。
镜像仓库管理多个 Repository, Repository 通过命名来区分。每个 Repository 包含一
个或多个镜像,镜像通过镜像名称和标签 (Tag)来区分。
这里的镜像仓库,就类似于上文故事中的,存放小米手机的仓库;Repository就类似于仓库中的一个个小仓库;而在小仓库都存放着型号相同的手机,但是配置不一致,Repository也是类似,存放的都是功能相同的镜像,但是每个镜像之间版本不同;
一个容器镜像包含了两个部分,一个是元数据,其实就是由 dockerfile 构建出来的描述文件,这个描述文件会说这个容器镜像有多少层,每一层里面有什么内容,它的checksum 这些信息都会记录下来,还有最终的可执行文件在哪就是在存储数据里面,就是在一个一个的 blob 里面,真正占有空间的就是这些 blob。
镜像仓库分类
按是否对外开放划分,也是研发人员常说的:
公有仓库:像阿里云、dockerhub 等放到公有网络上,不用登录就可以下载镜像,
供大家访问使用私有仓库:不对外开放,往往位于私有网络,只有公司内部人员可以使用。
按供应商和面向群体划分:sponsor(赞助) registry:第三方的 registry,供客户和 docker 社区版使用.
mirror(镜像) registry:第三方的 registry,只让客户使用,例如阿里云必须注册才能使用.
vendor(供应商) registry:由发布 docker 镜像的供应商提供的 registry,例如像Google 和 Redhat 提供了镜像仓库服务.
private registry:通过没有防火墙和额外的安全层的私有实体提供的 registry,仅供内部使用.
镜像仓库工作机制
镜像仓库使用流程:
- 创建仓库,在docker Hub、阿里云、腾讯云上创建即可;
- docker login 仓库地址: 使用该命令登录你的仓库,如果不指定仓库地址,那么默认登录的是docker Hub仓库;
- docker pull 如果你是从docker 官方仓库拉取,那么其实与前面的docker login关系不大;如果你是从自己的仓库拉取,那么前面的docker login关系就比较大,如果拉取的自己的仓库是开源的,那么docker pull可以直接拉取成功;但如果是私有的,那么你直接拉取会失败,要想成功,必须使用docker login登录;
- docker push :推送镜像,无论我们要推送的仓库是开源的还是私有的,都必须登录才可以推送;
实际研发中镜像仓库如何使用:Docker Registry 中的镜像通常由开发人员制作,而后推送至"公共"或"私有"Registry 上
保存,供其他人员使用,例如"部署"到生产环境;
docker Hub
docker Hub是什么?
Docker Hub 是 Docker 提供的托管存储库服务,用于查找容器映像并与您的团队共享。
具有以下功能:
个人可以注册私有仓库,能够发布自己的镜像
提供镜像检索能力
提供海量官方和认证组织的镜像
从 GitHub 和 Bitbucket 自动构建容器镜像并将它们推送到 Docker Hub
支持 webhook(webhook 是一种基于 HTTP 的回调函数,发生指定的事件时,服务器会自动将相关的有效负载发送到客户端的 webhook URL。 )
docker Hub功能浏览:镜像搜索
镜像tag查找:
国内镜像源:一般来说docker pull从官方仓库拉取镜像会比较慢,毕竟docker hub的服务器在国外麻,为了解决这个问题,我们一般会为docker damemon配置,国内镜像仓库,就是让我们每次docker pull的时候,docker daemon都能先去镜像仓库中看看,实在没找到再去docker Hub仓库查找,这样会加快我们镜像拉取的速率;
如何配置国内镜像源:
- 打开/etc/docker/daemon.json文件,没有就创建一个;
- 在这个文件中写入:
{
"registry-mirrors":["https://zue8awxu.mirror.aliyuncs.com"]
}- 注意如果最外层以及你给有了配置,不要直接覆盖,而是将下面的内容添加,然
后确保 json 的格式正确- 重新加载配置,并重新启动docker
systemctl daemon-reload //加载配置
systemctl restart docker //重启docker服务