0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是Docker容器

汽车电子技术 来源:码农与软件时代 作者:码农与软件时代 2023-02-20 16:16 次阅读

1.软件开发面临的那些****问题

程序员根据需求和架构设计翻译出业务逻辑之后,为保证正常转测,打包代码并编写转测说明书。

选定合适的服务器和操作系统,并通过SSH连接服务器,进行手动升级:安装Web容器或数据库、部署软件APP以及配置环境。开发内部测试,如果发现新问题需要进行修复,则再次连接服务器,升级相应的版本和配置环境的变更点。如未发现问题,则通过后转交测试人员。

测试重复开发类似的部署动作,测试通过,版本发布;运维人员拿到版本发布包后,重复测试的部署动作。

图片

这种重复的工作就像双11杂乱的快递不断分拣的过程:

图片

如果有集装箱的话,只要开发集中装箱一次,测试、运维就可以直接用了。

图片

2.Docker是什么?

要将安装好的开发环境打成包,能够切换到测试环境、生产环境,实现“一次打包,到处运行”的目标,就需要实现:

(1)将开发环境原汁原味地打包。

(2)让应用程序认为自己拥有“整个天下”。

针对第一个实现目标:将开发环境原汁原味地打包。

回顾开发环境的安装过程:先安装操作系统、再安装JDK环境、再装Web Server、再部署应用程序。整个安装过程是在操作系统上一层一层安装起来,到最后整个环境是各层安装之后的累加结果。

《初识Docker镜像》一文中介绍了Linux操作系统、UnionFS联合文件系统,UnionFS可实现将多个文件系统的目录或者文件合并成一个“统一的文件系统”,挂载到某个目录(挂载点)下。

针对第二个实现目标:让应用程序认为自己拥有“整个天下”。

进一步解释,让应用程序认为自己拥有独立的计算、存储、网络。这里需要使用命名空间NameSpace技术。Linux命名空间是Linux内核中实现的虚拟化机制,可以将系统资源划分成多个独立的空间,每个空间中的进程逻辑上互相隔离,彼此不影响。

如何让应用程序认为拥有整个文件系统?使用chroot技术。chroot 是一种修改当前进程及其子进程的可见根目录的操作。修改后,进程将不能访问该根目录树以外的任何文件和命令,这种修改后的环境叫作chroot jail(直译为chroot监狱)。

如何保证应用程序使用有限的资源,从而不挤爆整个宿主机?使用cgroup技术。

cgroup也是Linux内核实现的,可以对进程的CPU 时间、系统内存、网络带宽等资源进行分配。

2008年,Linux Container(简称LXC),整合了cgroups和Namespace技术,并合入到Linux内核v2.6.27中。

2013年,Docker公司基于Linux Container开发,并借助于UnionFS,实现了Docker容器技术。

3.Docker是如何运转的?

有了上面可用的技术,还需要做一些约定:

(1)将运行环境所对应的文件系统打成的包,称为镜像(Image);

(2)将应用程序运行起来的进程,称为容器(Container);

(3)将存放镜像的地方,称为Repository(仓库)。

有了这些约定,就可以构建一个容器的管理程序,用来:

(1)将环境打包成镜像;

(2)上传、下载镜像到仓库;

(3)运行容器,容器也可以提交为镜像;

图片

容器的管理程序采用C/S架构,服务端称为docker daemon,后端关联仓库。客户端是命令行工具。

图片

4. Docker Daemon是如何演进****的?

上文中展示的Docker Daemon服务端,从Docker v1.11版本开始,便进行拆分重构,如图所示。

图片

包含如下组件:

(1)runc: 负责容器的创建、删除等生命周期管理。后面详细介绍。

(2)Containerd-shim: 是一个守护进程,与Containerd一一对应,并向其提供管理容器生命周期的API,也可以向Containerd 报告容器的退出状态。向下,在runc运行容器之后并退出,containerd-shim作为容器的父进程。这样可以重启Containerd,而不会对运行中的容器产生影响。

(3)Containerd:

containerd是一个守护进程,负责监听传入的请求以进行容器的生命周期管理(启动、停止或报告容器的状态),同时,也负责镜像的管理(上传、下载到仓库,本地保存镜像等功能),以及跨容器的网络管理。

(4)dockerd: 也就是docker daemon,是一个守护进程。提供docker pull、docker push、docker run等命令接口,并将接口转换为containerd API以调用containerd。同时,提供容器编排功能。

下面详细分析runC和containerd两个组件。

首先来看runC。 Docker的底层技术是Namespace和Cgroup,LXC组合了这两种技术,为运行应用程序提供了“隔离”的环境,这些都已经合入到Linux内核。

最初Docker基于LXC进行开发,因存在强绑定问题,而重新开发了libcontainer。

后来因Docker成为事实标准,且不开放,影响到生态建设(影响了Google、微软的发展)。在Linux基金会的参与下,Docker发起OCI组织,起草了OCI标准:

(1)容器运行时标准(runtime spec):定义了如何根据相应的配置构建容器运行时,也就是指定了容器的配置、执行环境和生命周期。

图片

(2)容器镜像标准(image spec):定义了容器运行时所使用的镜像打包规范,也就是指定了文件系统标准包bundle的格式。

总的来说,OCI标准指定了容器运行所需要的bundle和配置信息

