云原生容器技术入门:Docker、K8s技术的基本原理和用途

🐇明明跟你说过:个人主页

🏅个人专栏:《未来已来:云原生之旅》🏅

🔖行路有良友,便是天堂🔖

目录

一、容器技术概述

1、什么是容器技术

2、容器技术的历史与发展

3、容器技术与虚拟机的比较

4、容器技术在云原生中的作用

二、Docker基础

1、Docker简介

2、Docker架构

3、Docker与工作原理

三、Kubernetes(k8s)基础

1、Kubernetes简介

2、Kubernetes核心概念


一、容器技术概述

1、什么是容器技术

容器是一种轻量级的虚拟化技术,它打包了应用程序及其所有的依赖(库、配置文件等),确保应用程序可以在任何环境中一致地运行。容器本身是一个隔离的、独立的单元,里面包含了运行应用程序所需的一切。

想象一下你要带一份便当去办公室吃午餐。你需要确保便当里的食物不会在运输过程中洒出来,也不会因为环境的变化(比如办公室的冰箱或微波炉)而影响食物的味道和质量。为了做到这一点,你把食物放在一个便当盒里。

  • 应用程序:食物
  • 容器:便当盒
  • 环境:办公室、家里、朋友的家等

不管你在什么地方,只要有便当盒,你的食物都可以安全无损地食用。同样,容器技术就像这个便当盒,不管你把应用程序放在哪里(开发者的电脑、测试服务器、生产环境的云端),它都能正常运行。

2、容器技术的历史与发展

容器技术的历史与发展可以追溯到几十年前,经历了多个阶段的演变,最终发展成为我们今天广泛使用的现代容器技术。

1. 早期的隔离技术
Chroot (1979)

  • 介绍:Chroot 是 Unix 操作系统中的一个系统调用,最早在 1979 年的第七版 Unix 中引入。
  • 功能:它通过改变进程的根目录来提供文件系统级别的隔离,但不提供进程和网络等其他方面的隔离。


2. 进程隔离技术
FreeBSD Jail (2000)

  • 介绍:FreeBSD Jail 是 FreeBSD 操作系统中的一个功能,最早在 2000 年推出。
  • 功能:提供了文件系统、网络、用户和进程的隔离。Jail 可以看作是 chroot 的增强版本,支持更多的隔离特性。

Solaris Zones (2004)

  • 介绍:Solaris Zones 是 Solaris 操作系统中的一个功能,于 2004 年推出。
  • 功能:提供了完整的操作系统级别的隔离,可以在一个物理主机上运行多个隔离的 Solaris 实例。


3. Linux 容器技术的崛起
LXC (Linux Containers) (2008)

  • 介绍:LXC 是 Linux 上的容器技术,于 2008 年发布。
  • 功能:结合了 Linux 内核中的多个隔离功能(如 namespaces 和 cgroups),实现进程和资源的隔离。


4. Docker 的诞生与流行
Docker (2013)

  • 介绍:Docker 于 2013 年发布,由 Solomon Hykes 创立。
  • 功能:Docker 提供了一套完整的容器化解决方案,包括容器构建、分发和运行的工具。Docker 通过简单易用的接口和强大的社区支持,使容器技术迅速普及。
  • 影响:Docker 的出现将容器技术从操作系统层面带到了应用层面,简化了应用程序的部署、迁移和扩展。


5. 容器编排与管理
Kubernetes (2014)

  • 介绍:Kubernetes 是 Google 开源的容器编排平台,于 2014 年发布。
  • 功能:提供自动化的容器部署、扩展和管理功能,解决了大规模容器管理的复杂性问题。
  • 影响:Kubernetes 成为容器编排的事实标准,推动了容器技术在企业中的广泛应用。

3、容器技术与虚拟机的比较

