云原生系列「0」容器概述

一、Docker概述

Docker 是一个开源的 应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个 可移植的镜像中,然后发布到任何流行的Linux或Windows 机器上,也可以实现 虚拟化

1.1 什么是容器?

容器技术是一种虚拟化的方案。容器虚拟化也就是操作系统级别的虚拟化,只能运行相同或相似内核的操作系统。Docker使用的容器技术依赖于Linux内核的NamespacesCgroups和切根(chroot),这三个技术就是为了让操作系统资源被区隔成独立区间

Docker能够将开发的应用程序自动部署到容器

NameSpace

为确保提供的是轻量级虚拟化服务,Docker使用了NameSpace。命名空间提供了系统资源的隔离,资源包括进程、网络、文件系统等。

在同一个Namespace下的进程可以感知彼此的变化,而对其他的Namespace一无所知。让容器置身于独立的系统环境中。

每个运行的容器都有自己的名称空间。这是Linux操作系统默认提供的API,包括:

·PID Namespace:不同容器就是通过pid名字空间隔离开的,不同名字空间中可以有相同的pid。

·Mount Namespace:mount允许不同名称空间的进程看到的文件结构不同,因此不同名称空间中的进程所看到的文件目录就被隔离了。另外,每个名称空间中的容器在/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,也就是说可以在容器内用容器内部的用户执行程序而非主机上的用户。

Controller groups

是一种Linux提供用于限制,控制,管理资源的机制。

cgroups的功能:

  • 资源限制:子系统可为进程组设置资源使用上限。
  • 优先级设定:哪些进程组使用更多的资源。
  • 资源计量:计算进程组都使用了多少的系统资源。
  • 资源控制:能够将进程组挂起和恢复。

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

切根(change to root):

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

 在同一台机器实现了文件系统、进程、网络的隔离

1.3 虚拟机与容器的区别

相比于轻量级的容器,虚拟机会让原本只需要几十兆的应用却要动用几个G的庞然大物(操作系统)去支持。虚拟机需要模拟硬件的行为,会占用更多的资源。因为容器虚拟化了操作系统而不是硬件,导致便携性效率更高。

docker由内到外是docker daemon(守护进程),docker client(客户端),container(容器),image(镜像),network(网络),data volumes(数据卷) 

下面章节也会按照这些点进行各个突破。

Docker的基本组成有:

  • Docker Client 客户端
  • Docker Daemon 守护进程
  • Docker Image 镜像
  • Docker Container 容器
  • Docker Registry 仓库

基于C/S架构,简单来说,就是Docker客户端向守护进程发送请求,守护进程处理后会返回结果

2.2 Docker Image镜像

Docker镜像就是一个Linux的文件系统(Root FileSystem),这个文件系统里面包含可以运行在Linux内核的程序以及相应的数据。

一般而言, Linux分为两个部分:Linux内核(Linux Kernel)与用户空间,而真正的Linux操作系统,是指Linux内核,我们常用的Ubuntu、CentOS等操作系统其实是不同厂商在Linux内核基础上添加自己的软件与工具集(tools)形成的发布版本(Linux Distribution)。
因此,我们也可以把镜像看成是上面所说的用户空间,当Docker通过镜像创建一个容器时,就是将镜像定义好的用户空间作为独立隔离的进程运行在宿主机的Linux内核之上。

这里要强调一下镜像的两个特征:

  1. 镜像是分层(Layer)的:即一个镜像可以多个中间层组成,多个镜像可以共享同一中间层,我们也可以通过在镜像添加多一层来生成一个新的镜像。
  2. 镜像是只读的(read-only):镜像在构建完成之后,便不可以再修改,而上面我们所说的添加一层构建新的镜像,这中间实际是通过创建一个临时的容器,在容器上增加或删除文件,从而形成新的镜像,因为容器是可以动态改变的。

通过下面的示意图,我可以更好地理解Docker镜像与Linux的关系:

1.png

 在安装了Docker之后,我们本地并没有任何镜像,当然我们可以自己构建,不过更方便还是从Docker官方提供的仓库服务Docker Hub上拉取官方或第三方已经构建好的镜像。大的公司一般会有自己的镜像仓库:你必须知道的Docker镜像仓库的搭建 - EdisonZhou - 博客园
拉取镜像可以使用docker image pull,其格式如下:docker image pull [OPTIONS] NAME[:TAG|@DIGEST]
当然,docker image pull有更简洁的用法:如:
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
要拉取镜像,需要指定Docker Registry的URL和端口号,默认是Docker Hub,另外还需要指定仓库名和标签,仓库名和标签唯一确定一个镜像,而标签是可能省略,如果省略,则默认使用latest作为标签名,而仓库名则由作者名和软件名组成。

二、容器发展史

容器发展简史 - DockOne.io

虽然现在提到容器,大家就想到docker,但事实上容器是从1979年的Chroot Jail开始的。而docker是在2013年才开始推出第一个版本。大致发展史可以参考下图。

 主要参考:
从0开始学Docker(上) - 知乎

容器技术简述 - 知乎

Docker的三大核心组件:镜像、容器与仓库 - DockOne.io

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值