Docker和传统虚拟机的区别

       

参考文章:

https://lwn.net/Articles/531114/    操作中的命名空间详解

https://blog.yadutaf.fr/page/2/

https://ruby-china.org/topics/22004    Docker 介绍以及其相关术语、底层原理和技术

http://tiewei.github.io/cloud/Docker-Getting-Start/

https://blog.csdn.net/zmx729618/article/details/72930474

http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html

主机级虚拟化

Type-I:直接在硬件平台上安装虚拟机管理器Hypervisor,在硬件上不需要再安装宿主机操作系统,而是直接安装Hypervisor,然后在Hypervisor上安装虚拟机;

Type-II:首先在物理机上安装一个主机操作系统(HostOS),即宿主机操作系统,然后在宿主机上安装VMM(Virtual Machine Manager,虚拟机管理器,例如VMware_workstation),在VMware_workstation软件上创建虚拟机。

容器级虚拟化

Control Groups(cgroups) 把系统级的资源分成多个组,然后把每一个组内的资源量分配到特定用户空间进程上

https://tech.meituan.com/2015/03/31/cgroups.html   可重点参考

https://en.wikipedia.org/wiki/Cgroups

https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html

cgroups 的全称是control groups,cgroups为每种可以控制的资源定义了一个子系统。典型的子系统介绍如下:

  1. cpu 子系统,主要限制进程的 cpu 使用率。
  2. cpuacct 子系统,可以统计 cgroups 中的进程的 cpu 使用报告。
  3. cpuset 子系统,可以为 cgroups 中的进程分配单独的 cpu 节点或者内存节点。
  4. memory 子系统,可以限制进程的 memory 使用量。
  5. blkio 子系统,可以限制进程的块设备 io。
  6. devices 子系统,可以控制进程能够访问某些设备。
  7. net_cls 子系统,可以标记 cgroups 中进程的网络数据包,然后可以使用 tc 模块(traffic control)对数据包进行控制。
  8. freezer 子系统,可以挂起或者恢复 cgroups 中的进程。
  9. ns 子系统,可以使不同 cgroups 下面的进程使用不同的 namespace。

cgroups 实现了对资源的配额和度量。 cgroups 的使用非常简单,提供类似文件的接口,在 /cgroup 目录下新建一个文件夹即可新建一个 group,在此文件夹中新建 task 文件,并将 pid 写入该文件,即可实现对该进程的资源控制。具体的资源配置选项可以在该文件夹中新建子 subsystem ,{子系统前缀}.{资源项} 是典型的配置方法, 如 memory.usageinbytes 就定义了该 group 在 subsystem memory 中的一个内存限制选项。 另外,cgroups 中的 subsystem 可以随意组合,一个 subsystem 可以在不同的 group 中,也可以一个 group 包含多个 subsystem - 也就是说一个 subsystem。

Container可以当作隔离环境管理器,在其上面创建一个个隔离环境,然后把要运行的隔离出来的进程运行在隔离环境中。内核提供的是内核空间,进程运行在用户空间,当进程运行在一个隔离环境中的话,那么隔离的就是用户空间,这就把用户空间隔离成多组。这些被隔离的用户进程共享底层同一个内核,但进程运行空间的边界就是被隔离的用户空间的边界。这些被隔离的、运行进程的用户空间就叫容器。

一旦进程出现故障,除了感染所属容器,是否会干扰其他容器的进程?利用jail。

jail被应用到linux上后叫vserver,vserver所实现的功能有chroot,切换根目录。

参考:https://blog.csdn.net/zmx729618/article/details/72930474

一个用户空间主要目标是实现环境隔离的,任何进程运行在此用户空间中会认为它是唯一运行在内核上用户空间的进程。

一个用户空间应该包括的组件:

