虚拟机和容器

区别 和虚拟机比较,容器更加轻量级,它允许在相同的硬件上运行更多数量的组件。主要是因为每个虚拟机需要运行自己的一组系统进程,这就产生了除组件进程外的额外开销。从另一方面说,一个容器仅仅是运行在宿主机上被隔离的单个进程,仅消耗应用容器消耗的资源,不会有其他进程的开销。 因为虚拟机的额外开销,导致没有足够的资源给每个应用开一个专用的虚拟机,最终会将多个应用分组放到一个虚拟机中,当使用容器时,能够让每个应用运行在自己的容器中,最终结果就是可以在同一台裸机上运行更多的应用。

April 17, 2024

Docker 底层实现

基本架构 Docker 采用了 C/S 架构,包括客户端和服务端。Docker 守护进程作为服务端接收来自客户端的请求,并处理这些请求(创建、运行、分发容器等)。 客户端和服务端可以运行在一个机器上,也可以通过 socket 或者 RESTful API 来进行通信。 Docker 守护进程一般在宿主机后台运行,等待接收来自客户端的请求。 Docker 客户端则为用户提供了一系列命令,用户可以使用这些命令来与 Docker 守护进程进行交互。 命名空间 命名空间是 Linux 内核一个强大的特性。每个容器都有自己独立的命名空间,运行在其中的应用都像是在独立的系统中运行一样。命名空间保证了容器之间彼此隔离,不会相互影响。 PID 命名空间 不同用户的进程就是通过 PID 命名空间来隔离的,且不同命名空间中的进程 ID 可以相同。所有 LXC 进程都是 Docker 守护进程的子进程,每个 LXC 进程具有不同的命名空间。同时由于允许嵌套,可以实现容器内运行容器的功能,提供更灵活的部署方式。 LXC: Linux Container,是一种操作系统级别的虚拟化技术。 NET 命名空间 网络隔离通过 NET 命名空间实现,每个 NET 命名空间都有自己的网络设备、IP 地址、路由表、防火墙规则等。这样就可以实现容器之间的网络隔离。Docker 默认使用 Veth 的方式,将容器中的虚拟网卡同 Host 上的一个 Docker 网桥 docker0 相连。 IPC 命名空间 在容器中,进程间通信(IPC)采用了 Linux 中常见的方式,如信号量、消息队列和共享内存等。与虚拟机(VM)不同,容器内的进程实际上是运行在宿主机(Host)上,并共享相同的进程 ID(PID)命名空间。因此,在申请 IPC 资源时,需要加入命名空间信息以区分不同容器。每个 IPC 资源都有一个唯一的 32 位标识符(ID)。 IPC: Inter-Process Communication,进程间通信。...

March 20, 2024