1. 架构与实现方式

  • 虚拟机(VM)
    •  架构:每个虚拟机都包含一个完整的操作系统实例、虚拟化的硬件(如 CPU、内存、网络设备等)以及应用程序。
    •  虚拟化层:虚拟机依赖于 Hypervisor(如 VMware ESXi、Microsoft Hyper-V、KVM),Hypervisor 是一个虚拟化层,位于物理硬件和虚拟机之间,管理和分配硬件资源。
    •  操作系统:每个虚拟机运行自己的操作系统(称为 Guest OS),与主机操作系统(Host OS)完全独立。
  • 容器
    •  架构:容器共享主机操作系统的内核,但在用户空间中运行隔离的进程。每个容器包含应用程序及其依赖项,但没有完整的操作系统。
    •  虚拟化层:容器依赖于操作系统级虚拟化技术,如 Linux 的 cgroups 和 namespaces,实现资源和进程的隔离。
    •  操作系统:所有容器共享主机操作系统的内核,没有自己的独立操作系统实例。


2. 启动时间与资源利用率

  • 启动时间
    •  虚拟机:由于需要启动完整的操作系统实例,虚拟机的启动时间通常较长(几分钟到几十秒)。
    •  容器:容器只需启动应用进程,启动时间非常快(通常在几秒钟内,甚至是亚秒级)。
  • 资源利用率
    •  虚拟机:由于每个虚拟机需要独立的操作系统实例和虚拟化开销,资源利用率相对较低。
    •  容器:容器共享操作系统内核,减少了冗余和开销,资源利用率更高。


3. 性能

  • 虚拟机:虚拟化层的开销(尤其是 I/O 操作)会影响性能,虽然现代 Hypervisor 已经大大优化了性能,但仍存在一定的性能损耗。
  • 容器:由于容器直接运行在主机操作系统上,没有 Hypervisor 的开销,性能接近于直接在物理机上运行的应用程序。


4. 隔离与安全

  • 隔离
    •  虚拟机:提供强隔离,每个虚拟机运行在自己的操作系统中,隔离程度高。虚拟机之间的安全隔离是通过 Hypervisor 实现的。
    •  容器:通过操作系统内核实现进程和资源的隔离,虽然隔离性较强,但理论上不如虚拟机。现代容器技术(如 Docker)也提供了额外的安全机制(如 seccomp、AppArmor、SELinux)来增强隔离性。
  • 安全
    •  虚拟机:由于强隔离,安全性较高,每个虚拟机的漏洞不会直接影响其他虚拟机或主机操作系统。
    •  容器:由于共享内核,内核级漏洞可能影响所有容器和主机操作系统,需要额外的安全措施来保护容器环境。


5. 可移植性与灵活性

  •  虚拟机:虚拟机镜像较大,迁移和部署较为复杂。虚拟机可以在支持相同虚拟化技术的不同物理服务器之间迁移。
  • 容器:容器镜像小且轻量级,易于迁移和部署。容器化应用可以在任何支持容器运行时(如 Docker、containerd、CRI-O)的环境中运行,实现高度的可移植性。 

4、容器技术在云原生中的作用

1. 快速部署和扩展

  • 快速启动:容器化应用的启动时间非常短,通常在秒级甚至亚秒级。这使得应用的部署和扩展变得更加迅速。
  • 弹性伸缩:通过容器编排工具(如 Kubernetes),可以实现应用的自动扩展和缩减,快速响应负载变化。


2. 一致的运行环境

  • 环境一致性:容器镜像包含了应用及其运行所需的所有依赖项,从开发、测试到生产环境,始终保持一致。这解决了“在我电脑上能运行”的问题,减少了环境差异导致的错误。


3. DevOps 和 CI/CD

  • 持续集成/持续交付(CI/CD):容器技术与CI/CD工具链(如 Jenkins、GitLab CI/CD)集成,实现了代码的自动化构建、测试和部署,加速了软件的交付周期。
  • DevOps 实践:容器技术推动了开发和运维的融合,通过基础设施即代码(IaC)和自动化运维工具,实现了高效的持续交付和持续部署。

