您的位置:首页 > 运维架构 > Docker

[Docker 官方文档] 理解 Docker

2017-06-13 14:54 204 查看
http://segmentfault.com/a/1190000002609286


什么是 Docker?

Docker 是一个用于开发、交付和执行应用的开放平台,Docker 设计用来更快的交付你的应用程序。Docker 能够将你的应用程序和基础设施层隔离。而且还能够将你的基础设施当作程序一样进行管理。Docker 能够帮助你更块地打包你代码、測试以及部署,而且也能够降低从编写代码到部署执行代码的周期。

Docker 将一个轻量级的容器虚拟化平台和一组标准工作流程、工具进行集成,来帮助你方便地管理和部署应用。

核心是,Docker 提供了一种在安全隔离的容器中执行近乎全部应用的方式,这样的隔离性和安全性同意你在同一主机上同一时候执行多个容器,而容器的这样的轻量级特性,意味着你能够节省很多其它的硬件资源,由于你不必消耗执行 hypervisor 所须要的额外负载。

基于容器虚拟化的工具或者平台能够为你提供例如以下帮助:

将应用程序(包含支撑的组件)放入Docker容器中;
将这些容器打包并分发给你的团队。以便于兴许的开发和測试;
将这些容器部署到生产环境中,生产环境能够是本地的数据中心。也能够在云端。


我能够用 Docker 做些什么?


高速分发你的应用

Docker是开发过程中较为理想的助手。它同意你在包括了你的应用和服务的本地容器中进行开发。然后帮你完毕集成和部署。

比如,你的开发者能够在本地编写代码然后通过Docker与其它同事共享,当他们完毕了各自的开发任务后,能够将他们的代码推送到一个測试的环境中进行測试,完毕測试后便能够将对应的Docker镜像部署到生产环境中。


更方便地进行部署和调整规模

Docker这样的基于容器的平台具有高度的便携性,它能够无缝地执行于开发人员的本地主机、数据中心其他的物理机或虚拟机、或者云端。

Docker的便携性和其天然的轻量特性易于实现动态地负载管理,你能够利用Docker高速地增减应用和服务的部署规模,Docker的速度保证了这样的规模的调整近乎实时。


更高密度的部署应用和执行很多其它的应用

因为Docker轻量而且高速,因此相对于基于Hypervisor的虚拟机的部署方式。Docker提供了一种更可行和划算的替代方案,这对于高密度部署环境尤事实上用,比如在构建私有云或PaaS。当然,当你想在有限的资源里部署很多其它的应用时,Docker对于中小型的部署也很实用。


Docker 主要包含哪些组件?

Docker主要包含两个组件:

Docker:开源的容器虚拟化平台。
Docker Hub :用于分享和管理Docker容器的软件即服务平台。

注:Docker在Apache 2.0开源协议下进行授权。


Docker 的架构?

Docker是Client/Server的架构,Dockerclient与Docker daemon进行交互,daemon负责构建、执行和公布Docker容器。client能够和服务端执行在同一个系统中。也能够连接远程的daemon。Docker的client的daemon通过RESTful API进行socket通信。

