Docker学习 - 核心原理的解读
Docker 容器本质上是宿主机上的进程,通过namespace实现了资源的隔离,通过cgroups实现了资源限制,通过写时复制机制(copy-on-write)实现了高效的文件操作。
Docker的核心概念
Docker的三大核心概念
-
镜像
Docker镜像类似于虚拟机镜像,可以将其理解为一个面向Docker引擎的只读模板,包含了文件系统。 -
容器
Docker容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以将其启动、开始、停止、删除。而这些容器都是相互隔离,互不可见的。 -
仓库
Docker 仓库类似于代码仓库,是Docker集中存放镜像的场所。最大的公开仓库是Docker Hub,存放了数量庞大的镜像供用户下载。
Docker的两个主要部件
- Docker: 开源的容器虚拟化平台
- Docker Hub:用于分享、管理Docker容器的Docker SaaS平台
Docker 使用客户端-服务器 (C/S) 架构模式。Docker 客户端会与 Docker 守护进程进行通信。Docker 守护进
程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在
同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守
护进程之间通过 socket 或者 RESTful API 进行通信。
资源隔离
namespace资源隔离
在linux系统中,可以同时存在多个用户和多个进程,对于这些用户和进程的运行进行协调管理,通过进程调度和进程管理即可解决,但是整体资源是有限的,怎么样把有限的资源(进程号,通信资源,网络资源等)合理分配给各个用户所在进程是需要进行考虑和设计的。linux中提出了namespace的机制,这是一种轻量级的虚拟化形式。在此之前,Linux系统中很多资源都是全局管理的,例如,系统中所有进程都是通过PID来进行标识的,就像是每个学生的学号一样,在整个学校范围内,肯定是唯一标识这个学生的。用户的ID管理,各个用户通过全局UID来标识。随着大数据的兴起,Linux为了提供更加精细的资源分配管理机制,给出了namespace的机制解决方法。根据linux内核对命名空间的划分,可以分为以下几个namespace.
namespace | 系统调用参数 隔离内容
UTS | CLONE_NEWUTS 主机名与域名
PID | CLONE_NEWPID 进程编号
Network | CLONE_NEWNET 网络设备、网络栈、端口等
Mount | CLONE_NEWS 挂载点
User | CLONE_NEWUSER 用户和用户组
有了以上 6 种 namespace 从进程、网络、IPC、文件系统、UTS 和用户角度的隔离,一个 container 就可以对外展现出一个独立计算机的能力,并且不同 container 从 OS 层面实现了隔离。 然而不同 namespace 之间资源还是相互竞争的,仍然需要类似 ulimit 来管理每个 container 所能使用的资源 --- cgroup。