1、容器(Container)
- 容器是一种基础工具:泛指任何可以用于容纳其他物品的工具,可以部分或全部封闭,被用于容纳、储存、运输物品;物体可以被放置在容器中;而容器则可以保护内容物;
- 人类使用容器的时间已有数万年
2、传统虚拟化与容器的区别
虚拟化分为两类:
- 主机虚拟化(全虚拟、半虚拟)
- 容器虚拟化
容器分离开的资源:
- UTS(主机名与域名)
- Mount(文件挂载)
- IPC
- PID进程树
- User
- Network(tcp/Ip协议栈)
Linux容器技术
Linux容器并非新概念。最早的容器技术可以追溯到1982年Unix系列操作系统上的chroot工具
LInux Namepaces
命名空间(Namepaces)是Linux内核针对实现容器虚拟化而引入的一个强大特性
每个容器都可以拥有自己独立的命名空间,运行其中的应用都像是在独立的操作系统中运行的一样。命名空间保证容器之间互不影响。
namepaces | 系统调用参数 | 隔离内容 | 内核版本 |
---|---|---|---|
UTS | CLONE_NEWUTS | 主机名和域名 | 2.6.19 |
IPC | CLONE_NEWIPC | 信号量、消息队列和共享内存 | 2.16.19 |
PID | CLONE_NEWPID | 进程编号 | 2.6.24 |
Network | CLONE_NEWNET | 网络设备、网络栈、端口等 | 2.6.19 |
User | CLONE_NEWUSER | 用户和用户组 | 3.8 |
CGroups
控制组(CGroups)是Linux内核的一个特性,用来对共享资源进行隔离、限制审计等。只能控制分配到的容器资源,Docker才能避免多个容器同时运行时强资源。
控制组可以提供对容器的内存、CUP、磁盘IO等资源经行限制。
CGroups能够限制的资源有:
- bikio:块设备
- cpu: CPU
- cpuacct: CPU资源使用报告
- cpuset:多处理器平台上的CPU集合
- devices:设备访问
- freezer: 挂起或恢复任务
- memory:内存使用报告
- pert_event: 对cgroup中的任务经行统一性测试
- net_cls: cgroup中的任务创建的数据报文的类别标识符
具体看来,控制组提供如下功能: - 资源限制组可以设置为不超过设定的内存限制
- 优先级(Prioritization)通过优先级让一些组优先得到更多的CPU等资源
- 资源审计(Accounting)用来统计系统实际上把多少资源用到合适的目的上,可以使用cpuacct子系统记录某那个进程组使用cpu时间
- 隔离(lsolation)为组隔离命名空间,这样一个组不会看到另一个组的进程、网络连接和文件系统
- 控制(Control)挂起、恢复和重启等操作
安装Docker后,用户可以在/sys/fs/cgroup/memory/docker查看各种限制项,包括
cgroup.clone_children memory.kmem.tcp.max_usage_in_bytes memory.oom_control
cgroup.event_control memory.kmem.tcp.usage_in_bytes memory.pressure_level
cgroup.procs memory.kmem.usage_in_bytes memory.soft_limit_in_bytes
memory.failcnt memory.limit_in_bytes memory.stat
memory.force_empty memory.max_usage_in_bytes memory.swappiness
memory.kmem.failcnt memory.memsw.failcnt memory.usage_in_bytes
memory.kmem.limit_in_bytes memory.memsw.limit_in_bytes memory.use_hierarchy
memory.kmem.max_usage_in_bytes memory.memsw.max_usage_in_bytes notify_on_release
memory.kmem.slabinfo memory.memsw.usage_in_bytes tasks
memory.kmem.tcp.failcnt memory.move_charge_at_immigrate
memory.kmem.tcp.limit_in_bytes memory.numa_stat
LXC
传统方式使用容器功能的话需要我们自己写代码去进行系统调用来实现创建内核,实际上拥有此能力的人寥寥无几。而LXC(LINUX Container)把容器技术做的更加易用,把需要用到的容器功能做成一组工具,从而极大的简化用户使用容器技术的麻烦程度。
LXC是最早一批真正把完整的容器技术用一组简易使用的工具和模板来极大的简化了容器技术使用的一个方案。
LXC虽然极大的简化了容器技术的使用,但比起直接通过内核来使用虚拟技术,其复杂程度本没有多大的降低,因为我们必须学会LXC的一组命令工具,由于内核的创建都是通过内核来实现,通过批量命令实现数据迁移并不容易。其隔离性也没有虚拟机那么强大。
后来出现docker,所以从一定程度上来说,docker就是LXC的增强版。
docker的概念
Docker是一个开源的容器项目,基于go语言开发。之所以被称为容器技术,是因为docker对进程进行封装,隔离于宿主系统和其它的进程,类似于一个装东西的容器,而且在容器里面装有一系列文件系统、网络、依赖包等应用程序运行需要的环境,开发人员可以快速将他们的应用程序部署到容器内运行。容器技术属于操作系统层面的虚拟。
docker的优劣:
- 删除一个容器不会影响另一个
- 调试不方便,占空间
- 分发容易
- 部署容易
- 分层构建,联合挂载
docker容器的编排
假如我们要搭建lamp架构的时候,他们之间会有依赖关系。哪个先启动哪个后启动我们都要编排好,按一定程序来走。docker自身没有这种功能,所以我们需要一个在docker的基础上能够把这种应用程序之间的依赖关系、从属关系、隶属关系等反映启动、关闭时的次序和管理逻辑中,这种功能称之为容器编排
常见的容器编排工具:
- machine+swarm
- k8s
- mesos