Docker容器有以下3个特点:
1. 轻量级
2. 开放: Docker 容器基于开放标准,这使得Docker容器可以运行在主流Linux 发行版和Windows操作系统上。
3. 安全
容器包含用户的程序和所有的依赖,但是容器之间是共享Kernel 的。各个容器在宿主机上互相隔离,并且在用户态下运行。
Docker 容器加速开发效率
1. 加速开发:再也不用等待数小时设置开发环境,可以方便地使生产环境的代码在本地跑起来。
2.消除环境不一致。
利用容器合作开发:
Docker镜像 可以储蓄到Docker Hub, Docker Store 中;
利用容器快速扩容:
他可以在需要的时候快速扩容出大量的应用程序,扛住并发的压力。
基础技术
Linux Namespace 介绍
Linux Namespace 是Kernel 的一个功能,他可以隔离一系列的系统资源,比如 PID, UserID, Network等。
很多人会想到一个命令chroot,就像chroot 允许把当前目录变成根目录一样(被隔离出来);
用途/例子: 一个公司向外界出售自己的计算资源。在公司有一台还不错的服务器,每个用户买一个tomcat 实例来运行他们自己的应用。怎么保证各个客户不会相互干扰。这时候Linux Namespace 就派上用场了。
除了User Namespace ,PID也是可以被虚拟的。从用户的角度来看,每一个命名空间应该像一台单独的计算机一样,有自己的init进程(PID为1)其他进程的PID依次递增。 图 todo;
当前Linux 一共实现了6种不同类型的Namespace。
Mount Namespace ; UTS Namespace; IPC Namespace; PID Namespace; Network Namespace; User Namespace;
Namespace 的 API 主要使用如下3个系统调用。
clone() 创建新进程
unshare() 将某个进程移除某个Namespace
setns() 将进程加入到Namespace 中。
UTS Namespace : 主要用来隔离 nodename, domainname 两个系统标识。
IPC Namespace : 用来隔离System V IPC 和 POSIX message queues.
PID Namespace :是用来隔离进程ID的, 同一个进程 在不同的 PID Namespace 里 可以拥有不同的 PID。 即 在 docker container里边使用ps -ef 经常会发现, 在容器内,前台运行的那个进程PID 是1,在容器外,使用ps -ef 会发现同样的进程 却有不同的PID,这就是PID Namespace 做的事情。
Mount Namespace : 用来隔离各个进程看到的挂载点视图
Network Namespace: 可以让每个容器都有自己独立的网络设备。而且不同容器上的应用可以使用相同的端口。
Linux Cgroups 介绍
构建Linux 容器的Namespace 技术,它帮助进程隔离出自己单独的空间,但Docker是怎么限制每个空间的大小,保证它们不会相互争抢呢? 这就要用到Linux的 Cgroups技术。
Linux Cgroups (Control Groups) 对一组进程及将来的子进程 的资源 进行限制。这些资源包括 CPU, 内存, 储蓄, 网络等。
通过Cgroups 可以方便地限制某个进程的资源占用,并且可以实时地监控和统计进程信息。
Cgroups 中的三个组件:
cgroup : 将一组进程和一组subsystem 的系统参数关联起来
subsystem :
查看Kernel 支持的 subsystem : lssubsys -a
cpuset, blkio, memory, devices, freezer, perf_event
hierarchy : 它的功能是把一组cgroup 串成一个树状的结构,一个这样的树便是 一个 hierarchy。 通过这种树结构,Cgroups 可以做到继承。
例如: 系统对一组定时的任务进程通过 cgroup1 限制了 cpu 的使用率, 然后有一个定时dump日志 的进程还需要限制磁盘IO, 就可以创建cgroup2, cgroup2继承cgroup1。
Docker 是如何使用Cgroups 的
Docker 通过为每个容器创建cgroup,并通过cgroup 去配置资源限制和资源监控
Union File System
简称UnionFs, 把其他文件操作系统联合到一个联合挂载点的文件系统服务。这些文件系统是 read-only 或 read-write的,
所以当对这个虚拟的联合文件系统 进行写操作 时候,系统其实是写到了一个新的文件中的。 其中用到了 写时复制(copy-on-write) 思想.
AUFS 英文全称是 Advanced Multi-Layered Unification Filesystem。 AUFS 重写了 早期的 UnionFS 1.x,并且引入了新的功能。
Docker 是如何使用AUFS的。
AUFS 是Docker 选用的第一种存储驱动。