[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 如何工作的
至此,我们已经知道了:
- 你能够构建用于存储你的应用程序的镜像。
- 你能够从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控。
[Docker 官方文档] 理解 Docker的更多相关文章
- 【Docker官方文档】理解Docker
本文来自Docker的官方文档,详细介绍了Docker的体系结构.重要概念.内部工作机理等内容,推荐不了解Docker内部原理的同学阅读. 什么是Docker? Docker是一个用于开发.交付和运行 ...
- 官方文档采用Docker方式安装
官方文档地址:https://github.com/grafana/loki/tree/master/production The Docker images for Loki and Promtai ...
- docker官方文档学习-1-Docker for mac安装配置
https://docs.docker.com/docker-for-mac/ Get started with Docker for Mac 首先像在本博客docker-1-环境安装及例子实践处将环 ...
- docker官方文档笔记
Docker在 CentOS7.X上运行.Docker可能在其他EL7的兼容版本中成功安装,但是官方并未进行测试,因此也不提供任何支持. 系统环境要求 docker必须运行在64-bit的系统上,对于 ...
- docker官方文档中的dns,link,expose,publish
link是过时的了,尽量不要用. dns内部集成,也可以用外部. expose只是用于记录,并不真的. publish是否起作用,也要看情况,是否被占用端口. -------------------- ...
- Android File类 根据官方文档理解(转)
File有四个构造函数 public File(File dir,String name) 参数为File和String,File制定构造的新的File对象的路径 ...
- Android File类 根据官方文档理解
File有四个构造函数 public File(File dir,String name) 参数为File和String,File制定构造的新的File对象的路径 ...
- Tomcat官方文档关于数据源配置的内容
虽然有网上有网友自己总结的文章,但说明得总是不够清晰,还是参考官方文档理解得比较透彻: http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html h ...
- 微信小程序官方文档中表单组建button部分有关function(type)中type的个人理解
官方文档关于button组件的简介 xml页面挺容易理解,但js部分起初对整体写的形式都不太理解,随着逐渐阅读代码基本理解了 xml页面代码: <button type="defaul ...
随机推荐
- jumpserver 安装python 报错
环境centos7.5 pip3 insatll ./python-gssapi-0.6.4.tar.gz 报错 Command "python setup.py egg_info&quo ...
- [HNOI2006]超级英雄(二分+网络流)
[HNOI2006]超级英雄 题目描述 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目, ...
- UVALive 6486 Skyscrapers 简单动态规划
题意: 有N个格子排成一排,在每个格子里填上1到N的数(每个只能填一次),分别代表每个格子的高度.现在给你两个数left和right,分别表示从左往右看,和从右往左看,能看到的格子数.问有多少种情况. ...
- 【BZOJ 1045】 [HAOI2008] 糖果传递
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 思路来自hzwer.. 设xi表示第i个人往左传递了xi个糖果. (如果小于0表示旁边的人给他了糖果. 则ans=∑|xi| 最后所 ...
- 洛谷——P3374 【模板】树状数组 1
https://www.luogu.org/problem/show?pid=3374 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输 ...
- hdu5336XYZ and Drops
题意:给出r*c的网格,有的网格为空.有的有水.再给出一个爆炸点,从这个点向四周爆出四个水滴,若碰到水则融为一体,若碰到其它水滴直接跑过去互不影响.每秒可跑一格,若水中水滴数量超过4则爆开.问T秒后网 ...
- BZOJ 4034 线段树+DFS序
思路: 先搞出来每个点的DFS序 (要有入栈和出栈两种状态的) 处理出来 线段树区间有多少入栈的和多少出栈的 加区间的时候就加(入-出)*wei 查前缀和 //By SiriusRen #includ ...
- hashCode 和 equals 方法
hashCode 和 equals 方法 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法. 使用hashCode()和 ...
- oracle之dbms_output
oracle的dbms_output oracle的dbms_output的两个小问题 .如果dbms_output.put_line的内容不能显示,需要在命令行中先敲入set serveroutpu ...
- GridView单元格取值显示为
在通过GridView取一个单元格(cell)的值时,数据库中为NULL,而页面上显示为空格.发现通过gridview.cell[i].text取出来的值为 ,导致获取数据出现问题. 解决方法: 一. ...