zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    zz解读NoSQL技术代表之作Dynamo
    愚蠢且能干
    Schema 验证和 DTD 验证
    Office Addin (VSTO) Performance Tips & Tricks
    提高 .NET 应用 XML 处理性能的几点开发经验(转载)
    C# 实现对XML文件的基本操作(创建xml文件,增、删、改、查 xml节点信息)zz
    XML/XSLT/XPATH
    Linux下基于DNS的多机均衡负载的实现
    Linux 上的高可用中间件,第 3 部分: IBM LoadLeveler
    Creating Web Services using Apache
  • 原文地址:https://www.cnblogs.com/roger888/p/13877380.html
Copyright © 2011-2022 走看看