Linux-docker简介

网友投稿 646 2022-11-17

Linux-docker简介

Linux-docker简介

Docker的组成:

Docker   主机(Host):一个物理机或虚拟机,用于运行Docker服务进程和容器Docker    服务端(Server):Docker守护进程,运行docker容器。Docker    客户端(Client):客户端使用docker命令或其他工具调用dockerAPIDocker    仓库(Registry):保存镜像的仓库,类似于git或svn这样的版本控制系Docker    镜像(images):镜像可以理解为创建实例使用的模板。Docker    容器(Container):容器时从镜像生成对外提供服务的一个或一组服务。

Docker对比虚拟机:

资源利用率更高:一台物理机可以运行数百个容器,但是一般只能运行数十个虚拟机

开销更小:不需要启动单独的虚拟机占用硬件资源。

启动速度更快,可以咋数秒内完成启动。

Linux Namespace技术:

namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在内核,各个docker容器运行在同一个docker主进程并且功用同一个主机系统内核(宿主),各docker容器运行在宿主即的用户空间,每个容器都要有类似于一样的相互隔离的运行空间,但是容器技术是在一个进程内是现实运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间,进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离

MNT Namespace:

每个容器都要有独立的跟文件系统有独立的用户空间,以实现在容器里面启动服务并且使用容器的运行环境,即一个宿主机是Ubuntu的服务器,可以在里面启动一个centos运行环境的容器并且在容器里面启动一个Nginx服务,此Nginx运行时使用的运行环境就是centos系统目录的运行环境,但是在容器里面是不能访问宿主机的资源,宿主机是使用了chroot技术把容器锁定到一个指定的运行目录里面。

IPC Namespace:

一个容器内的进程间通信,允许要给容器内的不同进程的(内存、缓存等)数据访问,但是不能跨容器访问其他容器的数据。

UTS Namespace:

UTS namespace (UNIX Timesharing System 包含了运行内核的名称、版本

底层体系结构类型等信息)用于系统表示,其中包含了hostname和域名domainname,它使得一个容器拥有属于自己hostname标识,这个主机名标识独立于宿主机系统和其上的其他容器。

PID Namespace

Linux系统中,有一个PID为1的进程(init/systemd)是其他所有进程的父进程,那么在每个容器内也要有一个父进程来管理其下属的紫禁城,那么多个容器的进程通 PID namespace 进程隔离(比如PID编号重复,器内使用top命令看到的PID为1的进程是nginx)

Net Namespace:

每一个容器都类似于虚拟机一样有自己的网卡,监听端口,TCP/IP协议栈等,Docker使用network namespace 启动一个vethX接口,这样你的容器将拥有它自己的桥接ip地址,通常是Docker0,而docker0实质就是Linux的虚拟网桥,网桥是在OSI七层模型的数据链路层的网络设备,通过mac地址对网络进行划分,并且在不同网络直接传递数据。

User Namespace

各个容器内可能会出现重名的用户和用户组名称,或重复的用户UID或者GID,那么怎么隔离各个容器内的用户空间呢?

User Namespace 允许在各个宿主机的各个容器空间内创建相同的用户名以及相同的用户UID和GID,只是会把用户的作用范围限制在每个容器内,即A容器和B容器可以有相同的用户名称和ID的账户,但是此用户的有效范围仅是当前容器内,不能访问另外一个容器内的文件系统,即相互隔离,相互影响,永不相见

Linux control groups

在一个容器,如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时会应为代码BUG程序会一直申请内存,直到把宿主机内存占完,为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU、内存等,Linux Cgroups的全称是Linux Control Groups,它最主要的作用,就是限制一个进程能够使用的资源上线,包括CPU、内存、磁盘、网络带宽等等。此外,还能够对进程进行优先级设置,以及将进程挂起和恢复等操作。

Cgroups在内核层默认已经开启,从centos和Ubuntu对比结果来看,显然内核较新的Ubuntu支持的功能更多。

cat /boot/config-版本号-generic

DOCKER

Docker启动一个容器也需要一个外部模板但是较多镜像,docker的镜像可以保存在一个公共的地方共享使用,只要把镜像-下来就可以使用,最主要的是可以在镜像的基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。

Docker的镜像是分层的,镜像底层为库文件且只读层即不能写入也不能删除数据,从镜像加载启动为一个容器后会生成一个科协曾,其写入的数据会复制到容器目录,但是容器内的数据再删除容器后也会被随之删除。

Dcker的优势:

