Docker基本原理与基础概念

简介

Docker是一个开放源代码软件项目,让应用程序布署在软件容器下的工作可以自动化进行,借此在Linux操作系统上,提供一个额外的软件抽象层,以及操作系统层虚拟化的自动管理机制。
Docker利用Linux核心中的资源分离机制,例如cgroups,以及Linux核心名字空间(name space),来创建独立的软件容器(containers)。这可以在单一Linux实体下运作,避免启动一个虚拟机造成的额外负担。Linux核心对名字空间的支持完全隔离了工作环境中应用程序的视野,包括进程树、网络、用户ID与挂载文件系统,而核心的cgroup提供资源隔离,包括CPU、存储器、block I/O与网络。从0.9版本起,Dockers在使用抽象虚拟是经由libvirt的LXC与systemd - nspawn提供界面的基础上,开始包括libcontainer库做为以自己的方式开始直接使用由Linux核心提供的虚拟化的设施,

Docker特点

  • 灵活:即使是最复杂的应用也可以集装箱化。
  • 轻量级:容器利用并共享主机内核。
  • 可互换:即时部署更新和升级。
  • 便携式:在本地构建,部署到云,并在任何地方运行。
  • 可扩展:增加并自动分发容器副本。
  • 可堆叠:垂直和即时堆叠服务。

容器和虚拟机

容器和虚拟机具有类似的资源隔离和分配优势,但功能不同,因为容器虚拟化操作系统而不是硬件。容器更便携,更高效。
在这里插入图片描述

容器是应用层的抽象,它将代码和依赖关系打包在一起。多个容器可以在同一台机器上运行,并与其他容器共享操作系统内核,每个容器在用户空间中作为独立进程运行。容器占用的空间比VM少(容器映像的大小通常为几十MB),可以处理更多的应用程序,并且需要更少的VM和操作系统。

虚拟机(VM)是物理硬件的抽象,将一台服务器转变为多台服务器。虚拟机管理程序允许多台虚拟机在一台计算机上运行。每个VM都包含操作系统的完整副本,应用程序,必要的二进制文件和库 - 占用数十GB。虚拟机也可能很慢启动。

Docker的三大组件

镜像(Image)

通过运行镜像启动容器。镜像是一个可执行包,包含运行应用程序所需的所有内容 - 代码,运行时,库,环境变量和配置文件。Docker 运行容器前需要本地存在对应的镜像,如果本地不存在该镜像,Docker 会从镜像仓库
下载该镜像

容器(container)

容器是图像的运行时实例,

仓库(Repository)

存放镜像的地方,一个容易混淆的概念是注册服务器(Registry ) 。实际上注册服务器是管理仓库的具体服务
器,每个服务器上可以有多个仓库,而每个仓库下面有多个镜像。从这方面来说,仓库可以
被认为是一个具体的项目或目录。例如对于仓库地址 dl.dockerpool.com/ubuntu 来说, dl.dockerpool.com 是注册服务器地址, ubuntu 是仓库名。

我们来看一个图简单说明一下三者之间的关系
在这里插入图片描述

  1. 基于镜像创建容器(run),也可以基于容器制作镜像(commit)
  2. 从远端仓库拉取镜像(pull),将本地镜像推送到远端(push)

Docker底层实现

基本架构

Docker 采用了 C/S 架构,包括客户端和服务端。Docker 守护进程 (Daemon ) 作为服务端接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)
Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息。
Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker 守护进程交
互。
默认情况下,Docker守护程序侦听UNIX套接字上的连接以接受来自本地客户端的请求。通过将Docker配置为侦听IP地址和端口以及UNIX套接字,可以允许Docker接受来自远程主机的请求。

命名空间(Namespace)

命名空间是 Linux 内核一个强大的特性。每个容器都有自己单独的命名空间,运行在其中的应用都像是在独立的操作系统中运行一样。命名空间保证了容器之间彼此互不影响。

  1. pid 命名空间
    pid命名空间隔离进程id号,这意味着不同pid命名空间中的进程可以具有相同的pid。允许嵌套,因此可以很方便的实现嵌套的 Docker 容器
  2. net 命名空间
    网络隔离是通过 net 命名空间实现的, 每个 net 命名空间有独立的 网络设备, IP 地址, 路由表, /proc/net 目录。这样每个容器的网络就能隔离开来。Docker 默认采用 veth 的方式,将容器中的虚拟网卡同 host 上的一 个Docker 网桥 docker0 连接在一起。
  3. ipc 命名空间
    容器中进程交互还是采用了 Linux 常见的进程间交互方法(interprocess communication - IPC),包括信号量、消息队列和共享内存等。然而同 VM 不同的是,容器的进程间交互实际上还是host 上具有相同 pid 命名空间中的进程间交互,因此需要在 IPC 资源申请时加入命名空间信息,每个 IPC 资源有一个唯一的 32 位 id。
  4. mnt 命名空间
    类似 chroot,将一个进程放到一个特定的目录执行。mnt 命名空间允许不同命名空间的进程看到的文件结构不同,这样每个命名空间 中的进程所看到的文件目录就被隔离开了。同chroot 不同,每个命名空间中的容器在 /proc/mounts 的信息只包含所在命名空间的 mountpoint。
  5. uts 命名空间
    UTS(“UNIX Time-sharing System”) 命名空间允许每个容器拥有独立的 hostname 和 domainname, 使其在网络上可以被视作一个独立的节点而非 主机上的一个进程。
  6. user 命名空间
    每个容器可以有不同的用户和组 id, 也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户

控制组(cgroups)

控制组(cgroups) 是 Linux 内核的一个特性,主要用来对共享资源进行隔离、限制、审计等。只有能控制分配到容器的资源,才能避免当多个容器同时运行时的对系统资源的竞争。控制组可以提供对容器的内存、CPU、磁盘 IO 等资源的限制和审计管理。命名空间主要是实现了系统资源的隔离,而cgroups则是负责资源的分配

联合文件系统

在这里插入图片描述
Docker采用了分层构建的机制,最底层为bootfs,在此之上为rootfs

  • bootfs主要是用于系统引导的文件系统,一旦引导完成就会将bootfs这一层卸载掉,它的存活时间非常短。

  • rootfs表现为Docker容器的根文件系统,传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读”模式,完整性自检完成后将其重新挂载为读写模式;docker中,rootfs由内核挂载为“只读”模式,而后通过“联合挂载 ”技术额外挂载一个“可写”层;

在这里插入图片描述
启动一个容器的时候,Docker会在镜像上附加一层可写层,顶层以下都只是可读,这时候用户删除底层文件,并不是真正删除而只是标记为不可见,但是实际上文件在底层还是存在的。如果用户需要修改底层文件,Docker将底层文件复制到顶层让你进行修改,同时底层文件也是存在的,只是当你读修改后的文件的时候指向的位置是顶层而不是原来的底层文件了。

图片全部来自网上,如有侵权,联系作者删除
qq:835311324
参考链接

猜你喜欢

转载自blog.csdn.net/L835311324/article/details/84490222