12.docker存储

在这里插入图片描述

docker的基本结构是什么?包含哪些组件?

Docker 的基本架构是一个客户端-服务器(C/S)模式,由 Docker 客户端和 Docker 守护进程组成。Docker 客户端通过命令行或其他工具使用 Docker SDK 与 Docker 守护进程通信,发送容器管理请求。Docker 守护进程接收并处理请求,调用 Docker 引擎执行容器的创建、运行、停止等操作。Docker 引擎还负责与 Docker 仓库(Registry)交互,搜索、下载、上传镜像。Docker 仓库是一个存储镜像的服务,可以是公有的(如 Docker Hub)或私有的。

Docker 的基本架构如下图所示:
在这里插入图片描述

docker存储是如何工作的?

存储驱动是用来实现镜像和容器层的叠加和隔离的技术,它可以使用不同的文件系统或映射框架来将不同的文件系统层映射到一个统一的视图中。docker支持多种存储驱动,如overlay2、aufs、devicemapper、btrfs、zfs等,每种存储驱动有不同的特点和优缺点,需要根据不同的操作系统和文件系统来选择合适的存储驱动。docker主要有以下几种存储驱动:

  • overlay2:是当前版本推荐的存储驱动,无需额外的依赖和配置即可发挥绝佳的性能。在 18.09 版本之后替换了 overlay 存储驱动。支持 xfs,ext4 文件系统。
  • aufs:Docker 早期使用的存储驱动,是 Docker 18.06 版本之前,Ubuntu 14.04 版本前推荐的。支持 xfs,ext4 文件系统。
  • devicemapper:是较早版本的 CentOS 和 RHEL 系统推荐的存储驱动,因为它们不支持 overlay2,需要 direct-lvm 的支持。
  • btrfs:仅用于 btrfs 文件系统。
  • zfs:仅用于 zfs 文件系统。
  • vfs:不依赖于文件系统,但是性能奇差,主要用来测试。

数据卷是用来实现容器数据的持久化和共享的技术,它可以将容器内的数据保存在主机上或者第三方的存储服务上,使得容器删除后数据仍然存在,也可以在不同的容器之间共享数据。docker支持多种数据卷,如本地文件系统的数据卷、绑定挂载的数据卷、插件式的数据卷等,每种数据卷有不同的使用场景和性能影响,需要根据不同的需求来选择合适的数据卷。

  • 默认:容器的数据卷默认保存在 /var/lib/docker/volumes 目录下,与容器的生命周期绑定,容器删除时数据卷也会被删除。
  • volumes:容器的数据卷可以通过 docker volume 命令或者 docker-compose.yml 文件创建和管理,与容器的生命周期解耦,容器删除时数据卷不会被删除,可以被其他容器挂载和使用。
  • bind mounts:容器的数据卷可以直接挂载主机上的任意目录或文件,与主机共享文件系统,可以被多个容器同时挂载和修改。
  • tmpfs mounts:仅在 Linux 系统中提供,容器的数据卷可以挂载到主机上的内存中,具有高性能和安全性,但是不支持持久化和共享。

存储驱动是为了解决什么问题?

存储驱动是为了解决 Docker 镜像和容器的存储问题。Docker 镜像和容器是由多层文件系统组成的,每一层都是一个只读或可写的文件集合。为了实现这种多层文件系统的叠加和管理,Docker 需要使用一种技术来将不同的文件系统层映射到一个统一的视图中,这就是存储驱动的作用。存储驱动可以提供以下功能:

  • 实现镜像和容器层的叠加,使得每个镜像或容器只需要存储自己的差异部分,节省存储空间。
  • 实现镜像和容器层的隔离,使得每个镜像或容器不会相互影响,保证安全性和可靠性。
  • 实现镜像和容器层的快速创建、删除、复制等操作,提高效率和灵活性。
  • 实现镜像和容器层的额外功能,如快照、压缩、校验等,增加可用性和功能性。

docker为什么需要存储?

Docker 需要存储是因为容器本身是无状态的,也就是说,容器中的数据在容器停止或删除后就会丢失。这对于一些需要持久化或共享数据的应用来说是不可接受的。例如,数据库、日志、配置文件等。因此,Docker 提供了存储驱动和存储方式来实现容器数据的存储和管理,以满足不同的场景和需求。

