容器基础学习总结

1. 什么是容器(container)?

  • 轻量级、可移植、自包含的软件打包技术,使应用程序可以在任何地方以相同的方式运行。简单来说,容器(container)本质是一个Linux进程,它共享主机的CPU、内存等资源,为分层结构,它有自己的IP地址,并且通过端口映射方式能与公网通信(容器IP映射到主机中能访问公网的IP地址),容器就是拥有不同IP地址的Linux进程

  • 容器由两部分组成:

    (1)应用程序本身。

    (2)依赖:比如应用程序需要的库或其他软件容器在Host OS的用户空间中运行,与操作系统的其他进程隔离。

  • 容器部署和启动速度更快、开销更小,也更容易迁移。
    在这里插入图片描述

2.容器与虚拟机之间的区别

  • 虚拟机是操作系统级别的隔离;容器是进程级别的隔离。

  • 虚拟机需要有完整的操作系统;容器不需要客户机操作系统。

  • 同一虚拟机上的应用程序并没有隔离。容器镜像的轻量性和不可变性。

  • 虚拟机被vcenter Server、RHV Manager等工具管理;容器被由Kubernetes、Apache、Docker Swarm Mesos等工具管理。

  • 虚拟机包括应用程序和整个操作系统,虚拟机占用空间大,资源消耗高,可移植性差;虚拟机只包含应用程序和它运行时需要的环境,比较轻量,占用空间小,可移植性强。

在这里插入图片描述

3. 为什么使用容器?

  • 传统应用部署通过插件或脚本来安装应用,应用的运行、配置、管理、所有生存周期将与当前操作系统绑定,这样做并不利于应用的升级更新/回滚等操作。在虚拟机中部署应用时,虚拟机体量比较大,可移植性不强,迁移不便。
    • 你在Python2.7下测试,线上却运行着Python3,奇怪的事情就发生了;或者你依赖具体某个SSL版本的功能,但服务器上却安装着另外版本的SSL;你在Debian系统上进行了测试,生产环境却是Red Hat。
  • 在容器中部署应用,每个容器中的代码都可以独立测试和部署,它包含了完整的运行时环境:一个应用、这个应用所需的全部依赖、类库、其他二进制文件、配置文件,它们统一被打入了一个包中。通过将应用平台和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。
  • 相对于虚拟机,容器能快速部署,由于容器与底层设施、机器文件系统解耦的,所以它能在不同云、不同版本操作系统间进行迁移。
  • 每个容器之间互相隔离,每个容器有自己的文件系统,容器之间进程不会相互影响,能区分计算资源。
  • 容器占用资源少、部署快,每个应用可以被打包成一个容器镜像,每个应用与容器间成一对一关系
    也使容器有更大优势,使用容器可以在 build或 release的阶段,为应用创建容器镜像,因为每个应用不需要与其余的应用堆桟组合,也不依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致环境。类似地,容器比虚机轻量、更“透明”,这更便于监控和管理。
    在这里插入图片描述

4. 容器的优点

  • 快速创建/部署应用:与VM虚拟机相比,容器镜像的创建更加快速,启动速度快。
  • 持续开发、集成和部署:提供可靠且频繁的容器镜像构建/部署,并使用快速和简单的回滚(由于镜像不可变性)。
  • 开发和运行相分离:在build或者release阶段创建容器镜像,使得应用和基础设施解耦。
  • 开发,测试和生产环境一致性:在本地或外网(生产环境)运行的一致性。云平台或其他操作系统:可以在 Ubuntu、RHEL、 CoreOS、on-prem、Google Container Engine或其它任何环境中运行。容器封装了所有运行应用程序所必需的相关的细节比如应用依赖以及操作系统,所以镜像从一个环境移植到另一个环境更加灵活。
    • 同一个镜像可以在 Windows 或 Linux 或者 开发、测试或 stage 环境中运行
  • Loosely coupled,分布式,弹性,微服务化:应用程序分为更小的、独立的部件,可以动态部署和管理,提高生产力。
  • 标准化: 大多数容器基于开放标准,可以运行在所有主流 Linux 发行版、Microsoft 平台等等。
  • 安全:容器之间的进程是相互隔离的,其中的基础设施亦是如此。这样其中一个容器的升级或者变化不会影响其他容器。

