内容简介: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。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
JAVA多线程设计模式
结城 浩、博硕文化 / 博硕文化 / 中国铁道出版社 / 2005-4-1 / 49.00元
《JAVA多线程设计模式》中包含JAVA线程的介绍导读,12个重要的线程设计模式和全书总结以及丰富的附录内容。每一章相关线程设计模式的介绍,都举一反三使读者学习更有效率。最后附上练习问题,让读者可以温故而知新,能快速地吸收书中的精华,书中最后附上练习问题解答,方便读者学习验证。一起来看看 《JAVA多线程设计模式》 这本书的介绍吧!