关于docker的个人理解
过去几天在学习docker和kubernetes,分享下自己的理解,大家和谐交流

首先来个灵魂三问
1、什么是docker
docker是一种容器引擎
那什么是容器?
容器 轻量级的虚拟化技术,将应用运行在内部,与外界隔离。
容器也是特殊的进程,通过namespace隔离运行边界。
什么又是虚拟化技术?
将计算机的各种实体资源(cpu、内存、网络、存储)进行抽象,形成有多个资源的假象。
本质是资源的抽象化,目的是为了充分利用资源。
容器和虚拟机有啥区别?
最大的区别是虚拟机需要虚拟出操作系统,容器直接使用宿主机的操作系统。如下图

2、为什么要使用docker
容器优点
1、移植方便 封装了运行程序必须的细节
2、标准化 基于开放标注,可以运行在主流的发行版操作系统上
3、安全 各个容器进程互不影响
4、轻量级 占用资源更少
容器缺点
既然容器只是运行在宿主机上的一种特殊的进程,那么多个容器之间使用的就还是同一个 宿主机的操作系统内核。
在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,如时间
3、如何使用docker
需要了解仓库、镜像、容器等三大概念
仓库是存放镜像的地方
镜像就是静态的文件系统
容器就是运行起来的应用
使用很简单,这里就不提了
4、docker如何实现资源隔离、资源管控、轻量级
Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法。
通过lxc自带的namespace实现资源隔离,包括六个方面
主机域名UTS、进程PID、进程间通信IPC、网络Network、存储Mount、用户User
通过lxc自带的controllerGroup即cGroup实现资源管控。
Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够 使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
/sys/fs/cgroup/
在具体的子系统下创建目录如/sys/fs/cgroup/cpu/container
操作系统会自动生成资源限制文件
修改cfs_quota限制运行时间,
docker在每个子系统下创建一个控制组,然后容器启动时将pid填写到tasks文件中
一个正在运行的 Docker 容器,其实就是一个启用了多个 Linux Namespace 的应用进程,而这个进程能够使用的资源量,则受 Cgroups 配置的限制。
就是 Mount Namespace 跟其他 Namespace 的使用略有不同的地方:它对容器进程视图的 改变,一定是伴随着挂载操作(mount)才能生效。
mount Namespace根据chroot改良的
容器镜像(rootfs根文件系统) 挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统
docker核心
1、启用linux namespace配置
2、设定指定cgroup参数
3、切换进程根目录(changeRoot)
每次都要制作rootfs?
通过联合文件系统UFS实现轻量级
将底层镜像lower作为只读层,每次往上层upper覆盖一个可写层。合并成merge层。
将多个层联合挂载在一个目录下
这样所有的容器都可以共用同一个操作系统镜像,节省大量存储空间。
rootfs包含三部分
1、只读层 即操作系统基础镜像
2、可读写层 删除是创建whiteout文件,将文件遮挡起来 存放修改rootfs后的增量
3、init层 基础镜像的一部分,但需要在启动容器时做修改,单独挂载
一个进程,可以选择加入到某个进程已有的 Namespace 当中,从而达到“进 入”这个进程所在容器的目的,这正是 docker exec 的实现原理。
Volume 机制,允许你将宿主机上指定的目录或者文 件,挂载到容器里面进行读取和修改操作。
dockerinit 会负责完成 根目录的准备、挂载设备和目录、配置 hostname 等一系列需要在容器内进行的 初始化操作。
/var/lib/docker/volumes/[VOLUME_ID]/_data