Docker目前是一个非常流行,快速发展的项目,可以快速创建非常轻量的”虚拟机”。——这里打引号是因为Docker并不是一个真正的虚拟机。Docker背后的想法是创建软件程序可移值的轻量容器,让其可以在任何安装Docker的机器上运行,而不用关心底层操作系统。
Docker能做什么?
- 隔离应用依赖
- 创建应用镜像并进行复制
- 创建容易分发的即启即用的应用
- 允许实例简单,快速地扩展
- 测试应用并随后销毁它们
Docker两个重要概念:镜像和容器
镜像
Docker的镜像类似虚拟机的快照,但更轻量。镜像拥有唯一的ID,以及一个供人阅读的名字和标签对。镜像可以命名为类似ubuntu:latest、ubuntu:precise、django:1.6、django:1.7等等容器
你可以从镜像中创建容器,这等同于从快照中创建虚拟机,不过更轻量。应用是由容器运行的。容器跟虚拟机一样是相互隔离的,它们也拥有一个唯一ID和唯一的供人阅读的名字。容器对外公开服务是必要的,因此Docker允许公开容器的特定端口。
容器被设计成用来运行单进程,Docker设计者极力推崇”一个容器一个进程的方式”
Docker另外两个重要概念:数据卷和链接
数据卷
数据卷让你可以不受容器生命周期影响进行数据持久化。它们表现为容器内的空间,但实际保存在容器之外,从而允许你在不影响数据的情况下销毁,重建,修改,丢弃容器。Docker允许你定义应用部分和数据部分,并提供工具让你可以将他们分开。使用Docker时必须做出的最大思维变化之一就是:容器应该是短暂和一次性的。
卷是针对容器的,你可以使用同一个镜像创建多个容器并定义不同的卷。卷保存在运行Docker的宿主文件系统文件下,你可以指定卷存放的目录,或让Docker保存在默认位置。
链接
容器启动时,将被分配一个随机的私有Ip,其它容器可以使用这个ip地址与其进行通讯。
- 提供了容器间相互通信的渠道。
- 容器将共享一个本地网络
Docker镜像必须是可移植的
Docker允许你在一个镜像中指定卷和端口。从这个镜像创建的容器继承这些设置。但是,Docker不允许你在镜像上指定任何不可移植的内容。
- 你可以在镜像里面定义卷,只要它们被保存在Docker使用的默认位置。这是因为如果你在宿主文件系统里指定了一个特定目录来保存卷,其他使用这个镜像的宿主无法保证这个目录存在的。
- 你可以定义公开的端口,但仅限那些在创建链接时公开给其他容器的端口,你不能指定公开宿主的端口,因为你无法知晓使用那个镜像的宿主有哪些端口可用。
- 你也不能在镜像上定义链接,使用链接要求通过名字引用其他容器,但你无法预知每个使用那个镜像的宿主如何命名容器
Docker要实现它的功能依赖什么?
Linux有两个重要的功能:cgroups和union文件系统。Docker使用cgroup来提供容器隔离,而union文件系统用于保存镜像并使容器变得短暂。
Cgroups
这是Linux内核功能,它让两件事情变成可能: 限制Linux进程组的资源占用(内存、CPU) 为进程组制作 PID、UTS、IPC、网络、用户及装载命名空间 这里的关键词是命名空间。比如说,一个PID命名空间允许它里面的进程使用隔离的PID,并与主PID命名空间独立开来,因此你可以在一个PID命名空间里拥有自己的PID为1的初始化进程。其他命名空间与此类似。然后你可以使用cgroup创建一个环境,进程可以在其中运行,并与操作系统的其他进程隔离开,但这里的关键点是这个环境上的进程使用的是已经加载和运行的内核,因此额外支出与运行其他进程几乎是一样的。Chroot之于cgroup就好像我之于绿巨人(The Hulk)、贝恩(Bane)和毒液(Venom)的组合(译者注:本文作者非常瘦弱,后三者都非常强壮)。
union文件系统
Union文件系统(UnionFS)是一种分层、轻量级并且高性能的文件系统,它支持对 文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem)。Union 文件系统是 Docker 镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。另外,不同 Docker 容器就可以共享一些基础的文件系统层,同时再加上自己独有的改动层,大大提高了存储的效率。Docker 中使用的 AUFS(AnotherUnionFS)就是一种 Union FS。 AUFS 支持为每一个成员目录(类似 Git 的分支)设定只读(readonly)、读写(readwrite)和写出(whiteout-able)权限, 同时 AUFS 里有一个类似分层的概念, 对只读权限的分支可以逻辑上进行增量地修改(不影响只读部分的)。