早就听说了docker,但是就是不知道它是干什么的,能用来干什么。如今它越来越强大,我也得跟上。先大体普及下吧。
1.docker能做什么
解决虚拟机能解决的问题,解决虚拟机由于资源要求过高不能解决的问题
- 隔离应用依赖
- 创建应用镜像进行复制
- 创建容易分发的即启即用的应用
- 允许实例简单、快速地扩展
- 测试应用并随后销毁它们
轻量可移植----从而有了船、集装箱、物品的故事
2.几个概念
*** 镜像 ***
最初知道的镜像就是 装系统时候,拷贝一个镜像,用这个镜像很快就装完系统了。它应该是 操作系统的一个快照而已。当然,也可以用个软件建立自己的镜像,然后备份好了就可以。对了,一键ghost。
docker的镜像类似VM的快照。
创建:
拿来主义,拿一个镜像来修改。
方式一 在一个文件中指定一个基础镜像及需要完成的修改;
方式二 通过“运行”一个镜像,对其进行修改并提交。
命名:
镜像拥有唯一ID,以及一个供人阅读的名字和标签对。
可移植性:
Docker允许你在一个镜像中指定卷和端口。(Docker不允许你在镜像上指定任何不可移植的内容。)
容器
故名思议,容器用来运行应用的啦。
可以从镜像中创建容器,这等同于从快照中创建虚拟机,不过更轻量。
容器是隔离的。
命名:
唯一ID 唯一的供人阅读的名字
容器对外公开服务是必要的,因此Docker允许公开容器的特定端口。
容器有一个很大的差异,它们被设计用来运行单进程
容器之所以是短暂的,是因为当你从镜像上创建一个容器,Docker会创建一个空白的union文件系统加载在与该镜像关联的union文件系统之上。
数据卷
数据卷让你可以不受容器生命周期影响进行数据持久化。
它们表现为容器内的空间,但实际保存在容器之外,从而允许你在不影响数据的情况下销毁、重建、修改、丢弃容器。
Docker允许你定义应用部分和数据部分,并提供工具让你可以将它们分开。
使用Docker时必须做出的最大思维变化之一就是:容器应该是短暂和一次性的。
卷所做的是在容器内指定一个目录,以便在union文件系统之外保存它。
卷是针对容器的,你可以使用同一个镜像创建多个容器并定义不同的卷。
卷还可以用来在容器间共享数据
链接
容器启动时,将被分配一个随机的私有IP,其它容器可以使用这个IP地址与其进行通讯。
要开启容器间通讯,Docker允许你在创建一个新容器时引用其它现存容器,在你刚创建的容器里被引用的容器将获得一个(你指定的)别名。我们就说,这两个容器链接在了一起。
3.如何完成它需要的功能
Docker使用cgroups来提供容器隔离,而union文件系统用于保存镜像并使容器变得短暂。
cgroups:linux内核功能
CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。
CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。
限制Linux进程组的资源占用(内存、CPU)
为进程组制作 PID、UTS、IPC、网络、用户及装载命名空间
union文件系统用
Union文件系统允许通过union装载来达到一个分层的积累变化
当你下载一个镜像,修改它,然后保存成新版本,你只是创建了加载在包裹基础镜像的初始层上的一个新的union文件系统。
Linux命名空间
LXC为Linux Container的简写。
LXC所实现的隔离性主要是来自内核的命名空间, 其中pid、net、ipc、mnt、uts 等命名空间将容器的进程、网络、消息、文件系统和hostname 隔离开。
LXC内部依赖Linux内核的3种隔离机制(isolation infrastructure): Chroot 、 Cgroups 、 Namespaces
Linux的3.12内核支持6种Namespace:
UTS: hostname
IPC: 进程间通信
PID: "chroot"进程树
NS: 挂载点,首次登陆Linux
NET: 网络访问,包括接口
USER:user-id映射到真实的user-id(之后的文章会讲到)
参考