快速理解什么是镜像、容器、docker、k8s

写本文是自己对所掌握技术体系的一些俯瞰总结,初心以最简的解释来理解和概括这些概念,检验自己在对应领域的理解熟练度。

目录

对镜像的理解

容器是什么?

Docker是什么?干什么用的?

k8s又是做什么的?


对镜像的理解

可以理解为系统在某个时候的一个快照,是一组rootfs,一个不含内核的Linux文件系统,相比于一个虚拟机完整的磁盘镜像来说轻便的多。

创建镜像时基于联合挂载的方式创建出一套文件系统,Ubuntu中是aufs(Advance UnionFS),centos中是overlay。联合挂载的目录下,有一个完整的操作系统目录供容器使用。

镜像分层概念(多增量rootfs联合挂载):镜像层(只读层)、容器层(读写层)、初始化层(init),每层对应包含了操作系统中一部分目录。Init 层是 Docker 项目单独生成的一个内部层,专门用来存放 /etc/hosts、/etc/resolv.conf等信息。

分层设计使得容器镜像需要的总空间缩小。

容器是什么?

首先,容器是一个进程,是一个特殊的进程。

可以把容器想象为一个沙盒,一个集装箱,能把你的应用装起来的一种技术。容器要把应用装起来那就需要边界,所谓的边界就是基于Linux Namespace(隔离)、Linux Cgroups(限制)、rootfs(文件系统)构建的隔离环境,是一种特殊的进程,其中Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术是用来修改进程视图的主要方法。同一个宿主机上的容器共享宿主机的内核。

容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。

Docker是什么?干什么用的?

docker的思想来源于集装箱,在一艘货轮上有很多集装箱,每个集装箱之间互不影响,但各自里面有各自的东西。货轮就是容器云,集装箱就是docker容器。

docker是一个创建容器的工具,他不在乎你的应用是什么类型,它可以让你的应用或服务“容器化”,用来快速、快捷的部署服务。

docker项目通过“容器镜像”,解决了应用打包这个根本性难题。

docker属于一种linux容器。在一个有docker项目的宿主机中,实际上没有真实存在的“容器”,而是一个个加了各种参数的系统进程。进程自己只是能看到各自 Mount Namespace 里挂载的目录和文件,只能访问到各自 Network Namespace 里的网络设备,就像运行在一个个“容器”里面,与世隔绝。

k8s又是做什么的?

k8s是编排和调度容器的一套系统。容器编排提升了容器的价值。

k8s项目其实可以看作一个操作系统,这个系统中的进程就是容器。它吸取了Borg项目的作业编排、调度优点。节点类型分为Master节点(控制节点)和普通node节点(工作/计算节点),master节点包括:kube-controllerManager(负责容器编排)、kube-apiserver(负责api服务)、kube-scheduler(负责调度),集群中需要持久化数据最后存于etcd中。node节点包含kubelet服务,kubelet主要与容器运行时打交道(CRI)

k8s的最小调度单元是pod,每个Pod里可以有多个容器,每个容器基于一种镜像运行,还可以定义镜像拉取策略,如已存在不拉取、总数拉取等;一个pod中所有容器共享一个IP。每创建一个pod,就会创建一个service。pod内部的所有容器共享该pod的网络空间、存储卷,体现了交换信息的高效。pod可以看作一个小型虚拟机,里面的容器是每一个进程。

用来控制pod的,可以是一些控制器,如deployment、statefulset、daemonset等等,各显神威。

k8s中每种类型的资源都可以以yaml的形式展现。其中的kind即是该资源的类型。

给pod绑定一个service服务,该service即给外界暴露一个pod的固定网络地址。访问:IP+端口以ingress的方式。

人生若只如初见,何事秋风悲画扇。

发布了155 篇原创文章 · 获赞 74 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/HYZX_9987/article/details/102516011