Docker学习(01)--简介
Posted 剑威
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker学习(01)--简介相关的知识,希望对你有一定的参考价值。
简介
- Docker 是运行于Linux和Windows上的软件,用于创建、管理和编排容器。
- Docker 是Moby开源项目的一部分。
- Docker 源于英国口语,意为码头工人(Dock Worker)。
我们在谈论Docker时,一般是指Docker引擎,是用于运行和编排容器的基础设施工具,类似VMware的ESXi(详见 ESXi百度百科)。ESXi是运行虚拟机的核心管理程序,而Docker引擎是运行容器的核心容器运行时。
VM技术和容器技术对比
Docker公司的其他产品或第三方的产品都是围绕Docker引擎进行开发和集成的。
Docker引擎主要有两个版本:企业版(EE)和社区版(CE),每个季度企业版和社区版都会发布一个稳定版本,社区版会提供4个月的支持,而企业版会提供12个月的支持。
从2017年第一季度开始,Docker 版本号遵循YY.MM-xx格式,例如2019年6月第一次发布的社区版本为19.06.0-ce。
在应用中,Docker一般指开源Docker项目,包括一系列工具(Docker的服务端和客户端)。在2017年该开源项目正式命名为Moby,GitHub上的docker/docker库也迁移到moby/moby。当前,该引擎中的代码逐步拆分和模块化,多数项目和工具都是基于Golang开发。
Docker公司核心哲学
【Batteries Included but Removable】
一个完整的Docker有以下几个部分组成:
-
DockerClient客户端
-
Docker Daemon守护进程
-
Docker Image镜像
-
DockerContainer容器
架构
Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。Docker 容器通过 Docker 镜像来创建。
容器与镜像的关系类似于面向对象编程中的对象与类。
Docker | 面向对象 |
容器 | 对象 |
镜像 | 类 |
Docker采用 C/S架构 Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建、运行、分发容器)。 客户端和服务端既可以运行在一个机器上,也可通过 socket 或者RESTful API 来进行通信。
Docker daemon 一般在宿主主机后台运行,等待接收来自客户端的消息。 Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟 Docker daemon 交互。
特性
-
应用打包与部署自动化
-
创建轻量、私密的PAAS环境
-
实现自动化测试和持续的集成/部署
-
部署与扩展web apps、数据库和后台服务
由于是基于LXC的轻量级虚拟化,docker相比KVM最大的特点就是启动快,资源占用小。因此更有利于构建隔离的标准化运行环境、轻量级的PaaS、构建自动化测试和持续集成环境、以及所有可以横向扩展的应用、尤其是需要快速启停来应对峰谷的web应用 。
-
构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题。
-
PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础。
-
因为其标准化构建方法(build file)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来。
-
因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源
局限
Docker并不是全能的,设计之初也不是KVM虚拟化手段的替代品,简单总结几点:
-
Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用。
-
LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的。
-
隔离性相比KVM的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。
-
网络管理相对简单,主要是基于namespace隔离。
-
cgroup的cpu和cpuset提供的cpu功能相比KVM的虚拟化方案相比难以度量。
-
Docker对disk的管理比较有限
-
container随着用户进程的停止而销毁,container中的log等用户数据不便收集
针对1-2,有windows base应用的需求的基本可以pass了
针对3-5,主要是看用户的需求,到底是需要一个container还是一个VM, 同时也决定了docker作为 IaaS 不太可行。
针对6-7,虽然是docker本身不支持的功能,但是可以通过其他手段解决(disk quota, mount --bind)。
总之,选用Container还是VM, 就是在隔离性和资源复用性上做权衡。
另外,即便docker 0.7能够支持非AUFS(Advanced Mult-Layered Unification Filesystem)的文件系统,但是由于其功能还不稳定,商业应用或许会存在问题,而AUFS的稳定版需要kernel 3.8, 所以如果想复制dotCloud的成功案例,可能需要考虑升级 kernel 或者换用 ubuntu 的 server 版本(后者提供 deb 更新)。这也是为什么开源界更倾向于支持 ubuntu 的原因( kernel 版本)
Docker并非适合所有应用场景,Docker只能虚拟基于Linux的服务。Windows Azure 服务能够运行Docker实例,但到目前为止Windows服务还不能被虚拟化。
可能最大的障碍在于管理实例之间的交互。由于所有应用组件被拆分到不同的容器中,所有的服务器需要以一致的方式彼此通信。这意味着任何人如果选择复杂的基础设施,那么必须掌握应用编程接口管理以及集群工具,比如Swarm、Mesos或者Kubernets以确保机器按照预期运转并支持故障切换。
Docker在本质上是一个附加系统。使用文件系统的不同层构建一个应用是有可能的。每个组件被添加到之前已经创建的组件之上,把它比作一个文件系统更清晰。分层架构带来另一方面好处是效率提升,当你重建存在变化的Docker镜像时,不需要重建整个Docker镜像,只需要重建变化的部分。
针对Docker环境存在的不足,意味着在开始部署Docker前需要考虑如下几个问题。首先,Docker实例是无状态的。这意味着它们不应该承载任何交易数据,所有数据应该保存在数据库服务器中。其次,开发Docker实例并不像创建一台虚拟机、添加应用然后克隆那样简单。为成功创建并使用Docker基础设施,管理员需要对系统管理的各个方面有一个全面的理解,包括Linux管理、编排及配置工具比如Puppet、Chef以及Salt。这些工具生来就基于命令行以及脚本。
原理
Docker核心解决的问题是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同VM的方式不同, LXC 其并不是一套硬件虚拟化方法 - 无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法, 理解起来可能并不像VM那样直观。所以我们从虚拟化到docker要解决的问题出发,看看他是怎么满足用户虚拟化需求的。
用户需要考虑虚拟化方法,尤其是硬件虚拟化方法,需要借助其解决的主要是以下4个问题:
-
隔离性 - 每个用户实例之间相互隔离, 互不影响。 硬件虚拟化方法给出的方法是VM, LXC给出的方法是container,更细一点是kernel namespace
-
可配额/可度量 - 每个用户实例可以按需提供其计算资源,所使用的资源可以被计量。硬件虚拟化方法因为虚拟了CPU, memory可以方便实现, LXC则主要是利用cgroups来控制资源
-
移动性 - 用户的实例可以很方便地复制、移动和重建。硬件虚拟化方法提供snapshot和image来实现,docker(主要)利用AUFS实现
-
安全性 - 这个话题比较大,这里强调是host主机的角度尽量保护container。硬件虚拟化的方法因为虚拟化的水平比较高,用户进程都是在KVM等虚拟机容器中翻译运行的, 然而对于LXC, 用户的进程是lxc-start进程的子进程, 只是在Kernel的namespace中隔离的, 因此需要一些kernel的patch来保证用户的运行环境不会受到来自host主机的恶意入侵, dotcloud(主要是)利用kernel grsec patch解决的.
以上是关于Docker学习(01)--简介的主要内容,如果未能解决你的问题,请参考以下文章