《自己动手写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。

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

查看所有标签

猜你喜欢:

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

C++程序设计原理与实践

C++程序设计原理与实践

(美)Bjarne Stroustrup / 王刚 等 / 机械工业出版社 / 2010.7 / 108.00元

本书是经典程序设计思想与C++开发实践的完美结合,是C++之父回归校园后对C++编程原理和技巧的全新阐述。书中全面地介绍了程序设计基本原理,包括基本概念、设计和编程技术、语言特性以及标准库等,教你学会如何编写具有输入、输出、计算以及简单图形显示等功能的程序。此外,本书通过对C++思想和历史的讨论、对经典实例(如矩阵运算、文本处理、测试以及嵌入式系统程序设计)的展示,以及对C语言的简单描述,为你呈现......一起来看看 《C++程序设计原理与实践》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码