全面了解Docker

关于Docker

Docker是一个开源工具,能将一个WEB应用封装在一个轻量级,便携且独立的容器里,然后可以运行在几乎任何服务环境下。

Docker的容器能使应用跑在任何服务器上并且表现一致。一个开发者在笔记本上建立的一个容器,能跑在很多环境下,如:测试环境,生产环境,虚拟机上,VPS,OpenStack集群,公用的电脑等等

Docker的一般使用在以下几点:

  • 自动化打包和部署应用
  • 创造一个轻量级的,私人的 PAAS 环境
  • 自动化测试和连续的 整合/部署
  • 部署WEB应用,数据库和后端服务

内容列表

  • 关于Docker
  • 内容列表
  • 背景
  • 为什么关注Docker(针对开发者)
  • 为什么关注Docker(针对运营人员)
  • Docker有哪些主要的特性
  • Docker最基本的函数有哪些
  • 容器是怎么工作的?(它和虚拟机有什么区别)
  • Docker 和 dotCloud的关系是什么?

Docker历史背景介绍

为什么关注Docker(针对开发者)

构建一次 可以跑在任何环境下

“Docker 引起了我的兴趣,因为它可以做到简单的环境隔离和可重复性。我可以把代码在一个环境跑起来,打个包,然后就可以在任何机子上面再次跑这段代码。而且,是通过一种类似虚拟机机制d的主机,使得代码可以跑在独立的环境下。更另人兴奋的是,任何东西看起来都是 这么快速和简单。

为什么关注Docker(针对运营人员)

配置一次 可以跑任何代码

  • 使整个生命周期更高效,更一致,可重复性更高
  • 提高开发者的代码质量
  • 排除开发、测试、生产以及自定义环境的不一致
  • 支持职责分离
  • 在持续的发布和持续的整合新系统的情况下,可以有效的提高开发速度和代码的可靠性
  • 因为Docker容器非常轻量级,高性能,不付费,方便部署,可移植性强

Docker有哪些主要的特性

将Docker和运输的集装箱做主要特性的对比是个很好的方法。(看以下表格)

/ 物理集装箱 Docker
无关内容 集装箱几乎支持所有类型的货物 能压缩任何负载和依赖
无关硬件 标准化的尺寸和交接使得集装箱可以通过货船火车货车运输,用起重机交接不需要换一个容器或者打开集装箱 使用操作系统的基本体(像LXC)能一致的跑在几乎任何硬件下,不需要对硬件做额外的修改
内容隔离和相互作用 不需要关心铁锹会砸坏香蕉。集装箱可以一起堆放一起运输 资源、网络和内容的独立避免了依赖问题
自动化 标准化使得自动化装载卸货和移动变得方便 使用标准的操作指令去跑start/stop/commit/search等等。对运营人员:CI、CD、自动化测试、hybrid clouds
高效 不需要打开不需要改动什么,高效的点对点的方式 轻量级,几乎没有启动的消耗,高效的移植性和操控性
职责分离 发货人只需要关心箱子内部的事情,托运人只需要关心箱子外部的东西 开发者只需要关心代码层面,运营人员只需要关心服务器的基础环境

从技术方面来看,一个更多的特性,请看以下几点:

  • 文件系统分离:每一个进程容器跑在完全分离的root权限的文件系统下。
  • 资源分离:系统资源(像CPU、内存)能被指定的分配给每一个进程容器,使用cgroups。
  • 网络分离:使用一个虚拟的接口和IP地址,每一个进程容器跑在它自己的网络命名空间。
  • copy-on-write:root文件系统用copy-on-write方式进行创建,使得发布显得非常快捷,节省了内存和硬盘
  • 日志:每一个进程容器的标准数据流(标准输出/标准错误/标准输入)会被收集并且实时或者分配检索记录下来
  • 改变管理:改变一个容器的文件系统能被提交到一个新的镜像,可以被重用去创造更多的容器。不需要模板或者管理配置的要求。
  • 交互性Shell: Docker 会分配一个伪终端,在所有的容器里都可以使用标准的输入,for example to run a throwaway interactive shell.

