您的位置:时时app平台注册网站 > 彩世界网址 > Docker入门必备书籍:《自己动手写Docker》彩世界网

Docker入门必备书籍:《自己动手写Docker》彩世界网

2019-09-15 02:02

朱辉(茶水): Linux Kernel iowait 时间的代码原理,朱辉iowait

作者简介

朱辉,个人主页 

Linux Kernel iowait 时间的代码原理,朱辉iowait 作者简介 朱辉,个人主页 ...

清单 3. Linux 图形配置命令
 make menuconfig

作者简介

(点击作者姓名可查看个人主页)

陈显鹭(花名:遥鹭)-阿里云高级研发工程师

对Docker有深入研究,是Docker多个项目的Contributor,专注于容器技术的编排与基础环境研究。爱好折腾源代码,热爱开源文化并积极参与社区开源项目的研发。

王炳燊(花名:溪恒)-阿里云研发工程师

具有丰富的Linux开发经验,对Docker有深入研究,多次提交Docker Patch。目前从事阿里云容器服务网络方案的设计与实现,专注于容器技术的基础环境研究。

秦妤嘉(花名:嫀嫀)-阿里云高级研发工程师

DevOps工程师,有丰富的容器化持续集成和持续交付开发实战经验,进行过Jenkins源码分析改造和Jenkins插件开发。目前从事阿里云容器服务持续集成和持续交付方案的设计和实现。

使用

Kasan 是内核的一部分,使用时需要重新配置、编译并安装内核。Kasan 在 Linux 内核 4.0 版本时被引入内核,所以选择的内核代码需要高于 4.0 版本。另外,最基本的 Kasan 功能需要 GCC4.9.2 支持,更多的支持则需要 GCC5.0 及以上版本。

首先是配置和编译内核。

运行如下命令启动图形配置界面:

《自己动手写Docker》在详细分析Docker所依赖的技术栈的基础上,一步一步地通过代码实例,让读者可以自己循序渐进地用Go语言构建出一个容器的引擎。不同于其他Docker原理介绍或代码剖析的书籍,《自己动手写Docker》旨在提供给读者一条动手路线,一步一步地实现Docker的隔离性,构建Docker的镜像、容器的生命周期及Docker的网络等。

引言

Kasan 是 Kernel Address Sanitizer 的缩写,它是一个动态检测内存错误的工具,主要功能是检查内存越界访问和使用已释放的内存等问题。Kasan 集成在 Linux 内核中,随 Linux 内核代码一起发布,并由内核社区维护和发展。

彩世界网址 1

图 1. Kasan 内存布局原理

彩世界网址 2

想自己动手写Docker?你需要看《自己动手写Docker》这本书!

原理

Kasan 的原理是利用“额外”的内存来标记那些可以被使用的内存的状态。这些做标记的区域被称为影子区域(shadow region)。了解 Linux 内存管理的读者知道,内存中的每个物理页在内存中都会有一个 struct page 这样的结构体来表示,即每 4KB 的页需要 40B 的结构体,大约 1% 的内存用来表示内存本身。Kasan 与其类似但“浪费”更为严重,影子区域的比例是 1:8,即总内存的九分之一会被“浪费”。用官方文档中的例子,如果有 128TB 的可用内存,需要有额外 16TB 的内存用来做标记。

做标记的方法比较简单,将可用内存按照 8 子节的大小分组,如果每组中所有 8 个字节都可以访问,则影子内存中相应的地方用全零(0x00)表示;如果可用内存的前 N(1 到 7 范围之间)个字节可用,则影子内存中响应的位置用 N 表示;其它情况影子内存用负数表示该内存不可用。

本书的内容

本书的目的是去引导读者通过学习容器技术的实现细节,一步步去构建一个简单的容器。 从这个过程中,了解整个容器技术领域和实现细节。本书注重原理的讲解与实践,每一部分都 会有详细的代码解析,力争用最少最精简的代码,帮助读者构建自己的容器。

本书的内容主要分为“容器与开发语言” “基础技术” “构造容器” “构造镜像” “构造 容器进阶” “容器网络” “高级实践” 这7章。