无状态和有状态应用的区别

无状态和有状态应用的区别主要在于应用是否需要记录和维护交互状态的信息,以及这些信息需要如何存储。

无状态应用是指每次交互都是独立的,不依赖于之前或之后的交互,也不需要保存任何状态信息。无状态应用的优点是简单、可扩展、易恢复,缺点是功能有限、不能实现个性化或复杂的逻辑。无状态应用的典型例子是搜索引擎、静态网页等。

有状态应用是指每次交互都可能受到之前或之后的交互的影响,需要保存和更新一些状态信息。有状态应用的优点是功能丰富、可以实现个性化或复杂的逻辑,缺点是复杂、难以扩展、容易出错。有状态应用的典型例子是电子商务、社交网络、在线游戏等。

无状态和有状态应用可以在不同层次上实现,比如协议层、服务层、数据层等。不同层次上的无状态和有状态应用可能有不同的实现方式和考虑因素。例如:

  • 协议层上,TCP 是一个有状态协议,因为它需要维护连接状态、序号、窗口等信息来保证可靠传输;HTTP 是一个无状态协议,因为它每次请求和响应都是独立的,不需要保存任何连接信息。
  • 服务层上,RESTful API 是一个无状态服务,因为它每次请求都包含了所有必要的信息,不需要服务端保存任何会话或上下文信息;RPC 是一个有状态服务,因为它需要服务端保存客户端的身份和调用历史等信息。
  • 数据层上,Redis 是一个有状态数据存储,因为它需要保存键值对数据和过期时间等信息;CDN 是一个无状态数据存储,因为它只需要缓存静态资源文件,不需要保存任何元数据或过期时间等信息。
    根据不同的场景和需求,可以选择合适的无状态或有状态应用来优化系统的性能和可靠性。

k8s是如何工作的?

Kubernetes (K8s) 是一个开源的容器编排系统,用于自动部署、扩缩和管理容器化应用程序1。Kubernetes 的工作原理是:

  • Kubernetes 集群由一组节点组成,节点可以是物理机或虚拟机。集群中有一个主节点,负责管理集群的状态和调度,以及多个工作节点,负责运行容器化的应用程序。
  • Kubernetes 使用 Pod 作为最小的部署单元,一个 Pod 可以包含一个或多个容器,以及一些共享的资源,如网络和存储。Pod 可以通过 Service 暴露出来,提供负载均衡和服务发现的功能。
  • Kubernetes 使用控制器来管理 Pod 的生命周期,例如 Deployment 控制器可以确保 Pod 的数量和状态与用户定义的期望一致,StatefulSet 控制器可以为有状态的应用程序提供稳定的标识和存储。
  • Kubernetes 使用 API Server 作为集群的入口点,用户可以通过命令行工具 kubectl 或其他客户端与 API Server 交互,发送请求和获取响应。API Server 也与其他组件通信,如 etcd、Scheduler、Controller Manager 等,维护集群的一致性和高可用性。

如何部署一个容器化应用程序到 Kubernetes 集群?

  • 编写一个 Kubernetes YAML 文件,描述你的应用程序的组件和配置,例如 Deployment、Service、ConfigMap 等。
  • 使用 kubectl 命令行工具,或者其他客户端,与 Kubernetes API Server 交互,将你的 YAML 文件应用到集群中。
  • 使用 kubectl 或其他工具,检查你的应用程序的状态和日志,确保它们正常运行和可访问。

如何创建一个 Kubernetes 集群?

  • 选择一个合适的基础设施环境,例如本地、公有云、私有云或混合云。
  • 选择一个合适的部署工具,例如 kubeadm、kOps、Kubespray 等,或者使用一些现成的解决方案,例如 Google Kubernetes Engine (GKE)、Amazon Elastic Kubernetes Service (EKS) 等。
  • 准备好一组节点,节点可以是物理机或虚拟机。节点分为主节点和工作节点,主节点负责管理集群,工作节点负责运行应用程序。
  • 使用部署工具或解决方案,按照它们的文档指导,初始化集群,并加入节点。
    验证集群的状态和功能,确保所有的组件和服务都正常运行。