Docker最基本的函数有哪些

Docker使得建立、修改、发布、搜索、运行容器变得简单方便。下面的这张图表将给你一个来自Docker基础的直观的感受。对于Docker来说,一个容器包含应用和所有的依赖。容器可以被手动的创造,或者如果一个源码仓库如果包含一个DockerFile的话,可以自动创建。随后,这些修改保存到一个基本的Docker镜像被提交到一个新的容器,通过commit方法推送到一个Central Registy。 在一个Docker Registry(包含公共或者私有),Docker容器能用Docker Search被找到。容器能用pull命令从Registry上被拉下来,能被运行,开始,停止等等操作。使用Docker跑命令,显然,一个在运行的命令行,能是你的服务,公共实例,也可以是他们的组合。

20160828102723

基本的Docker函数

想拿到更多的函数列表,请访问:http://docs.docker.io/en/latest/commandline/

Docker 运行的3种方式:

  • 在你的Linux主机,作为一个守护进程去管理LXC容器(sudo docker -d)
  • 使用守护进程的REST接口,在命令行界面运行(sudo run …)
  • 作为一个客户端仓库,用来分享你建立的Docker容器(docker pull,cocker commit)

容器是怎么工作的?(它和虚拟机有什么区别)

一个容器包含一个应用和它的依赖包。 在主机的操作系统里,为每个独立的用户提供独立的进程。 这和传统的虚拟机不一样。传统虚拟机(像VMWare/KVM/Xen?EC2)通过硬件虚拟化来创造一整个虚拟系统。每一个虚拟机内的应用不仅仅包含这个应用的一些类库代码(这个应用可能只有10几M),而且还包含一整个操作系统(将近10G的容量A)。

下面的图片给你展示2者的不同

20160828102731

Docker容器 VS 传统虚拟机

因为所有的容器分享一个操作系统(包含适当的文件和类库),他们显然会比虚拟机更小一些,使得他们可以存在100多个虚拟的系统在一个主机上(而不像一个严格限制数量的虚拟机)。此外,因为他们利用了主机的操作系统,重启一个虚拟的系统部意味着重启操作系统,因此,Docker容器相比之下显的更便捷和高效。

使用Docker容器,会得到更好的效率。在传统的虚拟机,每一个应用,每一个应用的副本,和一个应用要求的轻微的修改都要求重新创造一整个新的虚拟机。 像上面图标所展示的,一台主机里的一个新应用,仅仅需要这个应用和它的文件/类库,不需要新的操作系统。 如果你想在一台主机上跑几个这个应用的副本,你甚至不需要复制 已经被分享的这些文件。 最后,如果你的应用有修改,你只需要将不同的地方复制过来。

20160828102738

使得Docker容器轻量级的原理

这不仅仅使存储或者跑一个容器变得高效,还使得非常方便去更新应用,在下面这张表,你将看到更新Docker容器,你只需要更新和原版本不同的东西。

20160828102746

修改和更新容器

 

Docker 和 dotCloud的关系是什么?

Docker 是 PaaS 提供商 dotCloud 开源的一个基于 LXC 的高级容器引擎,源代码托管在 Github 上, 基于go语言并遵从Apache2.0协议开源。此处省略一些dotCloud的广告(It benefits directly from the experience accumulated over several years of large-scale operation and support of hundreds of thousands of applications and databases. dotCloud is the chief sponsor of the Docker project, and dotCloud CTO is the original architect and current, overall maintainer. While several dotCloud employees work on Docker full-time, Docker is a true community project, with hundreds of non-Docker contributors and a complete open design philosophy. All pulls, pushes, forks, bugs, issues, and roadmaps are available for viewing, editing, and commenting on GitHub.)

K8S中文社区微信公众号
分享到:更多 ()