容器与开发语言:主要介绍 Docker 的基本功能和特点,并且对后面即将使用的 Go 语言 做一个简单的介绍。

基础技术:主要介绍实现容器的底层技术,如Namespace、Cgroups、Union File System。 每一小节都会有文字性介绍,并且附有一个简短的小例子程序,介绍在容器上是如何使 用这项技术的,方便读者清晰地理解各个技术点在容器上的作用。

构造容器:使用前面两章介绍的基础技术,构造一个最简单的容器环境,会将整体实现 细节及代码解析一点点展现,直接使用前面介绍的基础技术,从而更加有实战感。

构造镜像: 使用 2.3 节介绍的分层文件系统技术,构建一个简单的容器镜像,体现容器 镜像的分层思想。

构造容器进阶:更加贴近真实的容器实现,在原来的基础上,增加更丰富的功能。通过 这一章的学习,读者可以更好地了解各种技术是如何整合在一起,去实现容器整体功能 的。

容器网络: 除了实现一个容器环境之外,这一章还会讲解如何使自己的容器和宿主机通 信,以及如何让不同的容器之间进行通信,更加贴近真实环境。

高级实践: 使用自己编写的容器,运行一些通用程序,验证容器的可用性。此外,本章 还介绍了目前Docker 使用的容器运行引擎,以及目前容器运行态引擎的概况。

那么,怎样才能购买到书籍呢?天猫商城-电子工业出版社店铺即可预约购买!

另外社区机构号也邀请到三位作者,大家对于这本书籍或者Docker学习的问题欢迎到原文:https://zhuanlan.zhihu.com/p/27597437 评论中提问。

清单 2. Address Sanitizer 运行结果
 tengrui@virtualbox:~/workspace/cc$ g   -O -g -fsanitize=address use-after-free.cc 
 tengrui@virtualbox:~/workspace/cc$ ./a.out 
 ================================================================= 
 ==4206==ERROR: AddressSanitizer: heap-use-after-free on address 
 0x60400000dfd4 at pc 0x0000004007d4 bp 0x7ffdfdd414f0 sp 0x7ffdfdd414e0 
 READ of size 4 at 0x60400000dfd4 thread T0 
    #0 0x4007d3 in main /home/tengrui/workspace/cc/use-after-free.cc:4 
    #1 0x7f8aa150882f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6 0x2082f) 
    #2 0x4006b8 in _start (/home/tengrui/workspace/cc/a.out 0x4006b8) 

 0x60400000dfd4 is located 4 bytes inside of 40-byte region 
 [0x60400000dfd0,0x60400000dff8) 
 freed by thread T0 here: 
    #0 0x7f8aa194abca in operator delete[](void*) 
     (/usr/lib/x86_64-linux-gnu/libasan.so.2 0x99bca) 
    #1 0x4007a7 in main /home/tengrui/workspace/cc/use-after-free.cc:3 

 previously allocated by thread T0 here: 
    #0 0x7f8aa194a5d2 in operator new[](unsigned long) 
     (/usr/lib/x86_64-linux-gnu/libasan.so.2 0x995d2) 
    #1 0x400797 in main /home/tengrui/workspace/cc/use-after-free.cc:2 

 SUMMARY: AddressSanitizer: 
 heap-use-after-free /home/tengrui/workspace/cc/use-after-free.cc:4 main 
 Shadow bytes around the buggy address: 
  0x0c087fff9ba0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9bb0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9bc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9bd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9be0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
 =>0x0c087fff9bf0: fa fa fa fa fa fa fa fa fa fa[fd]fd fd fd fd fa 
  0x0c087fff9c00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9c10: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9c20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9c30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
  0x0c087fff9c40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 
 Shadow byte legend (one shadow byte represents 8 application bytes): 
  Addressable:           00 
  Partially addressable: 01 02 03 04 05 06 07 
  Heap left redzone:       fa 
  Heap right redzone:      fb 
  Freed heap region:       fd 
  Stack left redzone:      f1 
  Stack mid redzone:       f2 
  Stack right redzone:     f3 
  Stack partial redzone:   f4 
  Stack after return:      f5 
  Stack use after scope:   f8 
  Global redzone:          f9 
  Global init order:       f6 
  Poisoned by user:        f7 
  Container overflow:      fc 
  Array cookie:            ac 
  Intra object redzone:    bb 
  ASan internal:           fe 
 ==4206==ABORTING

