Docker容器技术基础入门

导读:本篇文章讲解 Docker容器技术基础入门,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

一、什么是容器?

先看看我们生活中的容器。生活中见到的瓶瓶罐罐,就是容器,用来成放东西,并且保护里面的内容不被侵染。

LXC,是 Linux Container 的缩写,看名称就知道是容器了。是一种内核虚拟化技术,提供轻量级的虚拟化,以便隔离进程和资源。LXC所实现的隔离性主要是来自内核的命名空间, 其中pid,net,ipc,mnt,uts等命名空间将容器的进程、网络、消息、文件系统和hostname隔离开。

而Docker相当与是对LXC封装进行二次发行,利用LXC实现类似VM的功能。
看看Docker官网是如何介绍的:

容器是一个标准化的软件单元,它将代码及其所有依赖关系打包,以便应用程序从一个计算环境可靠快速地运行到另一个计算环境。Docker容器镜像是一个轻量的独立的可执行的软件包。包含程序运行的时候所需的一切:代码,运行时间,系统工具,系统库和设置。

Docker容器运行在Docker-Engine中,适用与Windows和Linux,无论基础架构如何,容器软件都将执行相同的运行。容器将软件与其环境隔离开来,并确保它可以统一运行,尽管开发和分段之间存在差异。

  • 标准: Docker创建了容器的行业标准,因此它们可以随处携带。
  • 轻量级:容器共享机器的操作系统内核,因此不需要每个应用程序的操作系统,从而提高服务器效率并降低服务器和许可成本。
  • 安全:应用程序在容器中更安全,Docker提供业界最强大的默认隔离功能。

二、传统虚拟化与容器的区别

传统的虚拟化技术

  • 虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
    在这里插入图片描述

在这里插入图片描述

随着硬件厂商的不断发展,很多在虚拟机里面的指令不需要通过虚拟的硬件层走到真正的硬件层.硬件厂商是支持直接在虚拟机里面实用指令操作硬件,这个技术我们就称为是硬件辅助的虚拟化.这种硬件的辅助虚拟化比起软件虚拟的硬件层来说,他不需要模拟所有的硬件.有些指令是直接运行在虚拟机上来操作硬件的.性能和效率比传统的虚拟化高更高些.

系统级别的虚拟化

  • 特点:
    • 不需要模拟硬件层.
    • 共享同一个宿主机的内核
      在这里插入图片描述

传统虚拟化和容器虚拟化的区别

在这里插入图片描述

Container的核心技术

  • CGroup限制容器的资源使用
  • Namespace机制,实现容器间的隔离
  • chroot,文件系统的隔离

CGroup

  • Linux内核提供的限制,记录和隔离进程组所使用的资源.由Google的工程师提出,后台被整合到内核中.通过不同的子系统来实现对不同资源使用的控制和记录.
/sys/fs/cgroup

Namespace

  • pid:容器有自己独立的进程表和1号线程.
  • net:容器有自己独立的network info
  • ipc:在ipc通信的时候,需要加入额外信息来标示进程
  • mnt:每个容器都有自己唯一的目录挂载
  • utc:每个容器都有独立的hostname和domain

chroot

  • 在宿主机中的某个目录就是容器中的根目录.

三、Docker介绍

Docker的由来

  • 2010年dotCloud公司在旧金山成立,PAAS平台的服务供应商;2013年dotCloud更名为Docker股份有限公司(Docker,Inc)。Docker公司专注开源容器引擎的开发,他们的容器引擎产品就叫docker,基于go语言,并遵从Apache2.0协议。Docker是目前最火的LXC高级容器管理引擎。

Docker的组成架构:

  • Docker 客户端 – Client
  • Docker 服务器 – Docker daemon
  • Docker 镜像 – Image
  • Docker 仓库 – Registry
  • Docker 容器 – Container
    在这里插入图片描述
    用一句话描述就是:Docker的客户端通过命令行或者客户端向Docker的服务端发起创建容器的请求;服务端接收请求之后,到镜像文件仓库管理器中拉取相应的镜像文件,并运用该镜像文件,运行过程中的镜像文件就是容器。容器是由镜像实例化而来,这和我们学习的面向对象的概念十分相似,我们可以把镜像看作类,把容器看作类实例化后的对象。

Docker中的容器

LXC –> libcontainer –> runC,LXC技术已经淘汰,现在用的都是libcontainer和runC

RunC 是一个轻量级的工具,它是用来运行容器的,只用来做这一件事,并且这一件事要做好。我们可以认为它就是个命令行小工具,可以不用通过 docker 引擎,直接运行容器。事实上,runC 是标准化的产物,它根据 OCI 标准来创建和运行容器。而 OCI(Open Container Initiative)组织,旨在围绕容器格式和运行时制定一个开放的工业化标准

