Docker学习一之概述 why docker?

本人要开始学docker了,不知道怎么就越走越远了呢,每天在自我怀疑中循环往复,我应该感谢所有外力的推动,但内心又在挣扎“这不是我喜欢的”,可是姐妹们都在提醒我成年人了,谁还会为“喜欢”活着,走走看吧。(我还是个孩子,我依旧不想长大)

太专业的解释小白理解不了,这个我看懂了,感谢

摘自:https://zhuanlan.zhihu.com/p/54512286

           https://mp.weixin.qq.com/s/6dmGa6IwWVZfSCWmnnuq3g

           https://zhuanlan.zhihu.com/p/39171987

 摘要几点:

一、Why Docker

1.Docker是什么

2.Docker特点

3.Docker与虚拟机

4.Docker的好处

一、概述

1.什么是Docker

  Containers are just normal Linux Processes with additional configuration applied. 

  • Docker是世界领先的软件容器平台。

  • Docker使用Google公司推出的Go语言进行开发实现,基于Linux内核的cgroup,namespace,以及AUFS类的UnionFS等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。 由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。

  • Docker能够自动执行重复性任务,例如搭建和配置开发环境,从而解放了开发人员以便他们专注在真正重要的事情上:构建杰出的软件。

  • 用户可以方便地创建和使用容器,把自己的应用放入容器。容器还可以进行版本管理、复制、分享、修改,就像管理普通的代码一样。

2.Docker特点

  • 轻量,在一台机器上运行的多个Docker容器可以共享这台机器的操作系统内核;它们能够迅速启动,只需占用很少的计算和内存资源。镜像是通过文件系统层进行构造的,并共享一些公共文件。这样就能尽量降低磁盘用量,并能更快地下载镜像。
  • 标准,Docker容器基于开放式标准,能够在所有主流Linux版本、Microsoft Windows以及包括VM、裸机服务器和云在内的任何基础设施上运行。

  • 安全,Docker赋予应用的隔离性不仅限于彼此隔离,还独立于底层的基础设施。Docker默认提供最强的隔离,因此应用出现问题,也只是单个容器的问题,而不会波及到整台机器。

3.Docker与虚拟机

容器 VS 虚拟机

简单来说: 容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。

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

容器与虚拟机 (VM) 总结

 

  • 容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比, 容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。

  • 虚拟机(VM)是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个VM在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且VM启动也十分缓慢 。

通过Docker官网,我们知道了这么多Docker的优势,但是大家也没有必要完全否定虚拟机技术,因为两者有不同的使用场景。虚拟机更擅长于彻底隔离整个运行环境。例如,云服务提供商通常采用虚拟机技术隔离不同的用户。而Docker通常用于隔离不同的应用 ,例如前端,后端以及数据库。

4.Docker能带来什么好处

①开发人员不必再考虑环境(开发、测试、生产)不同带来的麻烦(1.1)

  实现方式:镜像

  • 之前:在开发环境构建出了一个war包,想跑到Linux下运行。我们得先在Linux下载好Java、Tomcat、MySQL,配置好对应的环境变量,将war包丢到Tomcat的webapps文件夹下,才能跑起来。
  • 现在:在Linux下直接拉取一份镜像(各种环境都配好了),将镜像运行起来,把war包丢进去就好了。

 ② 运维人员可以在隔离容器中并行运行和管理应用,获得更好的计算密度(1.2)

  实现方式:linux的namespace和cgroup。解决应用间隔离。

 ③企业可以构建敏捷的软件交付管道,可以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

  • 之前,Windows和Mac使用Docker实际上就是跑了一层Linux虚拟机。
    • 比如在Windows下安装的是Docker Toolbox,它需要Oracle Virtual Box来跑Docker
  • 现在,Windows和Mac都已经原生支持Docker了。但需要一些安装的条件,详情可以查看官网
    • 比如Windows:Docker for Windows requires 64bit Windows 10 Pro and Microsoft Hyper-V

所以,docker可以做什么?

  • 将一整套环境打包封装成镜像,无需重复配置环境,解决环境带来的种种问题。
  • Docker容器间是进程隔离的,谁也不会影响谁。

4.1 namespace & cgroups

