首先,要明确的是,Kubernetes 并没有完全放弃 Docker,而是改变了对 Docker 的使用方式。
这一改变主要是因为 Kubernetes 1.20 版本开始,宣布弃用了 Docker 作为容器运行时的支持(Dockershim 的移除)。这意味着,虽然在 Kubernetes 集群中可以运行用 Docker 构建的容器镜像,但 Kubernetes 将不再使用 Docker 作为容器运行时。
本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享
1、Docker 是什么:
Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙盒机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker 使用的是客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。镜像可以看作是容器的"模版",而容器则是这些模版的实例化对象。Docker 提供了一个非常便捷的镜像使用方式,除了可以使用本地镜像外,还可以从 Docker Hub 上下载数以万计的镜像使用。
2、Kubernetes 是什么:
Kubernetes(也称为 K8s)是用于自动部署、扩展和管理容器化应用程序的开源系统。它由 Google 设计并捐赠给 Cloud Native Computing Foundation 来维护。Kubernetes 提供了一个用于部署应用程序的框架,支持应用程序的扩展和故障处理等功能,还提供了一系列的工具和服务以实现各种需求。
Kubernetes 的核心功能包括:
- 自动化容器的部署和复制
- 随时扩展或缩减容器数量
- 将容器组织成组并提供容器间的负载均衡
- 服务发现和负载均衡
- 自动挂载存储系统
- 自动化的滚动更新
- 自我修复,如重新启动失败的容器
3、Docker 和 Kubernetes 的区别:
虽然 Docker 和 Kubernetes 都是与容器化技术相关的工具,但它们在某些方面有着明显的不同。
使用范围和目的:Docker 主要关注的是容器的打包和运行,简化了应用程序的交付。而 Kubernetes 更加关注的是容器的协调和管理,包括自动部署、扩展、运行和调度容器。
设计和架构:Docker 使用简单的设计,易于理解和使用。它可以在单机上运行,也可以结合 Docker Swarm 在多机上协同工作。Kubernetes 则更加复杂,提供更多的功能和更高的灵活性,它是为在集群上大规模运行和管理容器化应用设计的。
功能和特性:Docker 直接处理容器的创建和运行,而 Kubernetes 提供了更复杂的调度器和集群管理工具。Kubernetes 能够管理和调度多个容器组成的应用,具有自动扩展、自愈等高级特性。
生态系统和社区:虽然 Docker 和 Kubernetes 都拥有强大的社区支持,但 Kubernetes 在云计算和微服务领域的生态系统更为丰富,支持更多的云平台和产品集成。
总的来说,Docker 更专注于单个容器的生命周期,而 Kubernetes 更关注容器集群的整体管理。在微服务和云原生应用的趋势下,两者往往是相辅相成的关系,Docker 用于容器化应用,而 Kubernetes 用于管理这些容器化的应用。
Kubernetes 对 Docker 的使用方式改变:
首先,要明确的是,Kubernetes 并没有完全放弃 Docker,而是改变了对 Docker 的使用方式。这一改变主要是因为 Kubernetes 1.20 版本开始,宣布弃用了 Docker 作为容器运行时的支持(Dockershim 的移除)。这意味着,虽然在 Kubernetes 集群中可以运行用 Docker 构建的容器镜像,但 Kubernetes 将不再使用 Docker 作为容器运行时。
这个改变背后的原因是 Docker 和 Kubernetes 之间的技术差异。Docker 是一个包含多种功能的大型应用,除了容器运行时之外,还包括图像管理、存储、网络等。而 Kubernetes 实际上只需要容器运行时这一部分功能。因此,为了减轻 Kubernetes 的负担,更高效地管理容器,Kubernetes 开始支持更加轻量级和标准化的容器运行时接口(CRI)。
Kuberetes 并没有淘汰 Docker:
这并不意味着 Docker 被淘汰,因为 Docker 构建的容器镜像仍然可以在 Kubernetes 中运行。只是 Kubernetes 会使用其他容器运行时(如 containerd 或 CRI-O)来直接运行这些镜像。Docker 镜像本身符合 OCI(Open Container Initiative)标准,因此可以被任何标准的容器运行时使用。
Docker 在 Kubernetes 生态中的角色:
在这种情况下,Docker 更像是一个开发工具,而不是在生产环境中的容器运行时。开发者仍然可以使用 Docker 来构建、测试容器镜像,然后将这些镜像部署到 Kubernetes 集群中。实际上,这种变化让 Kubernetes 变得更加高效,因为它可以直接与底层容器运行时接口交互,减少了不必要的中间层。
两个代码示例来展示如何在 Kubernetes 环境中使用容器。第一个示例是一个 Dockerfile,用于创建一个简单的 Docker 镜像;第二个示例是一个 Kubernetes 的部署配置文件(Deployment)用于在 Kubernetes 集群中部署这个镜像。这两个示例将展示如何将一个 Docker 容器化的应用部署到 Kubernetes 集群中。
示例 1:Dockerfile
这个 Dockerfile 示例将创建一个简单的 Node.js 应用的 Docker 镜像。
bash
# 使用官方的 Node.js 基础镜像作为构建环境
FROM node:14
# 设置工作目录为 /app
WORKDIR /app
# 将 package.json 和 package-lock.json 复制到容器中
COPY package*.json ./
# 安装应用依赖
RUN npm install
# 将应用的源代码复制到容器中
COPY . .
# 应用运行时监听的端口
EXPOSE 8080
# 定义容器启动时运行的命令
CMD ["node", "server.js"]
在这个 Dockerfile 中,我们基于 Node.js 的官方镜像创建一个新的镜像,安装了应用的依赖,并设置容器启动时执行的命令。
示例 2:Kubernetes Deployment 配置文件
这个 YAML 文件示例定义了一个 Kubernetes Deployment,用于部署上面创建的 Docker 镜像。
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nodejs-app
labels:
app: nodejs-app
spec:
replicas: 2 # 创建两个副本
selector:
matchLabels:
app: nodejs-app
template:
metadata:
labels:
app: nodejs-app
spec:
containers:
- name: nodejs-container
image: your-dockerhub-username/nodejs-app:latest # 指定 Docker 镜像
ports:
- containerPort: 8080 # 容器应用监听的端口
在这个 YAML 文件中,我们定义了一个名为 nodejs-app 的 Deployment。它将部署两个副本的容器,每个容器都运行 your-dockerhub-username/nodejs-app:latest 镜像(这里你需要替换成你自己的 Docker Hub 用户名和镜像名)。这个部署配置指定了容器内部的应用监听端口为 8080。
结合这两个示例,你可以看到 Docker 和 Kubernetes 如何一起工作来容器化和部署一个应用。首先,使用 Docker 构建一个应用的镜像,然后通过 Kubernetes 部署配置在集群中部署这个镜像。
总结,Docker真的被Kubernetes放弃了吗?
所以,我们可以说 Kubernetes 改变了对 Docker 的使用方式,而不是完全放弃了 Docker。这种变化更多地反映了 Kubernetes 向标准化、高效化发展的趋势,同时也保留了 Docker 在容器技术领域的核心价值和广泛使用。对于开发者来说,这意味着他们仍然可以在开发过程中使用 Docker,而 Kubernetes 则更专注于容器的编排和管理。
本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享