参考: https://www.cnblogs.com/guarderming/p/9455838.html(docker基础:隔离机制)
https://blog.csdn.net/i042416/article/details/85161108
https://blog.csdn.net/cbl709/article/details/43955687(虚拟机和容器对比)
https://www.cnblogs.com/sparkdev/p/9129334.html(docker组件和工作原理)
docker本身不是容器,容器的思想起源于lxc,docker是把lxc所实现的功能做成更易于使用的接口提供给用户。
容器和虚拟机对比:
虚拟机:每个虚拟机使用不同的内核,完全隔离,看上去就跟普通机器没什么两样。优点:隔离性好 缺点:占用资源太多
容器:每个容器使用相同宿主机内核和一些底层的环境。 优点:极大地节约资源,性能更好 缺点:较为复杂
容器的基础:隔离
容器的思想有点类似同一主机上,两个进程的隔离,比如linux的chroot命令,可以使进程限制在固定目录,除此之外跟隔离相关的功能,还有namespace和cgroup
namespace:
UTS:主机及域名
IPC:信号量,消息列队及共享内存
Pid:进程编号
Network:网络设备,网络协议栈,端口等
Mount:挂载点,文件系统(四种挂载方式:私有挂载,主从挂载,shell型挂载,不可绑定挂载)
User:用户和组 (内核3.8版本才支持,所以contos系列跑docker最好用7以上版本)
Cgroup(并不是完整限制,而是优先级)
硬件资源限制(cpu用量,mem内存用量,disk硬盘用量)
特征:
1\cgroup以伪文件系统进行管理
2\cgroup颗粒度线程级别
3\所有的资源管理都叫subsystem
4\子进程和父进程同属同一个cgroup
5\实现方式内核附加hooks
作用:
1、 资源限制
2、 优先级分配
3、 资源统计
4、 进程控制——挂起/恢复
术语:
Task:任务。表示系统的一个进程
Cgroup:控制组。按照某个资源控制标准划分组。包含一个或多个子系统。
Subsystem:资源调度器。具体的限制措施
Hierarchy: 层级树。放置多个cgroup
基本规则:
1、 同一个hierarchy可以附加一个或者多个subsystem
2、 一个已经附加在某个hierarchy上的subsystem不能附加到某个其他含有别的subsystem的hierarchy。
3、 一个task不能属于同一个hierarchy的不同cgroup,但能属于另外一个hierarchy的cgroup
4、 刚fork出的子进程在初始状态与其父进程处于同一个cgroup
Cgroup查看命令
Yum -y install libcgroup //cgroup的工具集
Lssubsys:查看计算机有哪些子系统
Lscgroup:查看当前系统有多少个cgroup
Lssubsys -m memory :查看子进程在哪里
容器功能的实现起源于lxc(linux container),在docker中则用runc实现,关于docker各组件的功能和工作流程,推荐看:https://www.cnblogs.com/sparkdev/p/9129334.html,这里摘要部分重点
容器镜像的下载是由 dockerd 完成的,但容器的创建和运行就需要 containerd(docker-containerd) 来完成了。Dockerd 与 docker-containerd 之间是通过 grpc 协议通信的。当 docker-containerd 收到 dockerd 启动容器的请求之后,会做一些初始化工作,然后启动 docker-containerd-shim 进程,并将相关配置作为参数传给它。docker-containerd 负责管理所有本机正在运行的容器,而一个 docker-containerd-shim 进程只负责管理一个运行的容器,它相当于 docker-runc 的一个封装,充当 docker-containerd 和 docker-runc 之间的桥梁,docker-runc 能干的就交给 docker-runc 来做,docker-runc 做不了的就放到这里来做。
docker yum 源:wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
安装docker: yum install docker-ce -y
运行docker(hello-world镜像为例):docker run hello-world
一个hello-world 容器的运行经历了如下四步:
1.Docker 客户端向 docker daemon 发送请求
2.Docker daemon 从 Docker Hub 上拉取镜像
3.Docker daemon 使用镜像运行了一个容器并产生了输出
4.Docker daemon 把输出的内容发送给了 docker 客户端