Docker 是基于 linux 内核实现,Docker 最早采用 LXC 技术 ,LXC 是 Linux 原生支持的容器技术 ,可以提供轻量级的虚拟化 ,可以说 Docker 就是基于 LXC 发展起来 的,提供 LXC 的高级封装,标准的配置方法,在LXC的基础之上,docker提供了一系列更强大的功能。而虚拟化技术 KVM(KernelKernel-based Virtual Machine Machine) 基于 模块实现, 后来Docker 改为自己研发并开源的 runc 技术运行容器,彻底抛弃了LXC。

四、LXC

LXC简介

LXC(LinuX Containers)Linux容器,一种操作系统层虚拟化技术,为Linux内核容器功能的一个用户空间接口。它将应用软件系统打包成一个软件容器(Container),内含应用软件本身的代码,以及所需要的操作系统核心和库。透过统一的名字空间和共享API来分配不同软件容器的可用硬件资源,创造出应用程序的独立沙箱运行环境,使得Linux用户可以容易的创建和管理系统或应用容器。
在Linux内核中,提供了cgroups功能,来达成资源的隔离。它同时也提供了名称空间隔离的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户id,以及挂载的文件系统。但是cgroups并不一定需要启动任何虚拟机。

LXC利用cgroups与名称空间的功能,提供应用软件一个独立的操作系统环境。LXC不需要Hypervisor这个软件层,软件容器(Container)本身极为轻量化,提升了创建虚拟机的速度。

而Docker本质来说不是容器,而是容器的管理工具,最初的Docker也是基于LXC实现的。

LXC关键技术点:

  • chroot,根切换,从容器内的角度来看,仿佛真的有自己的根树
  • namespaces:名称空间,负责将资源隔离,比如pid,网络,mnt,user,uts等
  • CGroups:控制组,负责控制资源的分配
  • LXC基本架构

LXC基本架构

在这里插入图片描述

LXC可以做什么?

LXC可以在操作系统层次上为进程提供的虚拟的执行环境(对进程进行隔离),一个虚拟的执行环境就是一个容器。可以为容器绑定特定的cpu和memory节点,分配特定比例的cpu时间、IO时间,限制可以使用的内存大小(包括内存和是swap空间),提供device访问控制,提供独立的namespace(网络、pid、ipc、mnt、uts)。

LXC如何实现?

Sourceforge上有LXC这个开源项目,但是LXC项目本身只是一个为用户提供一个用户空间的工具集,用来使用和管理LXC容器。LXC真正的实现则是靠Linux内核的相关特性,LXC项目只是对此做了整合。基于容器的虚拟化技术起源于所谓的资源容器和安全容器。

LXC在资源管理方面依赖与Linux内核的cgroups子系统,cgroups子系统是Linux内核提供的一个基于进程组的资源管理的框架,可以为特定的进程组限定可以使用的资源。LXC在隔离控制方面依赖于Linux内核的namespace特性,具体而言就是在clone时加入相应的flag(NEWNS NEWPID等等)。

为什么要选择LXC?

LXC是所谓的操作系统层次的虚拟化技术,与传统的HAL(硬件抽象层)层次的虚拟化技术相比有以下优势:

  • 更小的虚拟化开销(LXC的诸多特性基本由内核特供,而内核实现这些特性只有极少的花费,具体分析有时间再说)
  • 快速部署。利用LXC来隔离特定应用,只需要安装LXC,即可使用LXC相关命令来创建并启动容器来为应用提供虚拟执行环境。传统的虚拟化技术则需要先创建虚拟机,然后安装系统,再部署应用。

LXC跟其他操作系统层次的虚拟化技术相比,最大的优势在于LXC被整合进内核,不用单独为内核打补丁。

LXC常用命令

  • lxc-checkconfig
    检查系统环境是否满足容器使用要求;

  • lxc-create
    创建lxc容器;
    格式:lxc-create -n NAME -t TEMPLATE_NAME

  • lxc-start
    启动容器;
    格式:lxc-start -n NAME -d

  • lxc-info
    查看容器相关的信息;
    格式:lxc-info -n NAME

  • lxc-console
    附加至指定容器的控制台;
    格式:lxc-console -n NAME -t NUMBER

  • lxc-stop
    停止容器;

  • lxc-destory
    删除处于停机状态的容器;

  • lxc-snapshot
    创建和恢复快照;

  • 退出容器方式:<Ctrl+a q>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/5587.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!