二、Docker基础

1、Docker简介

Docker 是一个用于开发、部署和运行应用程序的工具。它允许开发者将应用程序及其所有依赖项打包到一个可移植的容器中,并且该容器可以在任何支持 Docker 的环境中运行。Docker 提供了一种轻量级的虚拟化技术,不同于传统的虚拟机,容器共享主机的操作系统内核,但保持独立的运行环境。

Docker 的主要组成部分

  • Docker 引擎(Docker Engine):这是 Docker 的核心组件,它包括:
    •  Docker 守护进程(Docker Daemon):负责管理容器的生命周期,包括创建、运行和停止容器。
    •  Docker 客户端(Docker Client):用户与 Docker 交互的命令行工具,通过命令行向 Docker 守护进程发送请求。
    •  REST API:用于程序化地与 Docker 守护进程通信。
  • Docker 镜像(Docker Image):Docker 镜像是一个包含应用程序及其所有依赖项的只读模板。镜像可以用来创建 Docker 容器。镜像通常是从 Dockerfile 构建的,Dockerfile 是一个包含构建镜像步骤的脚本。
  • Docker 容器(Docker Container):容器是镜像的运行实例,包含了应用程序及其所有依赖项,并在一个隔离的环境中运行。容器是轻量级的,启动速度快,可以在几秒钟内启动和停止。
  • Docker 仓库(Docker Registry):Docker 镜像的存储库,Docker Hub 是最常用的公共仓库,用户可以从中下载和上传镜像。也可以使用私有的 Docker 仓库来存储镜像。

2、Docker架构

Docker 架构

  1. Docker 客户端 (Docker Client)
  2. Docker 守护进程 (Docker Daemon)
  3. Docker 镜像 (Docker Images)
  4. Docker 容器 (Docker Containers)
  5. Docker 仓库 (Docker Registry)
  6. Docker Compose

1. Docker 客户端 (Docker Client)
Docker 客户端是用户与 Docker 进行交互的主要工具。它接收用户的命令,并通过 REST API 将命令发送给 Docker 守护进程。常用的 Docker 客户端命令包括 docker build、docker pull、docker run 等。

2. Docker 守护进程 (Docker Daemon)
Docker 守护进程在后台运行,负责处理 Docker 客户端的请求,管理 Docker 容器、镜像和网络。Docker 守护进程监听 Docker 客户端通过 REST API 发送的请求,并执行相应的操作。

3. Docker 镜像 (Docker Images)
Docker 镜像是一个包含应用程序及其依赖项的只读模板,用于创建 Docker 容器。镜像可以从 Docker Hub 下载,也可以通过编写 Dockerfile 来构建。Dockerfile 定义了如何构建一个镜像的步骤。

4. Docker 容器 (Docker Containers)
Docker 容器是镜像的一个运行实例,包含了应用程序及其所有依赖项,并在一个隔离的环境中运行。容器是轻量级的,启动速度快,可以在几秒钟内启动和停止。每个容器都有自己独立的文件系统、网络和进程空间。

5. Docker 仓库 (Docker Registry)
Docker 仓库用于存储和分发 Docker 镜像。Docker Hub 是最常用的公共仓库,用户可以从中下载和上传镜像。也可以使用私有的 Docker 仓库来存储镜像。

6. Docker Compose
Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。用户可以通过编写一个 docker-compose.yml 文件来定义应用程序的服务、网络和卷,然后使用 docker-compose up 命令来启动应用程序的所有服务。

3、Docker与工作原理

Docker 使用操作系统级别的虚拟化,通过 Linux 内核的 cgroups 和 namespaces 提供进程隔离和资源管理。

  1. Namespaces:Docker 使用 Linux namespaces 来提供隔离环境。每个容器运行在自己的命名空间中,包括进程ID (PID)、网络 (Network)、挂载 (Mount)、主机名 (Hostname)、用户 (User) 和进程 (Process) 等。这样可以确保容器内部的进程不会与其他容器或主机系统的进程相互干扰。
  2. Cgroups (Control Groups):Docker 使用 cgroups 来限制和隔离容器使用的资源(如 CPU、内存、磁盘 I/O 和网络带宽)。cgroups 确保每个容器在资源使用上不会影响到其他容器或主机系统。
  3. Union File System (UnionFS):Docker 镜像是由一系列的只读层组成的,UnionFS 将这些层联合在一起形成一个单一的文件系统。容器启动时,Docker 会为容器创建一个可写层,这个层位于所有只读层之上,使得容器可以对文件系统进行修改,而不会影响到镜像的只读层。

   

三、Kubernetes(k8s)基础

1、Kubernetes简介


Kubernetes 是一个开源的平台,用来管理和编排容器化的应用程序。它可以自动化应用程序的部署、扩展和管理。简单来说,Kubernetes 帮助你把应用程序的运行从单个服务器扩展到多个服务器,同时保证高可用性和可伸缩性。

想象一下,你有一个网站,它运行在一个服务器上。这个服务器有时会崩溃,或者你的网站突然变得很受欢迎,服务器处理不过来。为了确保网站一直能运行,而且可以应对更多的访问量,你决定多准备几台服务器,这样即使一台服务器出问题了,其他的服务器也能接着运行网站。这时候你需要一个智能管家,帮你管理这些服务器,让网站始终高效、可靠地运行。这个智能管家就是 Kubernetes。

2、Kubernetes核心概念

1. 集群(Cluster)

  • 集群是 Kubernetes 管理的基础单元,包含多个节点(Node)。集群内的所有节点共同工作来运行和管理应用程序。


2. 节点(Node)

  • 节点是集群中的一台物理机器或虚拟机,每个节点运行容器。节点由主节点(Master Node)管理,包含 Kubelet 代理,负责与主节点通信和运行 Pod。
  • 工作节点(Worker Node)运行实际的应用容器。
  • 主节点(Master Node)负责集群的管理和调度,包括 API Server、Controller Manager、Scheduler 和 etcd 数据库。


3. Pod

  • Pod是 Kubernetes 中最小的部署单元,一个 Pod 可以包含一个或多个容器,这些容器共享网络、存储和命名空间。
  • 多容器 Pod通常用于需要紧密耦合的应用场景,比如主从结构、日志收集器等。


4. 控制器(Controller)

  • 控制器负责管理集群的状态,确保集群的实际状态与期望状态一致。常见的控制器有:
  • Deployment:管理无状态应用的部署和升级。
  • StatefulSet:管理有状态应用的部署和升级,确保每个 Pod 都有唯一的身份。
  • DaemonSet:在每个节点上运行一个 Pod,常用于日志收集和监控。
  • Job和CronJob:分别用于一次性任务和定时任务。


5. 服务(Service)

  • 服务为一组 Pod 提供稳定的网络端点,通过标签选择器(Label Selector)来定义服务的范围。服务负责负载均衡,并提供 DNS 名称解析,使得 Pod 可以通过服务名进行访问。
  • ClusterIP:默认类型,提供集群内部访问。
  • NodePort:通过节点 IP 和端口号提供外部访问。
  • LoadBalancer:在云环境中使用云提供商的负载均衡器。


6. 配置和存储(ConfigMap 和 Secret)

  • ConfigMap用于存储非机密的配置信息,以键值对形式存储,可以在 Pod 中挂载为环境变量或配置文件。
  • Secret用于存储机密信息,比如密码、OAuth 令牌,可以在 Pod 中挂载为环境变量或配置文件。


7. 持久存储(PersistentVolume 和 PersistentVolumeClaim)

  • PersistentVolume(PV)是集群中的存储资源,独立于 Pod 的生命周期。
  • PersistentVolumeClaim(PVC)是 Pod 对存储资源的请求,PVC 会绑定到 PV 上,Pod 使用 PVC 来挂载存储卷。


8. 命名空间(Namespace)

  • 命名空间用于将集群内的资源进行逻辑分组和隔离,不同命名空间内的资源可以重名,适用于多租户环境或项目隔离。


9. Ingress

  • Ingress是管理外部访问到集群内服务的规则,通过 HTTP/HTTPS 提供路由功能。Ingress 可以配置负载均衡、SSL 终止、基于主机名和路径的路由等功能。

   

  💕💕💕每一次的分享都是一次成长的旅程,感谢您的陪伴和关注。希望这些关于云原生的文章能陪伴您走过技术的一段旅程,共同见证成长和进步!😺😺😺

🧨🧨🧨让我们一起在技术的海洋中探索前行,共同书写美好的未来!!! 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/358044.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT事件处理系统之二:窗口部件的事件拦截,以及事件的传递顺序

1、案例说明 在父窗口中为selfLineEdit窗口安装事件过滤器,这样我们可以在父窗口中首先拦截来自于selfLineEdit本身产生的事件,并且决定该事件最终是否继续传递到selfLineEdit窗口本身。 2、关键代码 selfLineEdit.cpp #include "selfLineEdit.h" #include &l…

【树形dp 换根法 BFS】2581. 统计可能的树根数目

本文涉及知识点 CBFS算法 动态规划汇总 图论知识汇总 树形dp 换根法 BFS LeetCode 2581. 统计可能的树根数目 Alice 有一棵 n 个节点的树,节点编号为 0 到 n - 1 。树用一个长度为 n - 1 的二维整数数组 edges 表示,其中 edges[i] [ai, bi] &#xf…

将知乎专栏文章转换为 Markdown 文件保存到本地

一、参考内容 参考知乎文章代码 | 将知乎专栏文章转换为 Markdown 文件保存到本地,利用代码为GitHub:https://github.com/chenluda/zhihu-download。 二、步骤 1.首先安装包flask、flask-cors、markdownify 2. 运行app.py 3.在浏览器中打开链接&…

嵌入式学习——数据结构(哈希、排序)——day50

