《自己动手写Docker》

栏目: 编程工具 · 发布时间: 5年前

内容简介:Docker是一个开源工具,它可以将你的应用打包成一个标准格式的镜像,并且以容器的方式运行。Docker容器将一系列软件包装在Network Namespace是用来隔离网络设备、IP地址端口等网络栈的Namespace。Network Namespace可以让每个容器拥有自己独立的(虚拟的)网络设备,而且容器内的应用可以绑定到自己的端口,每个Namespace内的端口都不会互相冲突。在宿主机上搭建网桥后,就能很方便地实现容器之间的通信,而且不同容器上的应用可以使用相同的端口。Union File Syst

第一章 容器与开发语言

Docker是一个开源工具,它可以将你的应用打包成一个标准格式的镜像,并且以容器的方式运行。Docker容器将一系列软件包装在 一个完整的文件系统 中,这个文件系统包含应用程序运行所需要的一切:代码、运行时工具、系统 工具 、系统依赖,几乎有任何可以安装在服务器上的东西。这些策略保证了 容器内应用程序运行环境的稳定性,不会被容器外的系统环境所影响

  • 轻量级 :在同一台宿主机上的容器 共享系统Kernel ,这使得它们可以迅速启动而且占用内存极少。 镜像是以分层文件系统 构造的,这可以让它们共享相同的文件,使得磁盘使用率和镜像下载速度得到提高。
  • 开放 Docker容器基于开放标准,这使得 Docker 容器可以运行在主流 Linux 发行版和Windows操作系统上。
  • 安全容器将各个应用程序隔离 开来,这给所有的应用程序提供了一层额外的安全防护。

容器和虚拟机的比较

  • 同样有着资源隔离和分配的优点,容器比虚拟机更加便携和高效(但是隔离性不如虚拟机)
  • 虚拟机包含用户的程序,必要的函数库和整个客户操作系统,所有的这些差不多需要占用好几个GB的空间

容器加速开发效率

  • 方便配置开放环境
  • 开发者可以在容器内自主选择语言和工具,不用担心内部冲突
  • 消除环境的不一致

利用容器合作开发

  • 团队成员可以通过Docker Store、Docker Hub管理分享镜像。所有的变化和历史都可以在整个组织间查看。

利用容器快速扩容

  • Docker容器可以秒级启动和停止,因此,它可以在需要的时候快速扩容出大量的应用程序,扛住并发的压力。

第二章 基础技术

Linux Namespace介绍

Linux Namespace介绍

  • Linux Namespace是Kernel的一个功能,它可以隔离一系列的系统资源,比如PID(Process ID)、User ID、Network等。
+ clone()创建新进程。根据系统调用参数来判断哪些类型的Namespace被创建,而且它们的子进程也会被包含到这些Namespace中。
+ unshare()将进程移出某个Namespace。
+ setns()将进程加入到Namespace中。

UTS Namespace

  • UTS Namespace主要用来隔离nodename和domainname两个系统标识。在UTS Namespace里面,每个Namespace允许有自己的hostname。

IPC Namespace

  • IPC Namespace用来隔离System V IPC和POSIX messagequeues。每一个IPC Namespace都有自己的System V IPC和POSIX message queue。

PID Namespace

  • PID Namespace是用来隔离进程ID的。同样一个进程在不同的PID Namespace里可以拥有不同的PID。

Mount Namespace

  • Mount Namespace用来隔离各个进程看到的挂载点视图。在不同Namespace的进程中,看到的文件系统层次是不一样的。在Mount Namespace中调用mount()和umount()仅仅只会影响当前Namespace内的文件系统,而对全局的文件系统是没有影响的。

User Namespace

  • User Namespace主要是隔离用户的用户组ID。也就是说,一个进程的User ID和Group ID在User Namespace内外可以是不同的。
cmd.SysProcAttr = &syscall.SysProcAttr{     
    Cloneflags: syscall.CLONE_NEWUTS | syscall.CLONE_NEWIPC | syscall.CLONE_NEWPID | syscall.CLONE_NEWNS |            syscall.CLONE_NEWUSER| syscall.CLONE_NEWNET,   
    }
cmd.SysProcAttr.Credential = &syscall.Credential{
    Uid: uint32(1), 
    Gid:    uint32(1)
}

Network Namespace

Network Namespace是用来隔离网络设备、IP地址端口等网络栈的Namespace。Network Namespace可以让每个容器拥有自己独立的(虚拟的)网络设备,而且容器内的应用可以绑定到自己的端口,每个Namespace内的端口都不会互相冲突。在宿主机上搭建网桥后,就能很方便地实现容器之间的通信,而且不同容器上的应用可以使用相同的端口。

Linux Cgroups介绍

  • Linux Cgroups(Control Groups)提供了对一组进程及将来子进程的资源限制、控制和统计的能力,这些资源包括CPU、内存、存储、网络等。通过Cgroups,可以方便地限制某个进程的资源占用,并且可以实时地监控进程的监控和统计信息。
  • Docker通过为每个容器创建cgroup,并通过cgroup去配置资源限制和资源监控。

2.3Union File System

Union File System,简称UnionFS,是一种为Linux、FreeBSD和NetBSD操作系统设计的, 把其他文件系统联合到一个联合挂载点的文件系统服务 。它使用branch把不同文件系统的文件和目录“透明地”覆盖,形成一个单一一致的文件系统。这些branch或者是read-only的,或者是read-write的,所以当对这个虚拟后的联合文件系统进行写操作的时候,系统是真正写到了一个新的文件中。看起来这个虚拟后的联合文件系统是可以对任何文件进行操作的, 但是其实它并没有改变原来的文件,这是因为unionfs用到了一个重要的资源管理技术,叫写时复制

  • 每一个Docker image都是由一系列read-only layer组成的。image layer的内容都存储在Docker hosts filesystem的/var/lib/docker/aufs/diff目录下。而/var/lib/docker/aufs/layers目录,则存储着image layer如何堆栈这些layer的meta-data。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

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

《电脑报》2005年合订本(上下)

《电脑报》2005年合订本(上下)

电脑报社主编 / 西南师范大学出版社 / 2006-1 / 45.00元

全套上、下两册,浓缩2005年电脑报精华文章;附录包含70余篇简明IT应用指南,涵盖软件、硬件、数码、网络四大领域,配赠权威实用的2005-2006中国计算机年鉴光盘,近1.4GB海量信息与资源超值奉献,提供2005-2006全系列硬件、数码产品资讯,兼具知识性与资料性,连结购买每年《电脑报合订本》,你将拥有一套完整的实用大型电脑文库。一起来看看 《《电脑报》2005年合订本(上下)》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具