一、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的关系:

在安装了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. 云原生系列「三」容器网络

    Docker的网络实现 标准的Docker支持以下4类网络模式. ◎ host模式:使用--net=host指定. ◎ container模式:使用--net=container:NAME_or_ID ...

  2. 云原生系列「五」我为啥又看上了serviceMesh?

    上一篇文章,说到为什么不看好服务网格,核心是没有强大的运维监控以及性能问题,那么lstio的出现让那个我们看到了一线曙光.因为实际生产活动中,各种运营上报.https证书各种对接.各种监控指标采集.流 ...

  3. 云原生系列「二」Kubernetes网络详解

    前言 K8s是一个强大的平台,但它的网络比较复杂,涉及很多概念,例如Pod网络,Service网络,Cluster IPs,NodePort,LoadBalancer和Ingress等等,这么多概念足 ...

  4. 云原生系列「四」我为啥不看好ServiceMesh?

    前言 今年,ServiceMesh(服务网格)概念在社区里头非常火,有人提出2018年是ServiceMesh年,还有人提出ServiceMesh是下一代的微服务架构基础.作为架构师,如果你现在还不了 ...

  5. 【重识云原生】第六章容器6.3.5节——Controller Manager概述

    <重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...

  6. 【重识云原生】第六章容器基础6.4.5.1节——Deployment概述

    <重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...

  7. 云原生数据库 2.0:一站式全链路数据管理与服务

    简介:5月29日,阿里云开发者大会上,阿里云数据库宣布「云原生数据库 2.0:一站式全链路数据管理与服务」的全新品牌理念及开源云原生数据库能力,首次从客户场景视角提出了一站式在线数据管理平台的理念. ...

  8. 【重识云原生】第六章容器6.1.7.2节——cgroups原理剖析

    <重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...

  9. 【重识云原生】第六章容器基础6.4.9.2节——使用 Service 连接到应用

    <重识云原生系列>专题索引: 第一章--不谋全局不足以谋一域 第二章计算第1节--计算虚拟化技术总述 第二章计算第2节--主流虚拟化技术之VMare ESXi 第二章计算第3节--主流虚拟 ...

最新文章

  1. SD-WAN:MSP连接
  2. 一些在线的WebEdit编辑器
  3. 在 SAP Kyma 上部署一个 Go MSSQL API Endpoint
  4. python odoo_Odoo开发教程20-使用 Python 虚拟环境安装 Odoo第二讲
  5. 数据结构与算法——链表题目实现
  6. 超图三维可以转换成HTML,iserver上发布的三维场景怎样调用到自己的html页面中?...
  7. 彻底解决 Jenkins Slaver 节点无法执行 Git-LFS 命令
  8. canvas读取图片,输入文字,调整文字属性,拖拽文字位置,并保存图片
  9. presto array_join函数
  10. snap7读写西门子plc1200步骤(python) PLC通讯
  11. 期刊论文发表的格式要求是什么
  12. Android 实现推送功能
  13. C语言基础——1024我把函数献给你
  14. 【题解】 [SCOI2012]滑雪
  15. 读书笔记_课外——《红楼梦》
  16. React.js学习(二)、三大属性statepropsref
  17. 什么叫克隆人_什么叫克隆人?克隆技术有什么好处,快来涨姿
  18. 拓商:如何解决客户流失率高的问题
  19. 全面讲解分布式数据库架构设计特点
  20. 智慧养老之居家养老解决方案

热门文章

  1. 你可能不知道的switch
  2. 程序员十大安全技巧(转)
  3. 台式计算机打不了蜂鸣,电脑主机启动不了,开机蜂鸣器也不响,主板指示灯
  4. 网页实现人脸识别PHP,奇思妙想-用HTML5进行人脸识别
  5. 做python自动化得时候怎么添加断言_在编写Web自动化测试用例的时候,如何写断言使新手不解,严格意义上来讲,没有断言的自动化脚本不能叫测试用例。就像功能测试一样,当测试人员做了一些操作...
  6. java string
  7. android layout background,Android LinearLayout Gradient Background
  8. nginx无法访问index.html,ThinkPHP5 + nginx配置(index.php无法访问404)
  9. python 类的知识点整理_Python opp知识整理
  10. bootstrap 可以拖动 表格宽度_word表格技巧:如何快捷调整表格