简介
介绍
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker用Go语言编写,并利用Linux内核的多个功能来实现其功能。我们可以把他看成没有内核只有文件系统的Linux。
组成
下图是从官网截取的Docker组成图。
1. Client
Docker客户端,是用户与Docker守护进程交互的主要方式。当使用docker run
这类命令时,客户端会将这些命令发送到Docker守护进程,来执行这些命令。Docker客户端可以与多个守护进程通信。
2. Daemon
Docker守护进程,用于监听Docker API请求并管理Docker对象,例如镜像,容器,网络和卷。守护进程还可以与其他守护进程通信来管理Docker服务。用过HDFS的同学应该可以发现,HDFS这一点和Docker相似。
3. Containers
容器是独立运行的一个或一组应用,是镜像运行时的实体。容器之间是相互隔离的,底层使用的是Linux的namespace和cgroups。
4. Images
Docker 镜像是用于创建 Docker 容器的只读模板,我们可以创建自己的镜像,也可以使用其他人在仓库中发布的镜像。
5. Registry
Docker仓库存储Docker映像。Docker Hub是公共仓库,任何人都可以使用,并且默认情况下,Docker的默认配置是在Docker Hub上查找映像。我们可以搭建自己的Docker镜像仓库。这个和Maven很类似,由中央仓库也可以搭建私服。
底层
命名空间
Docker使用一种称为namespaces
提供容器的隔离工作区的技术。运行容器时,Docker会为该容器创建一组namespaces
。这些namespaces
提供了一层隔离。容器的每个方面都在单独的namespaces
中运行,它的访问仅限于该名称空间。
Docker引擎在Linux上使用以下名称空间:
pid
命名空间:进程隔离(PID:进程编号的隔离)。net
命名空间:管理网络接口(NET:网络的隔离)。ipc
命名空间:管理访问IPC资源(IPC:进程间通信的隔离)。mnt
命名空间:管理文件系统挂载点(MNT:文件系统的隔离)。uts
命名空间:隔离内核和版本标识符,使其在网络上可以被视作一个独立的节点而非Host上的一个进程。(UTS:Unix时间共享系统的隔离)。
对照组
cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup目录下新建一个文件夹即可新建一个group,在此文件夹中新建task文件,并将pid写入该文件,即可实现对该进程的资源控制。