技术笔记分享

Docker官网 https://www.docker.com/
Docker镜像源下载地址 https://hub.docker.com/explore/

Docker概念

Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化;Docker是 dotCloud 公司开源的一个基于 LXC 的高级容器引擎,源代码托管在Github上,基于go语言开发并遵从 Apache2.0 协议开源;Docker和其它虚拟化不同的是,Docker是通过虚拟化技术来提供容器资源隔离与安全保障,由于Docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要类似虚拟机(VM)额外的操作系统开销,提高资源利用率。

扩展

LXC 为 Linux Container 的简写。Linux Container 容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源,而且还需要提供命令解释机制以及全虚拟化的其他复杂性。LXC 主要通过来自 kernel 的 namespace 实现每个用户实例之间的相互隔离,通过 cgroup 实现对资源的配额和度量。

Docker核心

Docker核心的东西主要为:Control Groups、Namespace
Cgroups实现了资源控制、Namespace实现了资源隔离

CGroup

cgroup是control groups的缩写,是Linux内核提供的一种可以限制、记录、隔离进程组所使用的物理资源的机制。物理资源如:cpu、memmory、IO等等。该机制最初有google工程师提出,后来被整合进linux内核,cgroups也是LXC为实现虚拟化所使用的资源管理手段。

undefined

Namespace

namespace是对内核内的全局资源的封装,使得每一个namespace中都有一份独立的资源,因此不同进程在各自的namespace中对同一份资源进行操作互不影响。

undefined

小结

假如我们有四个容器,就需要有四个namespace(命令空间)和四个cgroup;内核把硬件资源按自己规划分配给各个cgroup,例如分给第一个cgroup 2颗CPU、4G内存、50G硬盘、100M带宽等,分给其它cgroup各不一样;然后再把每个cgroup应用到namespace上,每个容器就有了独立的硬件资源,从而实现了物理资源隔离。这个机制就防止了假如有一台容器疯狂申请硬件资源从而导致其它容器硬件资源不足。

Docker组成

Docker为C/S架构,即为Docker Server/Client;使用远程API来管理Docker容器。
Docker进程可以比喻为Docker Server

undefined

Docker内的容器可以比喻为Docker Client

undefined

注:如果docker的服务端挂了,运行在docker的容器全部会挂掉

Docker架构Docker架构

架构示意图

undefined

Docker_Client

运行docker命令的client。

Docker_daemon

包含Images(docker镜像)及Containers(Docker容器)的Docker daemon(docker守护进程)主机

Docker_Registry

docker用来保存镜像的仓库,也可以理解为代码控制中的代码仓库,不过 Docker Hub提供了庞大的镜像集合供使用

小结

上面讲到了Docker服务端是使用远程API来管理Docker容器的,而他们之间使用的是什么协议呢?
是HTTPS协议,由上面的架构图所示,Docker Client到Docker_HOST之间通讯使用的就是HTTPS协议,当我们去Docker hub下载镜像的时候,从Registry下载到Images之间使用的也是HTTPS协议。

Docker工作流程

1.Client使用 docker pull 命令从仓库把image拉到docker_host,默认拉取的仓库地址是 Docker Hub;获取到image后会放到Docker Image内

2.Client使用 docker run -it –rm
/bin/bash命令在Docker_Host上启动该镜像为容器运行

注:image和container之间的关系类似程序与进程之间的关系,一个静若处子,一个动如脱兔。比如程序QQ,运行一次就是1个QQ进程,再运行一个QQ就是第2个QQ进程。同样道理,一个image也可以运行多份container。

Docker应用场景

常用的8个Docker的真实使用场景,分别是简化配置、代码流水线管理、提高开发效率、隔离应用、整合服务器、调试能力、多租户环境、快速部署。我们一直在谈Docker,Docker怎么使用,在怎么样的场合下使用?

undefined

简化配置

这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件、系统),Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署,同一个Docker的配置可以在不同的环境中使用,这样就降低了硬件要求和应用环境之间耦合度。

代码流水线管理

前一个场景对于管理代码的流水线起到了很大的帮助。代码从开发者的机器到最终在生产环境上的部署,需要经过很多的中间环境。而每一个中间环境都有自己微小的差别,Docker给应用提供了一个从开发到上线均一致的环境,让代码的流水线变得简单不少。

提高开放效率

这就带来了一些额外的好处:Docker能提升开发者的开发效率。如果你想看一个详细一点的例子,可以参考Aater在DevOpsDays Austin 2014 大会或者是DockerCon上的演讲。不同的开发环境中,我们都想把两件事做好。一是我们想让开发环境尽量贴近生产环境,二是我们想快速搭建开发环境。理想状态中,要达到第一个目标,我们需要将每一个服务都跑在独立的虚拟机中以便监控生产环境中服务的运行状态。然而,我们却不想每次都需要网络连接,每次重新编译的时候远程连接上去特别麻烦。这就是Docker做的特别好的地方,开发环境的机器通常内存比较小,之前使用虚拟的时候,我们经常需要为开发环境的机器加内存,而现在Docker可以轻易的让几十个服务在Docker中跑起来。

隔离应用

有很多种原因会让你选择在一个机器上运行不同的应用,比如之前提到的提高开发效率的场景等。

整合服务器

正如通过虚拟机来整合多个应用,Docker隔离应用的能力使得Docker可以整合多个服务器以降低成本。由于没有多个操作系统的内存占用,以及能在多个实例之间共享没有使用的内存,Docker可以比虚拟机提供更好的服务器整合解决方案。

调试能力

Docker提供了很多的工具,这些工具不一定只是针对容器,但是却适用于容器。它们提供了很多的功能,包括可以为容器设置检查点、设置版本和查看两个容器之间的差别,这些特性可以帮助调试Bug。

多租户环境

另外一个Docker有意思的使用场景是在多租户的应用中,它可以避免关键应用的重写。我们一个特别的关于这个场景的例子是为IoT(译者注:物联网)的应用开发一个快速、易用的多租户环境。这种多租户的基本代码非常复杂,很难处理,重新规划这样一个应用不但消耗时间,也浪费金钱。使用Docker,可以为每一个租户的应用层的多个实例创建隔离的环境,这不仅简单而且成本低廉,当然这一切得益于Docker环境的启动速度和其高效的diff命令。

快速部署

在虚拟机之前,引入新的硬件资源需要消耗几天的时间。虚拟化技术(Virtualization)将这个时间缩短到了分钟级别。而Docker通过为进程仅仅创建一个容器而无需启动一个操作系统,再次将这个过程缩短到了秒级。这正是Google和Facebook都看重的特性。

Docker优点

  • 1.灵 活:即使是最复杂的应用也可以集装箱化。
  • 2.轻量级:容器利用并共享主机内核。
  • 3.可互换:您可以即时部署更新和升级。
  • 4.便携式:您可以在本地构建,部署到云,并在任何地方运行。
  • 5.可扩展:您可以增加并自动分发容器副本。
  • 6.可堆叠:您可以垂直和即时堆叠服务。

Docker与传统虚拟机的区别

Docker与虚拟机

undefined
undefined

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

Docker与OpenStack

undefined

发表评论

邮箱地址不会被公开。 必填项已用*标注