一、Docker简介
1.什么是容器?
容器 是一种 软件打包 技术
容器 是对 进程 进行 隔离
2.容器的生态
3.什么是Docker?
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中, 然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的英文本意是“搬运工”,在程序员的世界里,Docker搬运的是集装箱(Container),集装箱里装的是任意类型的App,开发者通过Docker可以将App变成一种标准化的、可移植的、自管理的组件,可以在任何主流系统中开发、调试和运行。
说白了,docker是一种用了新颖方式实现的轻量级虚拟机,类似于VM,但是在原理和应用上和VM的差别还是很大的,并且docker的专业叫法是应用容器(Application Container)。
需要额外指出的是,Docker并不等于容器(containers),Docker只是容器的一种,其他的种类的容器还有Kata container,Rocket container等等。
二、基本原理
Docker 利用Linux中的核心分离机制,例如Cgroups,以及Linux的核心Namespace(命名空间)来创建独立的容器。
一句话概括起来 Docker 就是利用 Namespace 做 资源隔离,用 Cgroup 做 资源限制,利用 Union FS 做 容器 文件系统 的 轻量级 虚拟化
Docker容器的本质还是一个直接运行在宿主机上面的特殊进程,看到的文件系统是隔离后的,但是操作系统内核是共享宿主机OS,所以说Docker是轻量级的虚拟化技术。
1.namespace技术(资源隔离)
namespace:是Linux内核提供的一种 资源隔离 的机制
Linux Namespace 主要有6种命名空间: Mount Namespace,UTS Namespace, IPC Namespace, PID Namespace, Network Namespace, User Namespace, Cgroup Namespace
详情请看下表:
2.cgroups技术(资源限制)
上面已经讲过Docker 容器运行起来是一个直接运行在宿主机上面的进程,那么如果限定每个容器最多消耗多少CPU资源呢?
如果一个容器疯狂的消耗资源岂不是会影响同一宿主机上面其他的容器?所以Docker就需要一个限制容器能够使用资源上限的机制,那就是Linux Cgroup技术。
Linux Cgroup 全称是Linux Control Group。它最主要的作用是限制一个进程组能够使用的资源上限,包括CPU,MEM,DISK,NET等等。
3.Union FS(文件系统)
每个容器运行起来后都有一个独立的文件系统,例如Ubuntu镜像的容器能够看到Ubuntu的文件系统,Centos能够看到Centos的文件系统,
不是说容器是运行在宿主机上面的进程吗,为什么能够看到和宿主机不一样的文件系统呢?那就要归功于Union FS,全称是Union File System,联合文件系统。
将多个不同位置的目录联合挂载到同一个目录,将相同的部分合并。Docker利用这种联合挂载能力,将容器镜像里面的多层内容呈现为统一的rootfs(根文件系统),
即root用户能够看到的根目录底下所有的目录文件。rootfs打包了整个操作系统的文件和目录,是应用运行时所需要的最完整的“依赖库”,也就是我们说的“镜像”。
镜像 分为基础镜像只读层、Init层,以及 读写层。
Init 层:存放的是/etc/hostname,/etc/resolv.conf 等, docker commit的时候不提交。
读写层:一开始的时候为空,用户如果修改了文件系统,比如说增删改了文件,docker commit的时候就会提交这一层信息。
总结:Docker容器Namespace 做 资源隔离,Cgroup 做 资源上限限制,rootfs 做 文件系统 运行在宿主机上面的一个特殊进程。
三、容器VS虚拟机
1.容器与虚拟机区别
如果将计算机的层次做一下简单的划分,最底层是硬件,最上层是软件,中间是操作系统。
我们非常熟悉的虚拟机,就是一个物理硬件层抽象,运行在硬件之上,它向下面对一套硬件和硬件接口,对其进行虚拟,然后向上提供一套独立的操作系统,然后就可以在操作系统之上再运行各种软件应用等。
这就使得虚拟机这个东西非常庞大沉重,因为包含了一整套操作系统,一般都好几G,还可能有一套单独的存储空间,启动时间长,一般几分钟,有SSD不算,并且不容易移植,
因为我们知道,在安装操作系统的时候,会根据硬件的不同编译出不同的内核,而每台电脑的硬件配置几乎不会完全一样,因而直接把一台电脑的操作系统文件考到另一台一般是没法启动的。
而容器是一个应用层抽象,运行在操作系统之上的,确切地说是操作系统内核之上,面对的是操作系统提供的接口,属于进程级别;容器对我们的代码和依赖进行打包,比如一个docker中只有一个python3,还有TensorFlow以及其他的package
这样体积就很小,启动快,只需几秒or几毫秒,且容易移植(不同硬件上的同一操作系统向上提供相同的接口)。
2.为什么Docker比虚拟机更加轻量?
容器:是一个应用层抽象,用于将代码和依赖资源打包在一起,多个容器可以在同一台机器上运行,共享操作系统内核,
但各自作为独立的进程在用户空间中运行,与虚拟机相比,容器占用的空间较少,瞬间便能完成启动。
虚拟机:是一个物理硬件层抽象,用于将一台服务器变成多台服务器,管理程序允许多个虚拟机在一台机器上运行,但每个虚拟机都包含一整套操作系统,
一个或多个应用,必要的二进制文件和资料库。因此占用大量空间,而且虚拟机启动也十分缓慢。
四、Docker的优势
1.更快速的交付和部署
Docker在整个开发周期都可以完美的辅助你实现快速交付。Docker允许开发者在装有应用和服务本地容器做开发。可以直接集成到可持续开发流程中。
例如:开发者可以使用一个标准的镜像来构建一套开发容器,开发完成之后,运维人员可以直接使用这个容器来部署代码。
Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
2.高效的部署和扩容
Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。
Docker的兼容性和轻量特性可以很轻松的实现负载的动态管理。你可以快速扩容或方便的下线的你的应用和服务,这种速度趋近实时。
3.更高的资源利用率
Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。
传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。
4.更简单的管理
使用 Docker,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。
容器的特点:秒级部署、轻量级、易于移植、弹性伸缩
五、Docker引擎
docker引擎是一个c/s结构的应用,主要组件见下图:
- Server是一个常驻进程
- REST API 实现了client和server间的交互协议
- CLI 实现容器和镜像的管理,为用户提供统一的操作界面
六、Docker架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。
Docker容器 通过 Docker镜像 来创建。容器与镜像的关系类似于面向对象编程中的对象与类。
Docker组成:
Docker Client #客户端
Docker Deamon #守护进程
Docker Image #镜像
Docker Container #容器
Docker Registry #仓库
当使用docker run命令启动一个容器时,它究竟是如何工作的?
七、Docker三大核心概念与基础命令
Docker三大核心概念:镜像(Image) 、容器(Container) 、库(Repository)
八、镜像 Image
1.镜像的核心原理
2.镜像的分层结构
3.镜像的构建