应用和应用的隔离,在操作系统上是通过namespace名称空间隔离来实现的,只有实现了下面6个层次的隔离,才能说应用A和应用B在物理上是隔离的。
PID 互相不干扰,独立
NET 网卡,协议栈也是独立的,应用A监听80端口,应用B一样也可以,这样才叫网络层面上是隔离的
IPC 进程间通信,应用A调用A内存,应用B调用B内存,应该是隔离的
MOUNT 文件系统,应用A看到应该是独立的文件系统
UTS 主机名和主机域 ,应用跑在容器里,应该有自己的主机名和域
USER 进程跑起来,linux系统里必须依赖用户,所以用户空间也是相互隔离的
**直到2007年的google,cgroup写入了linux内核,让操作系统内核可以控制应用程序可以使用独立的cpu资源,内存资源。2008年,对容器化有划时代意义的软件,LXC,linux container. **
**docker是基于容器技术的轻量级虚拟化解决方案,要用到容器技术来隔离,需要有6个层次的,PID
NET
IPC
MOUNT
UTS
USER **
左边是虚拟机实现的,右边是容器实现的,容器之间相互隔离,但是共享操作系统和它需要的适当的二进制工具和库文件
exec-opts :启动的时候一些额外参数,指定了cgroupdriver (google写到linux内核里的,关于cpu内存资源的控制组)指定了systemd
live-restore :当docker容器引擎死掉了,用docker引擎起来的容器还能活着,跑的容器的本身不依赖于引擎的死活
这个需要优化下内核
这就是容器启动最核心的原理
docker有三个核心理念,images镜像,container容器,repository仓库
下一个命令是docker search
建议用官方的
主要是镜像和仓库之间的操作关系
每一层镜像的下面一层称为其父镜像,真正的容器在最顶层。writeable就是可写的,可写的层才叫容器层。下面所有层都是readonly。
docker的镜像除了最上一层,其他都是只读的,所以就特别容易分层挂载,from base image派生很多镜像出来,当推送到仓库 时候,base image这一层有自己的image id的,不管往自建仓库推送,还是远程都是只推送增量部分,非常少。
生产中一个镜像加入1G,base image很大,但是每次变更的很小,其实也是很轻量,每次推拉就只是增量部分,这就是aufs最帮的优点