简单来说,就是:

       namespace做隔离

       cgroup做资源限制

Linux Namespace 帮助进程隔离出自己的单独空间,而 Cgroups 则可以限制每个空间的大小。Cgroups 提供了对一组进程及将来子进程的资源限制、控制和统计的能力。

复杂一点,就是:

Namespace
Namespace又称为命名空间,它主要做访问隔离(环境的隔离)。其原理是针对一类资源进行抽象,并将其封装在一起提供给一个容器使用,对于这类资源,因为每个容器都有自己的抽象,而他们彼此之间是不可见的,所以就可以做到访问隔离。namespace 主要有以下namespace:

  • UTS(Unix Timesharing System) :进程隔离。允许每个container拥有独立的hostname(主机名)和domainname(域名),使其在网络上可以被视作一个独立的节点而非Host上的一个进程。
  • IPC(InterProcess Communication):管理跨进程通信的访问。contaner中进程交互还是采用linux常见的进程间交互方法,包括常见的信号量,消息队列和共享内存。container的进程间交互实际上还是host上具有相同pid中的进程交互。
  • PID(Process ID):隔离进程。不同用户的进程就是通过pid namesapce隔离开的,且不同namespace中可以有相同pid。所有的LXC(linux containers)进程在docker中的父进程为docker进程,每个LXC进程具有不同的namespace。
  • NET(Network):管理网络隔离。不同用户的进程就是通过pidnamespace隔离开的,且不同namespace中可以有相同pid。所有的LXC进程在docker中的父进程为docker进程,每个lxc进程具有不同的namespace。
  • MNT(Mount) 管理文件系统挂载点。用来隔离各个进程看到的挂载点视图。
  • USRE:主要是隔离用户的用户组 ID。每个container可以有不同的user和groupid,也就是说可以在container内部用container内部的用户执行程序而非Host上的用户。

只要解耦了这6项,其他系统资源即便有共用的情况,计算机也认为是在两个不同的系统中。

Cgroup
 Cgroup是control group,又称为控制组,它主要是做资源控制。原理是将一组进程放在放在一个控制组里,通过给这个控制组分配指定的可用资源,达到控制这一组进程可用资源的目的。

一个容器如果不对其做任何资源限制,则宿主机会允许其占用无限大的内存空间,有时候会因为代码bug程序会一直申请内存,直到把宿主机内存占完。
为了避免此类的问题出现,宿主机有必要对容器进行资源分配限制,比如CPU,内存等,Linux Cgroups的全称是Linux Control Groups,它最主要的作用就是限制一个进程组能够使用的资源上限,包括CPU,内存,磁盘,网络带宽等等。
此外,Linux Cgroups还能够对进程优先级设置,以及将进程挂起和恢复等操作。

cgroup的作用:

  • 资源的限制:cgroup可以对进程组使用的资源总额进行限制。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory)。
  • 优先级分配:通过分配的cpu时间片数量及磁盘IO带宽大小,实际上就是相当于控制了进程运行的优先级。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
  • 资源统计:Cgroup可以统计系统资源使用量。比如cpu使用时间,内存使用量等。可用于按量计费。
  • 进程控制可以对进程组执行挂起,恢复等操作。比如:使用freezer子系统可以将进程组挂起和恢复。

再详细一点,参考:

https://www.cnblogs.com/yinzhengjie/p/12183066.html

https://www.centos.bz/2018/08/docker-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86%E4%B9%8B-namespace-cgroup/

https://segmentfault.com/a/1190000009732550

https://zhuanlan.zhihu.com/p/55099839

https://blog.csdn.net/qq_43337384/article/details/105921675

https://www.jb51.net/article/173009.html

2.2 LXC(Linux Container)

lxc是早期版本docker的一个基础组件,docker 主要用到了它对 Cgroup 和 Namespace 两个内核特性的控制。新的Docker版本已经移除了对LXC的support。Docker推出libcontainer自己集成了linux内核中的很多特性,作为一个独特、稳定且不受制于Linux的library,来实现自己生态系统的独立。

 详见:https://www.linuxidc.com/Linux/2016-03/128785.htm

 

posted on 2020-10-26 11:00  roger888  阅读(142)  评论(0编辑  收藏  举报

导航