认识docker

栏目: 服务器 · Linux · 发布时间: 5年前

内容简介:本文学习总结自进程:程序运起来后的计算机执行环境的总和。容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。

本文学习总结自 极客时间 深入剖析Kubernetes

进程:程序运起来后的计算机执行环境的总和。

容器技术的核心功能,就是通过约束和修改进程的动态表现,从而为其创造出一个“边界”。

Cgroups 技术是用来制造约束的主要手段,而Namespaces 技术则是用来修改进程视图的主要方法。

Namespace

参考: man7 namespaces

将系统资源进行了一层抽象封装,使得在不同Namespaces 下的进程看到的系统资源都是相互独立的。

Linux提供的Namespaces:

  • Cgroup:Cgroup root directory
  • IPC:System V IPC, POSIX message queues
  • Network:Network devices, stacks, ports, etc
  • Mount:Mount points
  • PID:Process IDs
  • User:User and group IDs
  • UTS:Hostname and NIS domain name

Namespaces API系统调用:

  • clone:创建新的进程,并且可以将新的进程加入到新创建的Namespaces中
  • setns:将当前进程加入到已存在的Namespace中
  • unshare:将当前进程移动到新创建的Namespace中

CGROUP

参考:

Linux CGroups全称Linux Control Groups, 是 Linux 内核的一个功能,用来控制与监控一个进程组群的资源(如CPU、内存、磁盘输入输出等)。

内核的cgroup 接口暴露为cgroupfs的伪文件系统。

详细介绍文章: Linux的资源限制功能cgroups v1和cgroups v2的详细介绍

IPC

IPC namespace 用来隔离 System V IPC 对象和 POSIX message queues。

Mount

新创建Mount namespace后,需要把对应目录重新挂载,否则看到的会是从宿主机继承过来的挂载点。

UTS

UTS namespaces 提供2个系统标识的隔离:hostname 和 NIS domain name。这些标识可以通过sethostname(2)和setdomainname(2)设置,通过uname(2),gethostname(2)和getdomainname(2)获取。

NID domain name: 第十四章、账号控管: NIS 服务器

容器镜像

挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统。又名rootfs。通过联合文件系统(Union File System)实现,其最主要的功能是将多个不同位置的目录联合挂载(union mount)到同一个目录下。

容器镜像是分层的:

  • 只读层:包含多个层
  • init层:它是一个以“-init”结尾的层,夹在只读层和读写层之间。Init 层是 Docker 项目单独生成的一个内部层,专门用来存放 /etc/hosts、/etc/resolv.conf 等信息。
  • 可读写层:只有一层,在没有写入文件之前,这个目录是空的。而一旦在容器里做了写操作,修改产生的内容就会以增量的方式出现在这个层中。为了实现删除只读层文件的操作,AuFS 会在可读写层创建一个 whiteout 文件,把只读层里的文件“遮挡”起来。

容器启动主要步骤:

  1. 启用 Linux Namespace 配置;
  2. 设置指定的 Cgroups 参数;
  3. 切换进程的根目录(Change Root)。

Dockerfile中CMD和ENTRYPOINT的使用区别: understand-how-cmd-and-entrypoint-interact

数据卷

Volume 机制,允许你将宿主机上指定的目录或者文件,挂载到容器里面进行读取和修改操作。通过Linux的绑定挂载机制实现,它的主要作用就是,允许你将一个目录或者文件,而不是整个设备,挂载到一个指定的目录上。并且,这时你在该挂载点上进行的任何操作,只是发生在被挂载的目录或者文件上,而原挂载点的内容则会被隐藏起来且不受影响。

绑定挂载实际上是一个 inode 替换的过程。在 Linux 操作系统中,inode 可以理解为存放文件内容的“对象”,而 dentry,也叫目录项,就是访问这个 inode 所使用的“指针”。

docker commit是发生在宿主机空间的镜像操作,由于 Mount Namespace 的隔离作用,宿主机并不知道绑定挂载的存在。所以,在宿主机看来,容器中可读写层的通过Volume 机制挂载的目录始终是空的。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

未来简史

未来简史

[以色列] 尤瓦尔·赫拉利 / 林俊宏 / 中信出版集团 / 2017-2 / 68.00元

进入21世纪后,曾经长期威胁人类生存、发展的瘟疫、饥荒和战争已经被攻克,智人面临着新的待办议题:永生不老、幸福快乐和成为具有“神性”的人类。在解决这些新问题的过程中,科学技术的发展将颠覆我们很多当下认为无需佐证的“常识”,比如人文主义所推崇的自由意志将面临严峻挑战,机器将会代替人类做出更明智的选择。 更重要的,当以大数据、人工智能为代表的科学技术发展的日益成熟,人类将面临着从进化到智人以来z......一起来看看 《未来简史》 这本书的介绍吧!

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具