Docker公司根据OCI容器运行时标准,将libcontainer进行了二次封装形成新的项目,改为RunC,作为参考实现捐给社区。需要说明的是RunC项目实现了从定义的容器标准包运行容器,而没有实现下载镜像并将解析成标准包。

再来看containerd。

2016年12月,Docker公司将其拆分为独立组件(守护进程),并于2017年3月捐赠给CNCF。

其架构如下图所示。

图片

containerd分为三个大块:Storage、Metadata和Runtimes。其中,Storage 负责镜像的存储、管理和拉取;Metadata用来管理容器及镜像的元数据,Runtimes用来对接runc。

containerd捐给社区后,形成一个庞大的生态:

图片

参考资料

1. 容器运行时规范:https://github.com/opencontainers/runtime-spec2. 容器镜像规范:https://github.com/opencontainers/image-spec3. https://containerd.io/4.https://github.com/containerd/containerd/blob/main/docs/getting-started.md5.https://mp.weixin.qq.com/s/yIuGm92sshYOZAcIpmu9Ag6.https://www.zhangjiee.com/blog/2021/container-runtime.html
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    8125

    浏览量

    82543
  • 操作系统
    +关注

    关注

    37

    文章

    6290

    浏览量

    121898
  • SSH
    SSH
    +关注

    关注

    0

    文章

    177

    浏览量

    16081
收藏 人收藏

    评论

    相关推荐

    请问docker容器如何添加自定义hosts?

    docker容器添加自定义hosts的方案有哪些?docker容器添加自定义hosts的错误示例
    发表于 11-05 06:20

    请问docker容器如何查看日志?

    docker容器如何查看日志
    发表于 11-19 07:29

    怎样在RK3399-firefly上安装Docker容器

    为什么在RK3399-firefly上安装Docker容器会出现错误呢?怎样在RK3399-firefly上安装Docker容器呢?
    发表于 03-07 13:18

    Docker容器管理命令(一)

    1、Docker容器管理命令的使用方法查看当前主机本地docker镜像:启动容器必须依赖镜像,所以要获取到镜像的唯一标识docker
    发表于 04-20 17:55

    Docker容器管理命令(二)

    1、Docker容器管理命令的使用方法批量删除docker 容器docker cp命令docker
    发表于 04-21 11:31

    学习管理 docker 容器的一些命令

    在本教程中,我们会学习管理 docker 容器的一些命令。
    的头像 发表于 01-22 11:56 4093次阅读

    集成Docker容器的OpenStack云平台性能研究

    针对OpenStack云平台虚拟机未能较好利用宿主物理机资源的问题,结合基于组件工作的OpenStack在云平台管理中的高效性和Docker容器虚拟化的快速部署优势,搭建基于Docker容器
    发表于 01-26 15:32 0次下载
    集成<b class='flag-5'>Docker</b><b class='flag-5'>容器</b>的OpenStack云平台性能研究

    学习 Docker 容器的 8 个命令分享

    利用这 8 个命令可以学习 Docker 容器的基本管理方式。这是一个为 Docker 初学者准备的,带有示范命令输出的指南。
    发表于 06-22 12:03 1247次阅读
    学习 <b class='flag-5'>Docker</b> <b class='flag-5'>容器</b>的 8 个命令分享

    Docker容器与虚拟机的区别

    我曾经将Docker容器视为轻量级,精简的虚拟机。 进行这种比较是有道理的,因为至少在Docker的最初市场中,总是将其与虚拟机进行比较-例如," Docker花费的启动时间少于VM,
    的头像 发表于 05-03 17:17 7407次阅读

    NAS下可搭建的docker容器整理

    又到了整理汇总的时间了,本期依然是针对NAS下可搭建的一些docker容器的汇总,涉及可能会有介绍过的容器!!!也欢迎留言你发现的一些有趣的或者有用的容器推荐。
    的头像 发表于 02-03 16:26 4485次阅读
    NAS下可搭建的<b class='flag-5'>docker</b><b class='flag-5'>容器</b>整理

    如何在Docker容器中运行Nginx

    在本教程中,您将学习如何将 Nginx 作为 Docker 容器运行,并将其公开给您的本地网络。此外,您将学习如何创建 Docker 数据卷以在容器和主机文件系统之间共享信息。
    的头像 发表于 02-17 09:30 1438次阅读

    从Azure Percept中的docker容器控制Arduino

    电子发烧友网站提供《从Azure Percept中的docker容器控制Arduino.zip》资料免费下载
    发表于 06-27 11:28 0次下载
    从Azure Percept中的<b class='flag-5'>docker</b><b class='flag-5'>容器</b>控制Arduino

    docker容器删除后数据还在吗

    Docker作为一个容器化平台,提供了轻量级的虚拟化解决方案,能够方便地创建、部署和管理应用程序。然而,对于Docker容器的数据持久性是一个令人关注的问题。当我们删除一个
    的头像 发表于 11-23 09:32 677次阅读

    docker容器容器之间通信

    Docker是一种轻量级容器化技术,能够将应用程序及其依赖项封装在一个独立、可移植的容器中。而容器化的应用程序通常是以分布式方式设计的,因此实现容器
    的头像 发表于 11-23 09:36 549次阅读

    docker容器有几种状态

    Docker 是一种流行的容器化平台,它能够帮助开发人员将应用程序和其依赖打包成一个独立的容器,并且能够在不同的环境中进行部署和运行。在 Docker 中,
    的头像 发表于 11-23 09:50 837次阅读