docker介绍

一、容器

1.Docker 和虚拟机,物理主机

操作系统的的组成
  • Bootloader:它负责设备的启动过程。
  • Shell:Shell是一种编程语言,它可以控制其他文件,进程以及所有其他程序。
  • Kernel:它是操作系统的主要组件,管理内存,CPU和其他相关组件。
  • Desktop Environment:这是用户通常与之交互的环境。
  • Graphical server(图形服务器):它是操作系统的子系统,用于在屏幕上显示图形
  • Applications: 这些是执行不同用户任务(例如word,excel等)的程序集。
  • Daemons : 后台服务提供商。
什么是内核kernel
内核是操作系统的关键组件。 它借助进程间通信和系统调用,在硬件级别上充当应用程序和数据处理之间的桥梁。
每当将操作系统加载到内存中时,首先,将加载内核并将其保留在那里,直到操作系统关闭。 内核负责处理低级任务,例如任务管理,内存管理,风险管理等。
内核的任务
  • 用于应用程序执行的流程管理。
  • 内存和I / O(输入/输出)管理。
  • 系统调用控制(内核的核心行为)。
  • 借助设备驱动程序进行设备管理。
内核空间
内核处于提升的系统状态,其中包括受保护的内存空间以及对设备硬件的完全访问权限。 此系统状态和内存空间统称为内核空间。 在内核空间内,对硬件和系统服务的核心访问进行管理,并作为服务提供给系统的其余部分。
用户空间
用户空间或用户域是在操作系统内核环境之外运行的代码,用户空间定义为操作系统用来与内核连接的各种应用程序或程序或库。
用户的应用程序是在用户空间中执行的,它们可以通过内核系统调用访问计算机可用资源的一部分。 通过使用内核提供的核心服务,可以创建用户级别的应用程序,例如游戏或办公软件。
  • 传统虚拟机是虚拟出一个主机硬件,并且运行一个完整的操作系统 ,然后在这个系统上安装和运行软件
  • 容器内的应用直接运行在宿主机的内核之上,容器并没有自己的内核,也不需要虚拟硬件,相当轻量化
  • 每个容器间是互相隔离,每个容器内都有一个属于自己的独立文件系统,独立的进程空间,网络空间,用户空间等,所以在同一个宿主机上的多个容器之间彼此不会相互影响

二、Docker

1.什么是docker

Docker是一个开源的应用容器引擎,基于go语言开发,用于运行容器里的应用。
Docker也可以作为管理容器和镜像的一种工具。

2.Docker和传统虚拟机的区别

Docker容器

虚拟机

特性

所有容器共享宿主机内核

每个虚拟机都有独立的操作系统和内核

隔离性

通过namespace实现资源隔离,通过cgroup实现限制资源的最大使用量

完全隔离,每个虚拟机都有独立的硬件资源

启动速度

秒级启动速度

分钟级启动速度

性能损耗

容器相当于宿主机的进程,性能几乎没有损耗

需要通过hypervisor虚拟机管理程序对宿主机资源虚拟访问,至少有20%~50%的性能损耗

系统支持量(单机)

单机容量能够支持成百上千个容器

单机容量最多支持几十个虚拟机

3.Docker核心概念

Docker有三个核心概念:镜像、容器和仓库。

镜像

镜像是创建容器的基础
镜像是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)

容器

容器是用镜像运行的实例
容器可以被创建、启动、停止、删除,每个容器之间默认是相互隔离的。

仓库

仓库是用来保存镜像的地方
仓库有公有仓库和私有仓库之分。

4.Linux中的namespace( 命名空间)

六个命名空间和隔离内容

namespace

系统调用参数

隔离内容

UTS

CLONE_NEWUTS

主机名与域名

IPC

CLONE_NEWWIPC

信号量、消息队列和共享内存

PID

CLONE_NEWPID

进程编号

NETWORK

CLONE_NEWNET

网络设备、网络栈、端口等

MOUNT

CLONE_NEWNS

挂载点(文件系统)

USER

CLONE_NEWUSER

用户和用户组(3.8以后的内核才支持)

5.Namespace

一个宿主机运行了N个容器,多个容器共用一个 OS,必然带来的以下问题:
  • 怎么样保证每个容器都有不同的文件系统并且能互不影响?
  • 一个docker主进程内的各个容器都是其子进程,那么如果实现同一个主进程下不同类型的子进程?各个容器子进程间能相互通信(内存数据)吗?
  • 每个容器怎么解决IP及端口分配的问题?
  • 多个容器的主机名能一样吗?
  • 每个容器都要不要有root用户?怎么解决账户重名问题
