镜像与容器:
镜像是一个executable package,它包括一个应用程序允许所需的所有内容(代码、库、环境变量、配置文件等)
容器:
A container is launched by running an image.
A container is a runtime instance of an image.
容器与虚拟机:
Kernel:连接操作系统和硬件的一个中间组件;
VM:一个虚拟机运行一个完整的操作系统,通过Hypervisor对主机资源进行虚拟访问,每个虚机中都有一个独立的内核;
Container:所有容器运行在原生的Linux系统上,并共享同一个内核,不管有多少个容器,都只有一个操作系统和一个内核;
结论:VM会比容器消耗更多的资源
VM1 VM2
____↑____ ____↑____
| App1 | | App2 | Container1 Container2
|Bins/Libs| |Bins/Libs| ____↑____ ____↑____
|---------| |---------| | App1 | | App2 |
|Guest OS | |Guest OS | |Bins/Libs| |Bins/Libs|
----------------------- -----------------------
| Hypervisor | | Docker Engine |
----------------------- -----------------------
| Host OS | | Host OS |
----------------------- -----------------------
| Infrastructure | | Infrastructure |
----------------------- -----------------------
Virtual Machine Docker
容器实现:
Docker 是基于 LXC(LinuX Container) 实现的。简单说,就是Docker利用Linux内核的NameSpace与CGroups特性,实现的一种轻量级的内核虚拟化技术。
LXC 本身只是一个工具集,用于管理容器,真正的实现是靠Linux内核的相关特性(如namespace和cgroup),LXC项目只是对此做了整合。LXC 借助于namespace的隔离机制和cgroup限额功能,提供了一套统一的API和工具来建立和管理container。
Namespace:隔离资源
LXC利用kernel namespace来隔离每个容器实例环境,每个容器使用的资源互不影响。
namespace定义的隔离资源包括:
PID NameSpace:Linux kernel 2.6.24,进程隔离
Network NameSpace:Linux kernel 2.6.29,网络设备、网络栈、端口等网络资源隔离
User NameSpace:Linux kernel 3.8,用户和用户组资源隔离
IPC NameSpace:Linux kernel 2.6.19,信号量、消息队列和共享内存的隔离
UTS NameSpace:Linux kernel 2.6.19,主机名和域名的隔离;
Mount NameSpace:Linux kernel 2.4.19,挂载点(文件系统)隔离;
centos6 版本不能使用容器原因是,centos6 内核版本是2.6,容器需要的User NameSpace,直到内核3.8版本才有。
CGroups:控制资源
即Control groups, 它实现了对资源的配额和度量,LXC利用 CGroups 来限制或控制容器使用的系统资源。