Andrey Ryabinin 借鉴了 AddressSanitizer 的思想,并在 Linux 内核中实现了 Kernel Address Sanitizer。所以 Kasan 也可以看成是用于内核空间的 Address Sanitizer。

为什么要写这本书

Docker 技术可谓是近年最火热的技术之一,铺天盖地的技术论坛和各种讲座,大家都在分享关于如何容器化及如何使用Docker优化自己运维和开发流程的经验。随着Docker技术的逐渐普及,使用Docker已经不再是一个难题。现在更加重要的是生产环境容器化的最佳实践,另外就是容器的编排框架之争。但是,对于技术人员来说,除去Docker 外表的繁华外,什么是容器,容器到底是怎么创建的,容器底层的技术探秘也是非常重要的。

2014年开始接触 Docker的时候,经历了从最初的新奇—感叹竟然还有Docker 这样的好工具,到逐渐熟悉Docker的各种功能,尝试在生产环境中使用Docker技术的过程。但是,每每被人问到:“Docker技术到底是怎么实现的呢?”我只能粗粗浅浅地说:“Docker是使用Linux Kernel的Namespace 和 Cgroups实现的一种容器技术。”那么,什么是Namespace,什么是Cgroups,Docker是怎么使用它们的,容器到底是怎么一步步被创建出来的?问到这些,我就会支支吾吾地不知所以。由此可见,了解容器技术的底层技术,然后明白它们是如何工作的,尤为重要,这些才是整个容器技术的基石,掌握了这些基石才能更加容易地向上攀登。

单单讲解底层的技术实现细节和源码解读是很枯燥的一件事,一般来说很难有耐心去一点点细读然后揣摩其中的奥妙,这样囫囵吞枣地过一遍技术细节,作用不大。因此,便萌生了写一本《自己动手写Docker》这样的书的想法。本书不去刻意讲解容器技术的细节,用到什么讲解什么,点到为止,更加细节的内容留给读者自己探索。通过阅读本书,可以一步步地去了解容器技术的实现细节,更可以跟着作者一步步地用自己的代码去实现它。本书最大的乐趣莫过于用自己最新了解到的知识去动手实现自己的容器。由此可以进一步打开你进入容器技术社区的大门。

图 2. Kasan 内核选项配置界面

彩世界网址 3

清单 1. 用户空间内存错误代码实例
 // To compile: g   -O -g -fsanitize=address use-after-free.c 
 int main(int argc, char **argv) { 
  int *array = new int[10]; 
  delete [] array; 
  return array[argc];  // BOOM 
 }

当运行以上有内存使用错误的程序时,加入 Address Sanitizer 功能的的版本会报告如下的错误信息,而没有任何选项的版本则会正常结束程序。

清单 5. Grub 配置命令
 sudo grub2mkconfig – o /boot/grub/grub.cfg

其它发行版本请参考相关文档。

更多详情见请继续阅读下一页的精彩内容: http://www.linuxidc.com/Linux/2016-12/138712p2.htm

彩世界网址 4

背景

Kasan 可以追溯到 LLVM 的 sanitizers 项目( AddressSanitizer,MemorySanitizer,ThreadSanitizer 和 LeakSanitizer 等工具。但这些工具只能检测用户空间的内存问题。通过在编译时加入指定的选项,就可以给用户程序加入 Address Sanitizer 功能。

Kernel address sanitizer (Kasan) 是一款随 Linux 内核代码一同发布和维护的内存检测工具,由内核社区维护和发展。本文简要介绍 Kasan 的原理及使用方法。

清单 4. Linux 内核编译、安装命令
 make menuconfig 
 make 
 sudo make modules_install 
 sudo make install
图 3. Kasan 模式选项

彩世界网址 5

然后重新编译并安装内核即可,除了通用的编译和安装命令,在 Fedora 这种发行版本中,还需要更新 grub。

本文由时时app平台注册网站发布于彩世界网址,转载请注明出处:Docker入门必备书籍:《自己动手写Docker》彩世界网

关键词: