作为目前最有发展前景的Linux容器技术 Docker ,得到了很多开源软件和组织的支持。不仅得到了 OpenStack通过novaheat 支持,而且被集成到最新的RHEL 7操作系统。

这里我整理汇总Docker的学习笔记以及一些实践经验。

Docker架构

  • Docker是一个客户-服务器应用程序
  • Docker客户端和服务器可以运行在一个系统,或者
  • Docker客户端和远程Docker服务器通讯
  • 通讯是通过socket或者通过RESTful API实现
  • 用户可以通过客户端和服务器通讯,例如,创建,运行和停止容器
  • 服务器接受命令,执行任务

参考 Docker Understanding the Technology

Docker组件

Docker主要组件如下:

  • Docker daemon
  • Docker client
  • Docker Index - 也就是中心化的Docker注册器

Docker Index是一个全局的归档(和目录)用于提供Docker容器映像。作为一个社区项目,Docker尝试提供所有需要的工具,并且通过一个简单的Docker客户端命令可以将你创建的映像分享给社区。

可以部署自己的私有Docker Index服务。

底层技术

Docker的底层技术包括

  • Namespaces

namespaces 提供独立的空间,称为容器。当运行一个容器时,Docker创建这个容器的一系列namespaces。

Docker使用的一些namespace有:

  • pid namesapce - 用于进程号(PID: 进程ID)
  • net namespace - 用于管理网络接口(NET: 网络)
  • ipc namespace - 用于管理IPC资源(IPC:进程间通讯)
  • mnt namespace - 用于管理挂载点(MNT:挂载)
  • uts namespace - 用于隔离内核/版本标识(UTS: Unix Timesharing System)
  • Control groups

cgroup 允许Docker可以公平地共享硬件资源给容器,并且设置限制。例如,限制内存最大128MB

  • UnionFS

UnionFS或者union文件系统是通过创建层次化,使其轻量级和快速的文件系统。Docker使用union文件系统提供构建容器的块设备。

  • 容器

Docker结合以上组件构建一个我们称为 libcontainer 的容器格式。Docker也支持传统的Linux容器,如 LXC 来使用这些组件。

当运行容器时发生什么?

Docker client (或者API)告诉Docker服务来运行一个容器,例如以下命令时一个 Hello world 举例

docker run -i -t ubuntu /bin/bash

以上命令实际上执行了如下步骤:

  • 下载一个ubuntu镜像
  • 创建一个容器
  • 分配一个文件系统并且读写层瓜子啊
  • 分配网络和网桥接口
  • 设置IP地址
  • 执行指定的进程(这里时一个应用程序)
  • 捕获应用程序的输出

Docker image工作原理

Docker image时通过一个简单的描述步骤级来构建,这个步骤级称为指令。指令存储在一个称为 Dockerfile 的文件中。每个指令集使用UnionFS技术来写入一个新层到一个映像方便我们查看。

每个映像是从一个基本映像创建的,例如 ubuntu 就是一个基本Ubuntu映像,而 fedora 就是一个基本Fedora映像。Docker通过 Docker Index 创建和提供这些基本映像。

Docker registry工作原理

Docker registry是你存储Docker映像的地方。一旦你构建了Docker映像,你可以将它推送到 Docker Index 或者你自己在防火墙后面构建的私有注册器中。

使用Docker客户端可以搜索已经发布的映像然后下载映像到你的Docker主机来从映像创建容器(或者在这这些映像上构建)。

Docker Index 提供共有和私有的映像存储。