Linux支持6种Namespace:

  1. UTS: 主机名(本文)
  2. IPC: 进程间通信
  3. PID: "chroot"进程树
  4. NS: 挂载点,首次登陆Linux(mnt命名空间: 使用在管理挂载点 (MNT: Mount)
  5. NET: 网络接入,包括接口
  6. USER: 将本地的虚拟user-id映射到真实的user-id

1、UTS namespace(主机名和域名);  http://blog.lucode.net/linux/intro-Linux-namespace-1.html

UTS ("UNIX Time-sharing System") namespace 允许每个 container 拥有独立的 hostname 和 domain name, 使其在网络上可以被视作一个独立的节点而非 Host 上的一个进程。

2、Mount namespace(根文件系统);

类似 chroot,将一个进程放到一个特定的目录执行。mnt namespace 允许不同 namespace 的进程看到的文件结构不同,这样每个 namespace 中的进程所看到的文件目录就被隔离开了。同 chroot 不同,每个 namespace 中的 container 在 /proc/mounts 的信息只包含所在 namespace 的 mount point。

3、IPC namespace:不同的用户隔离空间中的进程是无法利用IPC进行通信的,不然用户空间的隔离就没有任何意义了。

container 中进程交互还是采用 Linux 常见的进程间交互方法 (interprocess communication - IPC), 包括常见的信号量、消息队列和共享内存。然而同 VM 不同,container 的进程间交互实际上还是 host 上具有相同 pid namespace 中的进程间交互,因此需要在IPC资源申请时加入 namespace 信息 - 每个 IPC 资源有一个唯一的 32bit ID。

4、PID namespace: Introduction to Linux namespaces – Part 2: IPC

每个被隔离的用户空间在运行进程的时候,必须有一个父进程,即必须有管理此用户空间的多个进程的父进程,否则在此用户空间被销毁前就无法管理此空间运行的进程了。

不同用户的进程就是通过 pid namespace 隔离开的,且不同 namespace 中可以有相同 PID。具有以下特征:

  • 每个 namespace 中的 pid 是有自己的 pid=1 的进程(类似 /sbin/init 进程)
  • 每个 namespace 中的进程只能影响自己的同一个 namespace 或子 namespace 中的进程
  • 因为 /proc 包含正在运行的进程,因此在 container 中的 pseudo-filesystem 的 /proc 目录只能看到自己 namespace 中的进程
  • 因为 namespace 允许嵌套,父 namespace 可以影响子 namespace 的进程,所以子 namespace 的进程可以在父 namespace 中看到,但是具有不同的 pid

5、USER namespace:每个用户空间都应该有一个类似与root的管理者,但这些管理者在真实的主机上是普通用户。

每个 container 可以有不同的 user 和 group id, 也就是说可以以 container 内部的用户在 container 内部执行程序而非 Host 上的用户。

6、Net namespace   Introduction to Linux namespaces – Part 5: NET

网络隔离是通过 net namespace 实现的, 每个 net namespace 有独立的 network devices, IP addresses, IP routing tables, /proc/net 目录。这样每个 container 的网络就能隔离开来。 docker 默认采用 veth 的方式将 container 中的虚拟网卡同 host 上的一个 docker bridge 连接在一起。

Linux Namespaces

Namespaces通过系统调用把上述6中功能向外输出,创建进程用clone();

把创建好的进程放到某个namespaces中,则使用系统调用:setns(),即把内核中启用的进程放到容器中;

unshare():此系统调用方法是是把容器中的进程拿出来;

从上述角度看,要想使用容器需要依靠linux内核级的内核资源用于支撑用户空间中。

docker构建镜像是 分层构建、联合挂载。

docker构建镜像是 分层构建、联合挂载。

比如centos是一个镜像,nginx是一个镜像,那么把这两者叠加在一起则可以实现nginx运行在centos上,这就叫联合挂载。

当需要运行nginx时,把centos镜像和nginx镜像联合挂载。每一层镜像都是只读的,所以底层镜像是不允许修改的。

如果想在容器A中修改文件怎么办呢?那么可以附加一个新层即E层,E层是专门属容器A的层,是能读能写的,所以容器A就可以在E层进行读写。
但是如果容器A想要删除一个属于底层镜像的文件,怎么办?由于底层镜像是只读,所以是无法删除的,那么即可在底层镜像中标记为不可见即可。如果要修改底层镜像的文件,即把底层镜像中的文件复制到E层,然后在E层中进行修改即可。
另外一个问题,因为E层有数据,那么如何把容器A迁移到其他宿主机?因此在使用容器时,是不会在容器本地保存有效数据的,所以在需要存储数据时,就会在文件系统上挂载一个外部的存储,以后即使把容器删除,也可以再启动同样的镜像,创建同样的容器,然后挂载此数据库即可。

libcontainer

Docker 从 0.9 版本开始使用 libcontainer 替代 lxc,libcontainer 和 Linux 系统的交互图如下:

转载于:https://www.cnblogs.com/hanshanxiaoheshang/p/10373068.html

1、docker容器技术基础入门相关推荐

  1. docker容器技术基础入门

    1.LXC常用操作 环境centos7 //准备工作 [root@localhost ~]# yum -y install epel-release //安装epel源[root@localhost ...

  2. Docker 学习1 容器技术基础入门

    一.容器是什么 二.虚拟化 1.主机级别虚拟化(两种):虚拟化整个完整的物理硬件平台,比如vmware,可以让我们拿到的虚拟机就像一个裸的物理设备一样.让我们自由的安装操作系统和使用操作系统,安装的操 ...

  3. Docker容器技术基础

    文章目录 Docker概述 容器 传统虚拟化与容器的区别 Namespaces CGroups LXC Docker基本概念 Docker工作方式 Docker容器编排 什么是Docker OCI与O ...

  4. Docker容器技术-基础与架构

    一.什么是容器 容器是对应用程序及其依赖关系的封装. 1.容器的优点 容器与主机的操作系统共享资源,提高了效率,性能损耗低 容器具有可移植性 容器是轻量的,可同时运行数十个容器,模拟分布式系统 不必花 ...

  5. docker pull下载很慢_一文了解Docker容器技术的操作

    一文了解Docker容器技术的操作 前言 相信点进这篇文章的Coder,不管是在各大技术论坛上.技术交流群,亦或招聘网上,应该都有见到过Doker容器技术的面孔,随着社会节奏的加快以及迫于生活的压力, ...

  6. Docker容器技术 笔记

    Docker容器技术 Docker是一门平台级别的技术,涉及的范围很广,所以,在开始之前,请确保你完成:Java SpringBoot 篇(推荐完成SpringCloud篇再来)视频教程及之前全部路线 ...

  7. 【docker】docker概述及基础入门

    docker概述及基础入门 前言: docker是近年来非常火的一个容器化技术,相比传统的vmware虚拟化技术有着非常大的优势,(vm:小伙子你不讲武德),对于开发人员.测试人员.运维人员,再往上走 ...

  8. Swarm 如何存储数据?- 每天5分钟玩转 Docker 容器技术(103)

    service 的容器副本会 scale up/down,会 failover,会在不同的主机上创建和销毁,这就引出一个问题,如果 service 有要管理的数据,那么这些数据应该如何存放呢? 选项一 ...

  9. Linux 运维工作中的经典应用ansible(批量管理)Docker容器技术(环境的快速搭建)...

    一 Ansible自动化运维工具 Python 在运维工作中的经典应用ansible(批量管理操作)1.安装ansible(需要bese epel 2种源) wget -O /etc/yum.repo ...

最新文章

  1. Tag recommendaion... 论文中的小例子,使用HOSVD算法推荐
  2. kafka修改分区数_Kafka笔记
  3. k8s灰度更新_通过rancher部署k8s过程实战分享
  4. postman返回值设置为全局变量
  5. jQuery常见的选择器操作运算符
  6. 超硬核!躺进BAT以后我总结了出现最多的15道数组题
  7. mini2440驱动分析之LCD
  8. 新风口?人造肉第一股表现强劲 股价累计上涨近600%
  9. MyBatis-Plus Wrapper条件构造器查询
  10. cenos7部署samba
  11. grub清除linux密码,忘了grub密码和root密码时的root密码更改和grub密码清除方法
  12. 海康摄像机激活失败解决方法
  13. 优秀的程序员是如何利用工具来提升工作效率的?
  14. wpl计算方法_用于计算加权路径长度(WPL)的C ++二叉树算法
  15. 文本标注工具BRAT的安装与配置
  16. Python 将矩形图片转为圆形图片
  17. 【算法】递归|迷宫回溯问题|八皇后问题
  18. 论文学习记录20200313:隐私保护机器学习[NDSS2020]
  19. Photoshop脚本开发环境
  20. linux实践感悟与体会100字,掌上综素b5学科时间活动心得体会50字

热门文章

  1. 高德最佳实践:Serverless规模化落地有哪些价值?
  2. 这是从云栖大会指挥部发回的现场报道
  3. GameMaker Studio 中的组合技(Combo)设置
  4. Java程序运行纳秒级差值计算
  5. 面试时发现公司有哪些行为或特征一定不能进?
  6. oracle的命名规则
  7. mysql在表的某一位置增加一列、删除一列、修改列名
  8. 卸载VMware Workstation出现错误: vmware-vmx.exe错误
  9. 异常-自定义异常 和 throw和throws的区别
  10. Codeforces 285E Positions in Permutations dp + 容斥原理