1.容器的介绍
容器是一种基础工具,可以部分或完全能封闭数据使其做到数据隔离的作用。
2.容器的发展
FreeBASE Jail --> Linux vserver --> LXC --> docker
开始:隔离一些功能,但是想使用还需用C语言其调用,所以想用好容器还需精通C语言
- chroot:完整的根系统(FHS)功能
- UTSCLONE_NEWUTS主机名与域名
- IPCCLONE_NEWIPC信号量、消息队列和共享内存
- PIDCLONE_NEWPID进程编号
- NetworkCLONE_NEWNET网络设备、网络栈、端口等
- MountCLONE_NEWNS挂载点(文件系统)
- UserCLONE_NEWUSER用户和用户组
LXC:
- 将功能封装方便做容器的生命周期
docker
- 镜像安装实现功能
3.容器一般隔离的什么功能
- chroot:完整的根系统(FHS)功能
- UTSCLONE_NEWUTS主机名与域名
- IPCCLONE_NEWIPC信号量、消息队列和共享内存
- PIDCLONE_NEWPID进程编号
- NetworkCLONE_NEWNET网络设备、网络栈、端口等
- MountCLONE_NEWNS挂载点(文件系统)
- UserCLONE_NEWUSER用户和用户组
4.容器为什么能够实现这些功能的隔离
容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。其中,Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。
-
1. Namespace 隔离
Linux Namespace是Linux提供的一种内核级别环境隔离的方法。Linux内核中提供了6种namespace隔离的系统调用,如下所示:(官方文档在这里Namespace in Operation)
namespace | 系统调用参数 | 隔离内容 |
---|---|---|
UTS | CLONE_NEWUTS | 主机名与域名 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 |
PID | CLONE_NEWPID | 进程编号 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 |
Mount | CLONE_NEWNS | 挂载点(文件系统) |
User | CLONE_NEWUSER | 用户和用户组 |
2. Cgroups 资源限制
通过linux namespace,我们已经能够创建出一个资源隔离的进程了,也就是所谓的“容器”,但这个“容器”尚不完整,还需要对其进行资源限制。为什么呢?这里通过PID namespace为例进行说明。
虽然容器内的第 1 号进程在“障眼法”的干扰下只能看到容器里的情况,但是从宿主机的角度来看,它作为第 100 号进程与其他所有进程之间依然是平等的竞争关系。这就意味着,虽然第 100 号进程表面上被隔离了起来,但是它所能够使用到的资源(比如 CPU、内存),却是可以随时被宿主机上的其他进程(或者其他容器)占用的。
5.传统虚拟化与容器的区别
- 传统虚拟化
传统虚拟化分为基于硬件和基于软件,软件中又分为应用虚拟化和平台虚拟化(包含虚拟技术),平台虚拟化中又分为完全虚拟化部分虚拟化。
传统的虚拟化是在硬件层面实现虚拟化:需要有额外的虚拟机管理应用和虚拟操作层。
需要硬件的支持,需要模拟硬件,可以运行不同的操作系统,启动时间分钟级(开机启动流程)
- 容器
共用宿主机内核,运行服务,损耗少,启动快,性能高
不需要硬件的支持。不需要模拟硬件,共用宿主机的内核,启动时间秒级(没有开机启动流程)
docker容器时在操作系统层面上实现需要虚拟化直接复用本地的操作系统。
最大的缺点就是隔离不彻底。
- 1)容器知识运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个宿主机的操作系统内核。
- 2)在Linux内核中,有很多资源和对象是不能被Namespace化的,最典型的例子是:时间,即如果某个容器修改了时间,那整个宿主机的时间都会随之修改。
- 3)容器给应用暴露出来的攻击面比较大,在生产环境中,没有人敢把运行在物理机上的Linux容器暴露在公网上。
下面是两者的差别解析:
6.docker的三大核心概念
- 镜像(image): 类似于虚拟机的快照,只能读不能写,每条命令都会产生一个层,层越少越好
- 容器(Container) : 轻量级的沙箱,docker利用容器来运行和隔离应用
- 仓库(Repository): 类似于代码仓库,放镜像文件的场所,仓库注册服务器(库)上有多个仓库,每个仓库可以放多个镜像,每个镜像都有不同的标签,运行多个容器。仓库分为私有仓库和公有仓库(最大的公有仓库hub.docker.com)不管是公有的还是私有的,都可以上传(push)下载(pull)镜像。
注意:镜像只能读,容器在启动时会创建一层可写层作为最上层。
三大核心关系:仓库(私有仓库和公有仓库)中保存着镜像,镜像运行起来的为容器。
如图所示:
7.docker的构想
实现:“Build ,Ship and Run Any App ,Any-Where”,及通过应用封装,分发,部署,运行的生命周期进行管理,达到“一次分装,到处运行”。
8.docker的优点
- 更加快捷的交付和部署
- 更加有效的资源利用
- 更加轻松的迁移和扩展
更加简单的更新和管理(涉及到dickerfile配置文件)
下一章,我们会有docker的安装