5. 容器的缺点

  • 复杂性增加,管理生产环境中成百上千的容器极具挑战性。可以使用 KubernetesMesos 等工具管理具有一定规模数量的容器。
  • 原生 Linux 支持:大多数容器技术,比如 Docker,基于 Linux 容器(LXC),相比于在原生 Linux 中运行容器,在 Microsoft 环境中运行容器略显笨拙,并且日常使用也会带来复杂性。
  • 不成熟:容器技术在市场上是相对新的技术,需要时间来适应市场。开发者中的可用资源是有限的,如果某个开发者陷入某个问题,可能需要花些时间才能解决问题。
  • 由于所有容器都是与宿主机共用内核的,容器与容器之间的隔离性就会差很多。
  • 容器里面是不存放数据的,容器里面的数据会随着容器的生命周期而消失,如果想要持久化的存储,必须要依靠外部的存储设备。

6. 容器的原理

  • 为了实现容器进程对外界的隔离,容器底层主要运用了命名空间(Namespaces)、控制组(Control groups)和切根(chroot)。

    • 命名空间( Namespace)

      • 每个运行的容器都有自己的命名空间,容器之间通过命名空间隔离,这是 Linux操作系统默认提供的API,包括
        • PID Namespace:不同容器就是通过pid命名空间隔离开的,不同命名空间中可以有相同的pid。
        • Mount Namespacemount允许不同命名空间的进程看到的文件结构不同,因此不同命名空间中的进程所看到的文件目录就被隔离了。另外,每个命名空间中的容器在/proc/mounts的信息只包含当前名称的挂载点。
        • IPC Namespace:容器中进程交互还是采用Linux常见的进程交互方法(interprocess communication -IPC),包括信号量、消息队列和共享内存等。
        • Network Namespace:网络隔离是通过Net实现,每个Net有独立的网络设备,IP地址,路由表,/proc/net目录。这样每个容器的网络就能隔离开来。
        • UTS Namespace:UTS(UNIX Time-sharing System)允许每个容器拥有独立的hostname和domain name,使其在网络上可以被视作一个独立的节点而非主机上的一个进程。
        • User Namespace:每个容器可以有不同的用户和组id,也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。
      • Namespace 技术实际上修改了应用进程看待整个计算机“视图”,即它的“视线”被操作系统做了限制,只能“看到”某些指定的内容。但对于宿主机来说,这些被“隔离”了的进程跟其他进程并没有太大区别。
    • 控制组(Control groups):

      • Cgroups是Linux内核提供的一种可以限制、记录、隔离进程组的物理资源机制。
      • 因为Namespace技术只能改变进程的视觉范围,不能真实地对资源做出限制。所以就必须采用Cgroup技术对容器进行资源限制,防止某个容器把宿主机资源全部用完导致其它容器也宕掉。在Linux的/sys/fs/cgroup目录中,有cpu、memory、devices、net_cls等子目录,可以根据需要修改相应的配置文件来设置某个进程ID对物理资源的最大使用率。
    • 切根(change to root)

      • 切根的意思就是改变一个程序运行时参考的根目录位置,让不同容器在不同的虚拟根目录下工作,从而相互不直接影响。

7. 容器分类

  • 操作系统容器

    • 将操作系统内核虚拟化,可以允许多个独立用户空间的存在,而不是只有一个。这些实例有时会被称为容器、虚拟引擎、虚拟专用服务器或是 jails(FreeBSD jail 或者 chroot jail)。从运行在容器中的程序角度来看,这些实例就如同真正的计算机。
    • 要创建操作系统容器,我们可以利用容器技术,如 LXC,OpenVZ,Linux VServer,BSD Jails 和 Solaris 区域。
  • 应用容器

    • 应用程序容器旨在作为单个进程进行打包和运行服务,而在 OS 容器中,可以运行多个服务和进程。

    • 应用容器技术(容器管理器):Docker和Rocket
      在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值