快速部署:短时间内可以部署成百上千个应用,更快速交付到线上。高效虚拟化:不需要额外的hypervisor支持,直接基于Linux实现应用虚拟化,相比虚拟机大幅提高性能和效率。节省开支:提高服务器利用率,降低IT支出简化配置:将运行环境打包保存至容器,使用时直接启动即可。快速迁移和扩展:可跨平台运行在物理机,虚拟机,公有云等环境,良好的兼容性可以方便将应用从A宿主机迁移到B宿主机,甚至A平台迁移到B平台。

Dcker的缺点:

隔离性:各应用之间的隔离不如虚拟机彻底。

docker的核心技术

容器规范:

runtime spec和image spec ,有了这两个规范,不同的容器公司开发的容器只要兼容这两个规范,就可以保证容器的可移植性和相互操作性

容器runtime(runtime spec)

runtime 是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互指出,以便为容器提供相应的运行环境。runtime 主要定义了以下规范,并以json格式保存在/run.docker/runtime-runc/moby/容器ID/state.json文件,此文件会根据容器的状态实时更新内容:

版本信息:存放OCI标准的具体版本号。容器ID:通常是一个哈希值,可以在所有state.json文件中提取出容器ID对容器进行批量操作(关闭,删除等),此文件在容器关闭后会被删除,容器启动后会自动生成。PID:在容器中运行的首个京城在宿主机上的进程号,即将宿主机的那个京城设置为容器的守护进程。容器文件目录:存放容器rootfs及相应配置的目录,外部程序至需要读取state.json就可以定位到宿主机上的容器文件目录。容器创建:创建包括文件系统,namespaces,cgroups,用户权限咋内的各项内容。容器进程的启动:运行容器启动进程,该文件在/run/containerd/io.containerd.runtime.v1.linux/moby/容器ID/config.json。容器生命周期:容器进程可以被外部程序关停,runtime规范定义了对容器操作信号的捕获,并做相应资源回收的处理,必变僵尸进程的出现。

容器镜像(image format spec)

OCI容器镜像主要包含以下内容

容器管理工具

管理工具连接runtime 与用户,对用户提供图形或命令方式操作,然受管理工具将用户操作传递给runtime执行。lxc时lxd的管理工具。Runc的管理工具时docker engine,docker engine 包含后台deamon和cli两部份,大家京城提到的Docker就是指docker engine。Rkt的管理工具时rkt cli

容器定义工具

容器定义工具允许用户定义容器的属性和内容,以方便容器能够被保存,共享和重建。

Docker image:是docker容器的模板,runtime依据docker创建出docker image。Dockerfile:包含N个命令的文本文件,通过dockerfile创建出docker image。ACI(App container image):与docker image 类似,是CoreOS开发的rkt容器的镜像格式。

Registry:

统一保存镜像而且是多个不同镜像版本的地方,叫做镜像仓库。image registry:docker官方提供的私有仓库部署工具。Docker hub:docker官方的公共仓库,已经保存了大量的常用镜像,可以直接使用。Harbor:vmware提供的自带web界面自带认证功能的镜像仓库,目前有很多公司使用。

编排工具

当多个容器在多个主机运行的时候,单独管理容器时相当复杂而且很容易出错,而且无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的,也无法实现动态伸缩的功能,因此需要有一种工具就可以实现统一管理,动态伸缩,故障自愈,批量执行等功能,这就是容器编排引擎。

容器编排通常摆阔容器管理、调度、集群定义和服务发现等功能。

Docker swarm:docker 开发的容器编排引擎。Kubernetes:google领导开发的容器编排引擎,内部项目为Borg,且同时支持docker和CoreOS。Mesos+Marathon:通用的集群组员调度平台,mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能。

docker的依赖技术

容器网络:docker自带的网络docker network仅支持管理单机上的容器网络,当多主机运行的时候需要使用第三方开源网络,例如calico、flannel等。服务发现容器的动态扩容特性决定了容器IP也会随之变化,因此需要有一种机制可以自动识别并将用户请求动态转发到新创建的容器上,kubernetes 自带服务发现功能,需要结合kube-dns服务解析内部域名。容器监控:可以通过原生命令 docker ps/top/stats 查看容器运行状态,另外也可以使heapster/Prometheus等第三方监控工具监控容器的运行状态。数据管理:容器的动态迁移会导致其在不同的Host之间迁移,因此如何保证与容器相关的数据也能随之迁移或随时访问,可以使用逻辑卷/存储挂载等方式解决。日志收集docker原生的日志查看工具docker logs,但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Spingboot JPA CriteriaBuilder 如何获取指定字段
下一篇:C++静态成员和友元成员的理解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~