[Docker 官方文档] 理解 Docker

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 如何工作的

至此,我们已经知道了:

  1. 你能够构建用于存储你的应用程序的镜像。
  2. 你能够从Docker镜像中创建容器用来执行你的应用;
  3. 你能够通过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实现整合。

下一步



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

译者介绍:[email protected],现就职于一家军工科研机构,深度的技术控、Linux控、python控。

时间: 2024-10-13 12:34:24

[Docker 官方文档] 理解 Docker的相关文章

【Docker官方文档】理解Docker

本文来自Docker的官方文档,详细介绍了Docker的体系结构.重要概念.内部工作机理等内容,推荐不了解Docker内部原理的同学阅读. 什么是Docker? Docker是一个用于开发.交付和运行应用的开放平台,Docker设计用来更快的交付你的应用程序. Docker可以将你的应用程序和基础设施层隔离,并且还可以将你的基础设施当作程序一样进行管理.Docker可以帮助你更块地打包你代码.测试以及部署,并且也可以减少从编写代码到部署运行代码的周期. Docker将一个轻量级的容器虚拟化平台和

docker官方文档笔记

Docker在 CentOS7.X上运行.Docker可能在其他EL7的兼容版本中成功安装,但是官方并未进行测试,因此也不提供任何支持. 系统环境要求 docker必须运行在64-bit的系统上,对于CentOS的版本号并没有特别要求.另外,如果需要在CentOS上安装,内核版本必须高于3.10. 通过uname -r 查看内核版本 uname -r 3.10.0-327.el7.x86_64 脚本安装 可以通过以下两种方法安装Docker Engine.使用 yum包管理器: 或者使用 cur

docker官方文档中的dns,link,expose,publish

link是过时的了,尽量不要用. dns内部集成,也可以用外部. expose只是用于记录,并不真的. publish是否起作用,也要看情况,是否被占用端口. -------------------------------------- Embedded DNS server Docker daemon runs an embedded DNS server which provides DNS resolution among containers connected to the same

Android File类 根据官方文档理解(转)

File有四个构造函数        public File(File dir,String name)             参数为File和String,File制定构造的新的File对象的路径,而String制定新的File名字        Public File(String path)             参数为String,构造一个新的File使用制定的路径        public File(String dirPath,String name)            

Docker安全性——官方文档[译]

Docker安全性--官方文档[译] 本文译自Docker官方文档:https://docs.docker.com/articles/security/ 在审查Docker的安全时,需要考虑三个主要方面:?容器内在的安全性,由内核命名空间和cgroup中实现;?docker守护程序本身的攻击面;?加固内核安全特性,以及它们如何与容器中互动. 内核 命名空间 Kernel Namespace Docker容器中非常相似LXC容器,并且它们都具有类似的安全功能.当您以"docker run"

swift官方文档中的函数闭包是怎么理解的?

官方文档中的16页: numbers.map({ (number: Int) -> Int in let result = 3 * number return result }) 不知道这个怎么用,更不知道它所说的要写个把奇数改成0的方法. swift官方文档中的函数闭包是怎么理解的?

TensorFlow 官方文档中文版

http://wiki.jikexueyuan.com/list/deep-learning/ TensorFlow 官方文档中文版 你正在阅读的项目可能会比 Android 系统更加深远地影响着世界! 缘起 2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源,同日,极客学院组织在线TensorFlow中文文档翻译. 机器学习作为人工智能的一种类型,可以让软件根据大量的数据来对未来的情况进行阐述或预判.如今,领先的科技巨头无不在机器学习下予以极大投入.Faceboo

【K8S】K8S-网络模型、POD/RC/SVC YAML 语法官方文档

K8S-网络模型.POD/RC/SVC YAML 语法官方文档 Kubernetes - Production-Grade Container Orchestration kubernetes/kubernetes: Production-Grade Container Scheduling and Management Posts containing 'yaml' - Stack Overflow how to pass a configuration file thought yaml o

【Phabricator】教科书一般的Phabricator安装教程(配合官方文档并带有踩坑解决方案)

随着一声惊雷和滂沱的大雨,我的Phabricator页面终于在我的学生机上跑了起来. 想起在这五个小时内踩过的坑甚如大学隔壁炮王干过的妹子,心里的成就感不禁油然而生. 接下来,我将和大家分享一下本人在CentOS7.4版本,利用lnmp搭建Phabricator的实战过程和踩过的坑.这一方面是为我下一步在docker上部署并制作镜像做好铺垫,更重要的是,我能够有幸和游走在这令人头秃的修罗场里的勇士们,分享我自认为史诗一般难得的宝贵经验.好,那么接下来我们进入正题. 一.什么是phabricato