Docker和K8s原理(学Java后端的必备知识)看这个就足够了
这次我们要加的中间层是。
1.物理服务器是什么?
一台废弃的大学时期的电脑、实际上就相当于一台物理服务器,云厂商也叫它独立服务器、本质上就是一台能摸得着的、独立运转的机器。
和家用电脑不同的是、云厂商的物理服务器通常性能更强、核数更高,而且放在专业机房里、有专门的空调和运维保障。
虽然理论上自己用家用电脑也能搭建服务器、但实际上并不划算:
-
家用电脑功耗不低,一年下来光电费就是一笔开销;
-
还得自己保证机器长期不断电不断网,维护成本很高。
所以大多数情况下、直接租用云厂商的服务器更划算、省心。
不过云厂商的物理服务器一般配置都比较高、而很多应用其实用不了这么高性能的机器。
针对这个问题、云厂商也做了优化、比如推出了虚拟化、弹性实例等产品、让用户可以根据实际需求、按需购买一部分资源、既省钱又灵活。
2. 你知道 ecs、vps、docker 容器 是什么吗?它们有啥区别呢?
VPS(Virtual Private Server、虚拟专用服务器)。不支持用户自主升降级、它的资源是预先分配的、不易动态调整。
ECS(Elastic Compute Service,弹性计算服务)也就是在 VPS 加入自主升降级的功能。用户可以根据需要随时调整 CPU、内存、磁盘和带宽、主打一个弹性。
Docker 技术就是:
它打包应用程序、依赖库和配置文件,然后通过 Linux 内核提供的 Namespace 技术隔离运行环境、让每个容器看起来像是一个独立系统、再通过 Cgroup 技术限制每个容器使用的资源、比如 CPU 和内存。
就可以实现每个 Docker 容器就可以像独立小系统一样运行、但又不需要真正起一套完整的操作系统、将这部分系统文件挂到 ecs 的操作系统下。
总结一句话就是:
Docker 容器就是把应用和环境打包成轻量单元,跑在 ECS 服务器上,多个容器共享一套操作系统内核,实现高效、隔离、可移植的运行方式。
云厂商一般会将一台物理服务器分割成多个虚拟机。它跟我们在 windows 用 VMware,、VirtualBox 建的虚拟机其实是一回事。
每个虚拟机都拥有独立的操作系统、资源(比如 CPU、内存、存储空间)和公网 IP 地址。然后对外出售
这样的虚拟机就是所谓的 VPS(Virtual Private Server、虚拟专用服务器)。
但传统 VPS 有个缺点、不支持用户自主升降级、它的资源是预先分配的、不易动态调整。
举个例子假设你买了 1c1g 的服务器、想在页面上点点两下升级成 2c2g、这在传统 VPS 里是不支持的。
如果给 VPS 加入自主升降级的功能、那它就成了 ECS(Elastic Compute Service,弹性计算服务)
买了 ecs 后、我们一般会开始部署自己的软件应用。机器少的时候手动部署问题不大、机器多了后各种问题就来了。其中最明显的就是:ecs 之间、如果底层操作系统不同、比如有些是 ubuntu、有些是 centos部署应用的时候就会有各种环境问题。
如果能让软件带着操作系统环境一起去部署就好了、最简单的方案是将软件和操作系统一起打包成虚拟机部署在 ecs 中。但这样就成了在 ECS(也就是虚拟机)中再运行一个完整的虚拟机、太重了。有解法吗?
有。既然多加一个操作系统太重、那我就只打包软件和系统依赖库加配置就好了。然后将这部分系统文件挂到 ecs 的操作系统下、利用一个叫 Namespace 的能力让它看起来就像是一个独立操作系统一样。
再利用一个叫 Cgroup 的能力限制它能使用的计算资源。这就省掉了一层笨重的操作系统、同时还让软件轻松跑在各类操作系统上。
这就是我们常说的 Docker 容器技术。
Docker 就是一款可以将程序和环境打包并运行的工具软件
总的来说就是:物理服务器上跑 ecs、ecs 跑 Docker 容器。多个 Docker 容器共享一个 ecs 实例 操作系统内核
3. Docker 和 k8s 之间是什么关系
作为一个程序员、如果你想安装一个 vim 编辑下文本、在不同环境里你得执行不同的命令。在 ubuntu、你需要执行 apt-get install vim,在 centos 里,你需要执行 yum install vim
装个小软件尚且如此、要是你想将自己写的代码部署到各个不同操作系统的服务器上、那依赖的软件和配置就更多了,需要针对每个环境单独写一套部署脚本。
那么问题就来了、有没有更好的解决方案? 当然有没有什么是加一层中间层不能解决的、如果有、那就再加一层
这次我们要加的中间层是 Docker
4. 程序和环境
程序是跑在操作系统上的、而操作系统上又装了各种不同版本的依赖库和配置、这些被程序所依赖的信息、我们统称为环境
程序依赖环境、环境不同、程序就可能跑不起来。
如果我们能将环境和程序一起打包、给到对方运行、那问题不就解决了吗。
Docker 就是这样一款可以将程序和环境打包并运行的工具软件。我们来看下它是怎么做的
5. 基础镜像
选中一个基础操作系统和语言后、我们将它们对应的文件系统、依赖库、配置等放一起打包成一个类似压缩包的文件、这就是所谓的基础镜像
6. Dockerfile 是什么
Dockerfile就是一份列清楚了、从操作系统到应用服务启动,需要做哪些事情的清单文件(todo list)、就是所谓的 Dockerfile。在Linux内核中我们可以理解为一个命令脚本。
总结就是:Dockerfile 就是构建容器镜像的脚本、它定义了从一个操作系统、到应用服务启动、整个过程中需要做的所有事情。
7. 容器是什么
参考面试回答:
我认为的容器的理解就是 一个独立的环境和应用程序、就是所谓的容器(container)。我们可以在一个操作系统上同时跑多个容器。且这些容器之间都是互相独立、互相隔离的
首先要说一下Registry 是什么
Docker 弄了一个镜像仓库、通过 docker push 将镜像推到仓库、有需要的时候再通过 docker pull 将镜像拉到机器上。
这个负责管理镜像仓库推拉能力的服务、就叫 Docker Registry。
基于 Docker Registry 的能力、我们可以搭建各种官方或私人镜像仓库
我们解决了服务器间传输容器镜像的问题。我们可以跑到目的服务器上、执行 docker pull 拿到容器镜像。
然后执行 docker run 命令、将这个类似"压缩包"的容器镜像给"解压缩"、获得一个独立的环境和应用程序并运行起来。
这样一个独立的环境和应用程序、就是所谓的容器(container)。
我们可以在一个操作系统上同时跑多个容器。且这些容器之间都是互相独立、互相隔离的
8. 容器镜像是什么
Dockerfile 只是描述了要做哪些事情、并没有真正开始做。
当我们用命令行执行 docker build 的时候、Docker 软件就会按着 Dockerfile 的说明、一行行构建环境+应用程序。最终将这个环境+程序、打包成一个类似"压缩包"的东西、我们叫它容器镜像
9. Registry 是什么
Docker 弄了一个镜像仓库、通过 docker push 将镜像推到仓库、有需要的时候再通过 docker pull 将镜像拉到机器上。
这个负责管理镜像仓库推拉能力的服务、就叫 Docker Registry。
基于 Docker Registry 的能力、我们可以搭建各种官方或私人镜像仓库
比如官方的叫 DockerHub、非官方的有清华大学的 Tuna 等等、一般公司内部也会有自己的镜像仓库
10. Docker 和虚拟机的关系
传统虚拟机自带一个完整操作系统、而容器本身不带完整操作系统、容器的基础镜像实际上只包含了操作系统的核心依赖库和配置文件等必要组件
它利用一个叫 Namespace 的能力让它看起来就像是一个独立操作系统一样
再利用一个叫 Cgroup 的能力限制它能使用的计算资源
所以说:容器本质上只是个自带独立运行环境的特殊进程,底层用的其实是宿主机的操作系统内核
11. Docker 的架构原理
它是经典的 Client/Server 架构。
Client 对应 Docker-cli、Server 对应 Docker daemon。
我们在命令行里敲 Docker 命令、使用的就是 Docker-cli
Docker-cli 会解析我们输入的 cmd 命令、然后调用 Docker daemon 守护进程提供的 RESTful API
守护进程收到命令后、会根据指令创建和管理各个容器
再具体点:Docker Daemon 内部分为 Docker Server、Engine 两层
Docker Server 本质上就是个 HTTP 服务、负责对外提供操作容器和镜像的 api 接口、接收到 API 请求后、会分发任务给 Engine 层、Engine 层负责创建 Job、由 Job 实际执行各种工作
12. Docker 到底是什么
Docker 本质上就是一个将程序和环境打包并运行的工具软件。
具体点来说就是、它通过 Dockerfile 描述环境和应用程序的依赖关系
通过 docker build 构建镜像、docker pull/push 跟 Docker Registry 交互实现存储和分发镜像,docker run 命令基于镜像启动容器、基于容器技术运行程序和它对应的环境、从而解决环境依赖导致的各种问题。
13. Docker Compose 是什么?原理是什么
Docker 解决的是一个容器的部署。Docker Compose 解决的是多个容器组成的一整套服务的部署
它就是用来管理和一键部署多个容器应用的工具
在实际项目中、我们经常需要启动一整套服务、比如一个博客系统、可能要先启动数据库、再启动身份验证服务、最后启动 Web 服务。如果手动一个个 docker run、不仅麻烦、还容易出错。
Docker Compose提供了一个更优雅的方式:
我们可以用一个YAML文件(通常叫 docker-compose.yml)、在里面清晰地定义好:
-
要启动哪些容器
-
容器之间的依赖顺序
-
每个容器的 CPU、内存限制
-
网络配置和共享存储等信息
然后只需要一行命令 docker-compose up、Compose 就会按照 YAML 文件的描述、一键拉起所有容器、并且按照依赖顺序自动启动、极大地简化了多容器应用的部署和管理。
总结一句话就是:
Docker Compose 是用来定义和一键部署多容器应用的工具、适合管理复杂项目
14. Docker Swarm 是什么
Docker 解决的是一个容器的部署。Docker Compose 解决的是多个容器组成的一整套服务的部署。
那 Docker Swarm 就更高维度了、它解决的其实是这一整套服务在多台服务器上的集群部署问题。
比如在 A 服务器坏了、就将服务在 B 服务器上重新部署一套、实现迁移、还能根据需要对服务做扩缩容
15. Docker 和 k8s 的关系是什么?什么是容器编排引擎
k8s 它会在多台 Node 服务器上调度 Pod、进行部署和扩缩
k8s 调度的 Pod 里的 container。也就是Docker 部署的容器。
k8s 的官方定义:叫容器编排引擎、将它理解为、以 API 编程的方式管理安排各个容器的引擎
所谓容器编排引擎、本质上就是用来管理和调度大量容器运行的工具
比如在实际项目中、单个容器是很好管理的、但一旦规模上来、比如几十上百个容器、涉及部署顺序、扩缩容、健康检查、资源分配、故障恢复等等、手动管理几乎不可能。
这个时候就需要一个系统、能够:
-
自动把容器部署到合适的机器上,
-
监控容器的运行状态,
-
出问题时能自动重启或迁移,
-
支持按需扩容缩容,
-
还能通过 API 动态控制容器的生命周期。
这样的系统就是容器编排引擎
像 Kubernetes(k8s)、Docker Swarm、都是容器编排引擎。
只不过现在 Kubernetes 成为了主流标准。
可以理解为:Kubernetes 就是用 API 编程的方式、自动管理和安排大量容器的引擎。
总结:
-
Docker 本质上就是一个将程序和环境打包并运行的工具软件、而 Docker 容器本质上只是个自带独立运行环境的特殊进程、底层用的其实是宿主机的操作系统内核。
-
Docker软件 通过Dockerfile描述环境和应用程序的依赖关系、docker build构建镜像。docker pull/push跟Docker Registry交互实现存储和分发镜像、docker run命令基于镜像启动容器、基于容器技术运行程序和它对应的环境、从而解决环境依赖导致的各种问题。 -
Docker 解决的是一个容器的部署问题、Docker Compose 解决的是多个容器组成的一套服务的部署问题。Docker Swarm 解决的是多个容器组成的一套服务在多台服务器上的部署问题、k8s 则是 Docker Swarm 的竞品、在更高维度上兼容了 Docker 容器、实现了容器编排调度
面试题:
Docker是什么?介绍一下原理?介绍一下K8s容器编排引
Docker 本质上就是一个将程序和环境打包并运行的工具软件
程序是跑在操作系统上的、而操作系统上又装了各种不同版本的依赖库和配置、这些被程序所依赖的信息、我们统称为环境
程序依赖环境、环境不同、程序就可能跑不起来。
Docker 就是这样一款可以将程序和环境打包并运行的工具软件。
而Docker 技术就是:
它打包应用程序、依赖库和配置文件,然后通过 Linux 内核提供的 Namespace 技术隔离运行环境、让每个容器看起来像是一个独立系统、再通过 Cgroup 技术限制每个容器使用的资源、比如 CPU 和内存。
就可以实现每个 Docker 容器就可以像独立小系统一样运行、但又不需要真正起一套完整的操作系统、将这部分系统文件挂到 ecs 的操作系统下。
它与传统虚拟机对比的话:
传统虚拟机自带一个完整操作系统、而容器本身不带完整操作系统、容器的基础镜像实际上只包含了操作系统的核心依赖库和配置文件等必要组件。Docker 容器本质上只是个自带独立运行环境的特殊进程、底层用的其实是宿主机的操作系统内核
它的架构原理是: Client/Server 架构
Client 对应 Docker-cli、Server 对应 Docker daemon。
它通过 Dockerfile 描述环境和应用程序的依赖关系
通过 docker build 构建镜像、docker pull/push 跟 Docker Registry 交互实现存储和分发镜像,docker run 命令基于镜像启动容器、基于容器技术运行程序和它对应的环境、从而解决环境依赖导致的各种问题。
然后还要介绍一下K8是也叫容器编排引擎
所谓容器编排引擎、本质上就是用来管理和调度大量容器运行的工具。Docker 解决的是一个容器的部署问题、Docker Compose 解决的是多个容器组成的一套服务的部署问题。Docker Swarm 解决的是多个容器组成的一套服务在多台服务器上的部署问题、k8s 则是 Docker Swarm 的竞品、在更高维度上兼容了 Docker 容器、实现了容器编排调度。k8s 的官方定义:叫容器编排引擎、将它理解为、以 API 编程的方式管理安排各个容器的引擎。
比如在实际项目中、单个容器是很好管理的、但一旦规模上来、比如几十上百个容器、涉及部署顺序、扩缩容、健康检查、资源分配、故障恢复等等、手动管理几乎不可能。
这个时候就需要一个系统、能够:
-
自动把容器部署到合适的机器上,
-
监控容器的运行状态,
-
出问题时能自动重启或迁移,
-
支持按需扩容缩容,
-
还能通过 API 动态控制容器的生命周期。
这样的系统就是容器编排引擎。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)