1. 查找二叉树、搜索二叉树、平衡二叉树 2. 哈希表——人的身份证——哈希函数 3. 哈希冲突、哈希矛盾 4. 哈希代码 4.1 创建哈希表 4.2 5. 算法设计 5.1 正确性 5.2 可读性(高内聚、低耦合) 5.3 健壮性 5.4 高效率(时间复杂度&am…

Visual Studio开发环境搭建

原文:https://blog.c12th.cn/archives/25.html Visual Studio开发环境搭建 测试:笔记本原装操作系统:Windows 10 家庭中文版 资源分享链接:提取码:qbt2 注意事项:注意查看本地硬盘是否够用,建议…

2. 数据结构分析即索引库的crud

1. 数据库脚本 DROP TABLE IF EXISTS tb_hotel; CREATE TABLE tb_hotel (id bigint(0) NOT NULL,name varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT COMMENT 酒店名称,address varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_090…

运营管理和服务支撑阶段

我前面的所有设备都部署好了,现在就需要运营管理和服务支撑 遇到问题了迅速解决,避免风险扩大 我们也可以给客户提供上面的服务,提高客户的预警能力,安全风险处理能力 我们不仅提供设备,还提供服务 我们公司成立了安…

【算法专题--链表】两两交换链表中的节点 -- 高频面试题(图文详解,小白一看就懂!!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐双指针 -- 采用哨兵位头节点 🥝 什么是哨兵位头节点? 🍍 解题思路 🍍 案例图解 四、总结与提炼 五、共勉 一、前言 两两交换链表中的节点 这道题,可以说…

K8S - 在集群内反向代理外部资源 - headless service 的使用

在上一篇文章中 K8S - 理解ClusterIP - 集群内部service之间的反向代理和loadbalancer 介绍了 ClusterIP 的主要作用 : 在k8s 集群内部 代理 内部的多实例 service 但是ClusterIP 还有1个变种 -> 无头服务 (headless service) 它用于代理集群外部的 ip资源 当然代理外部资…

AI应用带你玩系列之SadTalker

前段时间我刷微信视频,我无意间点开了一个,画面缓缓展开,是一幅精致的水墨画,画中人物皆是古代装束,衣袂飘飘,仿佛能闻到墨香。然而,这宁静的画面突然被打破了,画中的人物开始动了起…

初识 SpringMVC,运行配置第一个Spring MVC 程序

1. 初识 SpringMVC,运行配置第一个Spring MVC 程序 文章目录 1. 初识 SpringMVC,运行配置第一个Spring MVC 程序1.1 什么是 MVC 2. Spring MVC 概述2.1 Spring MVC 的作用: 3. 运行配置第一个 Spring MVC 程序3.1 第一步:创建Mave…

鸿蒙开发系统基础能力:【@ohos.faultLogger (故障日志获取)】

故障日志获取 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import faultLogger from ohos.faultLoggerFaultType 故障类型枚举。 系统能力: 以下各项对应的系统能力…

利用MSSQL模拟提权

点击星标,即时接收最新推文 本文选自《内网安全攻防:红队之路》 扫描二维码五折购书 利用MSSQL模拟提权 在MS SQL数据库,可以使用EXECUTE AS语句,以其他用户的上下文执行SQL查询。需要注意的是只有明确授予模拟(Impers…

vuex的深入学习[基于vuex3]----篇(二)

store对象的创建 store的传递图 创建语句索引 创建vuex的语句为new Vuex.Store({…})Vuex的入口文件是index.js,store是index.js导出的store类store类是store.js文件中定义的。 Store的构造函数constructor 判断vuex是否被注入,就是将vue挂载在window对象上&am…

Java | Leetcode Java题解之第169题多数元素

题目: 题解: class Solution {public int majorityElement(int[] nums) {int count 0;Integer candidate null;for (int num : nums) {if (count 0) {candidate num;}count (num candidate) ? 1 : -1;}return candidate;} }

TLS握手中的RTT

文章目录 TLS 1.2 握手过程中的 RTT 次数TLS 1.3 1-RTT 初次TLS1.3 0-RTT 握手过程总结 TLS 1.2 握手过程中的 RTT 次数 TLS 1.2 握手通常需要2 RTT 才能完成。具体步骤如下: 第一次 RTT: 客户端发送 ClientHello:客户端生成一个随机数&…

26.3 Django路由层

1. 路由作用 在Django中, URL配置(通常称为URLconf)是定义网站结构的基础, 它充当着Django所支撑网站的目录. URLconf是一个映射表, 用于将URL模式(patterns)映射到Python的视图函数或类视图上. 这种映射机制是Django处理HTTP请求的基础, 它决定了当客户端发送请求时, Django如…

消息认证码解析

1. 什么是消息认证码 消息认证码(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称为MAC。 消息认证码的输入包括任意长度的消息和一个发送者与接收者之间共享的密钥,它可以输出固定长度的数据&#x…

AIGC-Animate Anyone阿里的图像到视频 角色合成的框架-论文解读

Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 论文:https://arxiv.org/pdf/2311.17117 网页:https://humanaigc.github.io/animate-anyone/ MOTIVATION 角色动画的目标是将静态图像转换成逼真的视频,这在在线零…

ip地址怎么写才是的对的?合法ip地址正确的格式

IP地址怎么写才是的对的?在互联网的世界里,IP地址就像是我们生活中的门牌号码,它是每个设备在网络中的唯一标识。正确的书写IP地址对于确保网络通信的顺畅至关重要。本文将带您了解合法IP地址的正确格式与书写规范,并深入探讨其在…