docker到底是如何实现隔离和打包的?

Docker 是一个开源的容器平台,它可以实现容器的创建、运行和管理。Docker 的核心思想是打包装箱,每个箱子(容器)之间是互相隔离的。Docker 是如何实现隔离和打包的呢?

Docker 主要依赖 Linux 的 Namespace 和 Cgroups 两个技术点来实现资源的隔离和打包。

Namespace 是 Linux 提供的资源隔离机制,说的直白一点,就是调用 Linux 内核的方法,实现各种资源的隔离。具体包括:文件系统、网络设备和端口、进程号、用户用户组、IPC 等资源。Linux 实现的 Namespace 包括多种类型,如 UTS、IPC、PID、Network、Mount 和 User 等。通过创建新的 Namespace,容器内部的进程就可以拥有独立的资源视图,而不受宿主机或其他容器的影响。

Cgroups 是 Linux 内核提供的资源限制和隔离的机制,全称:Control groups。Cgroups 为每种可以控制的资源定义了一个子系统,如 cpu、cpuset、cpuacct、memory、blkio、devices、freezer、net_cls、net_prio 和 ns 等。Cgroups 可以限制容器对物理资源(如 CPU、内存、磁盘 I/O 等)的使用量,防止某个容器占用过多资源影响其他容器或宿主机的正常运行。

Docker 在具体实现的时候,抽象了一个模块叫”libcontainer“,把 Linux 内核相关的 API 做了一层封装,包括 Namespace、Cgroups、网络、设备等。通过这一层抽象,增大了 Docker 支持其他操作系统的可行性。

namespace和cgroup的区别和联系

  • namespace 和 cgroup 都是 Linux 内核提供的资源隔离和管理的机制,它们都是容器技术的基础。
  • namespace 的主要作用是隔离进程的视图,使得进程只能看到自己所属的 namespace 中的资源,而不能看到其他 namespace 中的资源。namespace 可以隔离的资源包括进程 ID、用户 ID、网络、文件系统、主机名等。
  • cgroup 的主要作用是限制和控制进程组使用的资源总额,比如 CPU、内存、磁盘 I/O、网络带宽等。cgroup 可以对资源进行分配、限制、优先级控制、统计和计费等操作。
  • namespace 和 cgroup 是互补的机制,它们可以结合使用来实现对进程的安全、高效和灵活的管理。通过 namespace,可以实现进程之间的隔离和封装,避免资源冲突和信息泄露;通过 cgroup,可以实现进程之间的资源限制和优化,避免资源浪费和饥饿。
  • namespace 和 cgroup 不仅用于容器技术,还可以用于其他应用场景,比如虚拟化、沙箱、监控等。namespace 和 cgroup 接口内置于 Linux 内核中,可以通过系统调用或者文件系统接口来操作。

namespace是如何工作的?

namespace 是 Linux 内核的一种资源隔离机制,它可以为不同的进程提供不同的「命名空间」,使得进程只能访问其对应的「命名空间」中的资源,而不能访问其他「命名空间」中的资源。namespace 可以隔离的资源包括进程 ID、主机名、用户 ID、网络访问、进程间通信和文件系统等。

namespace 是如何工作的呢?简单来说,namespace 通过以下几个步骤来实现资源隔离:

  1. 创建 namespace。可以通过 clone() 系统调用来创建一个新的进程,并指定其所属的 namespace;也可以通过 unshare() 系统调用来将一个已有的进程从当前的 namespace 中分离出来,并创建一个新的 namespace。
  2. 加入 namespace。可以通过 setns() 系统调用来将一个已有的进程加入到指定的 namespace 中,从而共享该 namespace 中的资源。
  3. 查看 namespace。可以通过 /proc/$pid/ns/ 目录下的文件来查看一个进程所属的各种 namespace 的信息,比如 namespace 的 ID、类型等。
  4. 操作 namespace。可以通过文件系统接口来操作 namespace 的属性和参数,比如挂载和卸载文件系统、设置网络配置、修改用户映射等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值