namespace是Linux系统的底层概念,在内核层实现,即有一些不同类型的命名空间被部署在核内,各个docker容器运行在同一个docker主进程并且共用同一个宿主机系统内核,各docker容器运行在宿主机的用户空间,每个容器都要有类似于虚拟机一样的相互隔离的运行空间,但是容器技术是在一个进程内实现运行指定服务的运行环境,并且还可以保护宿主机内核不受其他进程的干扰和影响,如文件系统空间、网络空间、进程空间等,目前主要通过以下技术实现容器运行空间的相互隔离:

隔离类型

功能

系统调用参数

MNT Namespace(mount)

提供磁盘挂载点和文件系统的隔离能力

CLONE_NEWNS

IPC Namespace(Inter-Process Communication)

提供进程间通信的隔离能力,包括信号量,消息队列和共享内存

CLONE_NEWIPC

UTS Namespace(UNIXTimesharing System)

提供内核,主机名和域名隔离能力

CLONE_NEWUTS

PID Namespace(ProcessIdentification)

提供进程隔离能力

CLONE_NEWPID

Net Namespace(network)

提供网络隔离能力,包括网络设备,网络栈,端口等

CLONE_NEWNET

User Namespace(user)

提供用户隔离能力,包括用户和组

CLONE_NEWUSER

TimeNamespace

提供时间隔离能力

CLONE_NEWTIME

syslogNamespace

提供syslog隔离能力

syslognamespace是由华为工程师RuiXiang(瑞翔)提出的,但没有合并到linux内核中,后systemd在2020年2在2020年2 月实现了一个名为“journalnamespace”的类似功能

Controlgroup(cgroup)Namespace

提供进程所属的控制组的身份隔离

6.Control groups

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

cgroups 具体实现

  • blkio: 块设备IO限制
  • cpu: 使用调度程序为 cgroup 任务提供 cpu 的访问
  • cpuacct: 产生 cgroup 任务的 cpu 资源报告
  • cpuset: 如果是多核心的 cpu,这个子系统会为 cgroup 任务分配单独的 cpu 和内存
  • devices: 允许或拒绝 cgroup 任务对设备的访问
  • freezer: 暂停和恢复 cgroup 任务
  • memory: 设置每个 cgroup 的内存限制以及产生内存资源报告
  • net_cls: 标记每个网络包以供 cgroup 方便使用
  • ns: 命名空间子系统
  • perf_event: 增加了对每 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程

容器管理工具

Docker
相当于增强版的LXC,功能更为强大和易用,也是当前最主流的容器前端管理工具Docker 先启动一个容器也需要一个外部模板,也称为镜像,docke的镜像可以保存在一个公共的地方共享使用,只要把镜像下载下来就可以使用,最主要的是可以在镜像基础之上做自定义配置并且可以再把其提交为一个镜像,一个镜像可以被启动为多个容器。
pouch
Pouch (小袋子)起源于 2011 年,并于2017年11月19日上午,在中国开源年会现场,阿里巴巴正式开源了基于 Apache 2.0 协议的容器技术 Pouch。Pouch 是一款轻量级的容器技术,拥有快速高效、可移植性高、资源占用少等特性,主要帮助阿里更快的做到内部业务的交付,同时提高超大规模下数据中心的物理资源利用率

7.容器 runtime

runtime是真正运行容器的地方,因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持,以便为容器提供相应的运行环境
runtime 类型:
  •  runc: 早期libcontainer是Docker公司控制的一个开源项目,OCI的成立后,Docker把libcontainer项目移交给了OCI组织,runC就是在libcontainer的基础上进化而来,目前Docker默认的runtime,runc遵守OCI规范

低级容器运行时与高级容器运行时

  • High-Level:高级运行时提供基于API的远程管理操作,客户端可以通过高级别运行时管理容器的整个生命周期(创建、删除、重启、停止),高级别运行时并不真正直接运行容器,而是调用低级别运行时运行,比如dockerd、containerd都是高级别运行时。
  • Low-Level:接受高级别运行时的指令,按照相应的指令运行容器,因此低级别运行时真是运行容器的地方,例如runc

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值