[



Docker 守护进程

就像上图所看到的,Docker守护进程(daemon)在主机上执行,用户不能直接和守护进程打交道,可是能够通过Dockerclient与其进行交互。


Docker client

Dockerclient——
docker
二进制文件的功能之中的一个——是Docker的初始用户界面,它接收用户的命令并反馈,而且与Docker的守护进行交互。


Docker 内部机制

理解Docker的内部机制。你须要明确例如以下三个组件:

Docker镜像
Docker注冊中心
Docker容器


Docker 镜像

Docker镜像是一个仅仅读的模板。比如,一个镜像能够包括安装了Apache Web服务应用的Ubuntu操作系统。镜像能够用来创建Docker容器。

Docker提供了构建新镜像或升级原有镜像的较为便利的方式,或者你也能够下载别人已经创建好的镜像。Docker镜像是Docker的构建组件。


Docker 注冊中心

Docker注冊中心用于上传和下载镜像,分为公共注冊中心和私有注冊中心两种。公共注冊中心为Docker Hub,它提供了大量的现成镜像,你能够构建自己的镜像并上传到上面,也能够在上面下载别人构建的镜像。Docker注冊中心是Docker的公布组件。


Docker 容器

Docker容器就像是一个目录。它包括了一个应用程序执行所须要的全部内容。

每一个容器都是基于Docker镜像构建。

我们能够执行、開始、停止、迁移或者是删除Docker容器。

每一个容器均是一个隔离的、安全的应用平台。Docker容器是Docker的执行组件。


Docker 如何工作的

至此,我们已经知道了:

你能够构建用于存储你的应用程序的镜像。
你能够从Docker镜像中创建容器用来执行你的应用;
你能够通过Docker Hub或者你自己的注冊中心来共享Docker镜像。

那我们看看 Docker 是怎么将这些元素组合在一起工作的。


Docker 镜像是怎样工作的

我们已经知道Docker镜像实质上是一些用于载入Docker容器的仅仅读模板,每一个镜像包含非常多层。

Docker利用union file systems将这些层组合为一个镜像。Union
file systems同意相互隔离的文件或文件夹透明的叠加在一起。而呈现为一个统一的文件系统。

Docker如此轻量化的原因也是因为这些层的存在。当你对一个Docker镜像进行改动时——比如将一个应用升级为一个新的版本号——会构建一个新的层。因此,与虚拟机的替换整个镜像或全然构建的方式不同。Docker仅对相关的层进行加入或升级。所以你仅须要公布镜像的更新部分而不必公布整个镜像,这样的方式使得镜像的公布更加高速和简单。

每一个镜像始于一个基础镜像,比如:
ubuntu
便是一个基础的Ubuntu镜像,
fedora
是一个基础的Fedora镜像。

你也能够将你自己制作的镜像作为基础镜像,比如你能够将一个Apache镜像作为一个Web应用的基础镜像。


注意:Docker一般从Docker Hub上获取基础镜像。Docker镜像从这些基础镜像中依照一系列的步骤进行制作。我们称这些步骤为指令,每一个指令在你的镜像中创建一个新的层。指令包含下面行为:



执行一条命令;
加入一个文件或文件夹;
创建一个环境变量;
从此镜像中载入一个容器时须要执行的进程。

这些指令存储在
Dockerfile
中。Docker在构建镜像过程中读取这个
Dockerfile
,执行里面的指令并返回终于的镜像。


Docker注冊中心怎样工作的

Docker注冊中心是Docker镜像的存储中心,当你构建完一个镜像后便能够将其推送到Docker Hub或你自己的注冊中心。

利用Dockerclient,你能够搜索已经公布的镜像,然后将其拉取到你的Docker主机上,以便于基于这些镜像构建容器。

Docker Hub为镜像提供了公共的和私有的存储空间。

公共的存储空间不论什么人均能够在上面搜索和下载,私有存储空间仅对你本人或你的团队开放搜索以及拉取下载。你能够通过这里注冊一个私有的存储空间。


容器是怎样工作的

一个容器包含操作系统、用户加入的文件以及相关的元数据。我们知道,每一个容器都是从镜像中构建出来的,这个镜像告诉Docker容器用到什么资源、当容器载入时启动哪个进程以及容器启动时的其他配置。Docker镜像是仅仅读的。当Docker从一个镜像执行一个容器时。它会在镜像的上层加入一个用于执行应用的可读写的层(利用的就是上文提到的union file system)。


执行一个容器时究竟发生了什么

无论是通过Docker命令还是API调用的方式。Dockerclient都会通知Docker的守护进程执行一个容器。

sudo docker run -i -t ubuntu /bin/bash


我们来看一下这个命令,Dockerclient利用
docker
命令并结合
run
选项来启动一个容器,一个最小配置的Dockerclient执行一个容器须要告诉Docker守护进程下面事项:

此容器基于什么镜像来构建。此处是
ubuntu
——一个基础的Ubuntu镜像;
须要在容器中执行的命令,此处是
/bin/bash
——在容器中启动一个Bash Shell。

那么我们看看执行上述命令时究竟发生了什么?

依照顺序,Docker依次干了例如以下事情:

拉取
ubuntu
镜像 : Docker首先检查一下
ubuntu
镜像在本地server上存不存在。假设不存在。则自己主动从Docker
Hub中下载。假设已经存在则直接利用这个镜像来启动一个新的容器。
创建一个新的容器: 假设Docker本地server中存在这个镜像。那么就据此来启动一个容器。
分配一个文件每户而且将其挂载到一个可读写的层: 容器在此文件系统中被创建。而且将其作为一个可读写的层加入到镜像中。
分配一个网络或桥接的接口: 创建一个网络的接口以便于Docker容器可以訪问本机。
设置一个IP地址: 为此容器从地址池中找到并绑定一个IP地址。

执行指定的进程: 执行你的应用程序,然后;
获取并提供应用程序的输出: 连接标准输入、标准输出和标准错误接口,这样你便可以观察到程序执行的一切。

如今你已经执行了一个容器,这样你便能够管理你的容器、与应用程序进行交互。当执行结束是停止或者删除你的容器。


底层技术问题

Docker是用Go语言实现的。用到了一些Linux内核的特性实现上述功能。


命名空间(namespaces)

Docker在为容器提供一个隔离的工作空间时。用到了
命名空间
的技术,当你执行一个容器时,Docker会为此容器创建一组命名空间。

这样便能够提供一个隔离的层:每一个容器执行在自己的命名空间中,而外部不能訪问这个层。

Docker用到的一些命名空间有:

pid
命名空间: 用于隔离进程(PID:Process ID)。
net
命名空间: 用于管理网络;
ipc
命名空间: 用于訪问IPC资源(IPC:InterProcess Communication);
mnt
命名空间: 用于管理挂载点(MNT:Mount);
uts
命名空间: 用于隔离内核和版本号标识(UTS:Unix Timesharing System)。


控制组(Control Groups)

Docker还用到了另外一项技术叫
cgroups
或者叫控制组(control groups)。实现程序执行环境的隔离的关键在于使这些程序仅仅用到它们须要的资源,这就行保证这些容器是主机服务环境小社会中的好市民。控制组同意Docker在不同的容器之间共享硬件资源,须要时加入一些限制和约束,比如限制一个容器最大訪问内存量。


统一文件系统(Union file systems)

统一文件系统或者说是UnionFS,是创建层的时候用到的文件系统,使文件系统很轻量和高速。Docker使用统一文件系统为容器构建blocks,Docker能够使用几种不同的文件系统:AUFS、btrfs、vfs以及DeviceMapper。


容器格式

Docker容器将这些组件合并在一起,我们称之为容器格式,容器的缺省格式称为
libcontainer
。Docker还支持利用LXC技术的传统Linux容器格式,未来还将会支持其他的容器格式。比如:与BSD
Jails或者Solaris Zones实现整合。


下一步

安装Docker,请參照 installation section
Docker用户指南。请參照 深入学习Docker

原文链接:Understanding Docker(翻译:deerlux 校对:李颖杰)

译者介绍:deerlux@163.com,现就职于一家军工科研机构,深度的技术控、Linux控、python控。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: