虚拟机与容器

很明显可以看出两者在操作系统级别上的隔离和进程上的隔离的区别,VM因为隔离级别更高明显更重。

linux容器主要技术特点:

文件系统隔离:每个容器都有自己的root文件系统

进程隔离:每个容器都运行在自己的进程环境中

网络隔离:容器件的虚拟网络接口和IP地址都是分开的

资源隔离和分组:使用cgroup将CPU和内存之类的资源独立分配给每个容器

windows容器主要特点:

https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/system-requirements)

虚拟机 容器
隔离 提供与主机操作系统和其他 VM 的完全隔离。 当强安全边界很关键时(例如,在同一台服务器或群集上托管来自竞争性公司的应用时),这很有用。 通常提供与主机和其他容器的轻度隔离,但不提供与 VM 一样强的安全边界。 (可以使用 Hyper-V 隔离模式隔离轻型 VM 中的每个容器,从而提高安全性。)
操作系统 运行包含内核的完整操作系统,因此需要更多的系统资源(CPU、内存和存储)。 运行操作系统的用户模式部分,可以对其进行定制,使之只包含应用所需的服务,减少所使用的系统资源。
来宾兼容性 运行虚拟机内的几乎任何操作系统 与主机相同的操作系统版本上运行(Hyper-V 隔离使你能够在轻型 VM 环境中运行同一 OS 的早期版本)
部署 使用 Windows Admin Center 或 Hyper-V 管理器部署单个 VM;使用 PowerShell 或 System Center Virtual Machine Manager 部署多个 VM。 通过命令行使用 Docker 部署单个容器;使用 Azure Kubernetes 服务等业务流程协调程序部署多个容器。
操作系统更新和升级 在每个 VM 上下载并安装操作系统更新。 安装新的操作系统版本需要升级;通常情况下,直接创建全新 VM。 这样可能很耗时,尤其是在有大量 VM 的情况下... 在容器中更新或升级操作系统文件的操作是相同的: 编辑容器映像的生成文件(称为 Dockerfile),使之指向最新版 Windows 基础映像。用这个新的基础映像重新生成容器映像。将容器映像推送到容器注册表。使用业务流程协调程序重新进行部署。 业务流程协调程序提供的强大的自动化功能允许大规模这样做。 有关详细信息,请参阅教程:在 Azure Kubernetes 服务中更新应用程序
持久性存储 对单个 VM 使用进行本地存储的虚拟硬盘 (VHD),或对多个服务器共享的存储使用 SMB 文件共享 使用 Azure 磁盘作为单个节点的本地存储,或将 Azure 文件存储(SMB 共享)用于由多个节点或服务器共享的存储。
负载平衡 虚拟机负载均衡将运行中的 VM 移动到故障转移群集中的其他服务器。 容器本身不移动,而是由业务流程协调程序在群集节点上自动启动或停止容器,以管理负载和可用性方面的更改。
容错 VM 可以故障转移到群集中的另一台服务器,并在新服务器上重启 VM 的操作系统。 如果某个群集节点发生故障,则在该节点上运行的所有容器都将在另一个群集节点上由业务流程协调程序快速重新创建。
网络 使用虚拟网络适配器。 使用虚拟网络适配器的隔离视图,在减少使用资源的同时,稍微减少提供的虚拟化 – 主机的防火墙与容器共享。 有关详细信息,请参阅 Windows 容器网络

windows授权机制:

docker 入门:

这篇文章对于docker入门,在docker架构方面的了解有很大的帮助,此等级标题下均为该文章内容。

https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html

Dockerfile是什么:

前面我们已经提到了 Docker 的一些基本概念。以 CTF 选手的角度来看,我们可以去使用 Dockerfile 定义镜像,依赖镜像来运行容器,可以去模拟出一个真实的漏洞场景。因此毫无疑问的说, Dockerfile 是镜像和容器的关键,并且 Dockerfile 还可以很轻易的去定义镜像内容,说了这么多,那么 Dockerfile 到底是个什么东西呢?

Dockerfile 是自动构建 docker 镜像的配置文件, 用户可以使用 Dockerfile 快速创建自定义的镜像。Dockerfile 中的命令非常类似于 linux 下的 shell 命令。

关于不同版本的内核的对于镜像的影响

​ Docker镜像只是一个自定义文件/目录结构,通过一个或多个Dockerfiles的FROM和RUN指令以层的形式进行组装,并带有一些元数据(例如:打开哪个端口或在容器启动时执行哪个文件),如果内核可以运行守护程序(docker daemon),一般代表具有运行的一些通用API,这时如果镜像中包含依赖内核最新的一些功能的软件将无法运行,但因为通用的API足以支持程序的最初启动,Docker并不会阻止,因为它不在乎镜像中的内容和用哪个内核的版本来启动镜像,其实一般本机的操作系统都是较新的(若对旧的内核的一些功能的引用没用导致操作系统的BUG或被黑客攻击的风险,一般到新的操作系统也会保留),所以,问题并不常见。

**OS ** =内核+文件系统/库

镜像 =文件系统/库

关于docker for windows 10 和 docker for Linux

​ 在Windows server 2016上,微软提供了两种容器,Windows Server Container 和Hyper -V Container ,两者执行相同的操作并执行相同的方式管理,但是它们的隔离级别不同, 区别在于,在运行 Hyper-V 容器的映像中创建容器的方式需要使用其他参数。Windows Server Container 和Linux Container(LIinux容器由来:https://developer.aliyun.com/article/745446) 一样,容器与底层操作系统共享内核,所以它们会很轻量而且运行迅速。当你在容器中启动一个进程的时候,这个进程实际上运行在宿主机上,你可以使用任务管理器或者Powershell 命令 Get-Process 获取到这个进程的信息。这使得它们比VM小,因为它们每个都不需要操作系统的副本。但是,安全性可能会成为一个问题,因为如果一个容器遭到破坏,则OS和所有其他容器都将受到威胁。Windows 10上虽然也提供了容器服务,但是只能运行Hyper-V Contianer。

​ Linux是依据其操作系统的CGroup(https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html)进行进程级别的分离,即LXC(Linux Container),而windows因为没有像Linux的开源性那么方便,但也提供了Windows Server Container 以提供跟LXC一样的功能,但都有共享同个内核所涉及的安全性问题,所以windows在win10上只Hyper-V容器所提供的进程隔离与虚拟机与物理机的隔离保证安全性,而且docker的Engine需要Linux,所以windows环境下运行docker本就需要Linux的虚拟环境。

Windows 映像仅能在 Windows 主机上运行(可能是Linux本来就快,而且windows有电脑的人基本都有,所以没必要去Linux上测试,还不如在windows程序中运行,Linux镜像可以在windows上运行可能是为了能一起开发测试用吧),Linux 映像可以在 Linux 主机和 Windows 主机上运行(在 Hyper-V 上运行的基于 LinuxKit 的虚拟机在 Windows 桌面上运行 Linux 容器)(https://docs.microsoft.com/zh-cn/virtualization/windowscontainers/deploy-containers/linux-containers)其中主机是指服务器或 VM。因为Windows用到docker daemon 时,其Engine是依据Linux启动的,所以我们运行Linux的镜像时仍是通过Hyper-V虚拟机实现了Linux 环境,并且提供了Hyper-V的专用容器而已。所以一般在windows进行开发与测试

​ 当然,微软这么大的一家公司,不会这么将就,查资料时发现Hyper 是一项轻量级VM+docker image 的技术,可以用来解决LXC共享内核所带来的安全问题:其中涉及到进程隔离和Hyper -V隔离(下面三幅图为微软官网对于容器区别的展示),Linux可能也用Hyper技术实现隔离,但是若是在windows中运行Linux镜像,这时已经通过Hyper-V上的LinuxKit虚拟机上运行了host,就不需要在上面再加一层了,直接用LXC即可。

进程隔离

这是容器的“传统”隔离模式,Windows 容器概述中介绍了这种模式。 使用进程隔离时,可以通过命名空间、资源控制以及进程隔离技术进行隔离,这样多个容器实例就可以同时在给定主机上运行。 在此模式下运行时,容器与主机之间以及容器与容器之间会共享同一个内核。 这大致与 Linux 容器的运行方式相同。

Hyper-V 隔离

此隔离模式在主机和容器版本之间提供增强的安全性和更广泛的兼容性。 使用 Hyper-V 隔离时,多个容器实例在主机上并发运行;但是,每个容器在高度优化的虚拟机中运行,并有效地获得自己的内核。 由于虚拟机的存在,因此可以在每个容器之间以及容器与容器主机之间进行硬件级别的隔离。

两者的区别

容器编排平台

Swarm是Docker提供的容器编排平台,从1.12版本开始,任何的服务器节点都可以加入Swarm集群,这同样适用于Windows服务器。因此,你可以在一个Swarm集群中混合部署Windows和Linux节点,虽然不同的操作系统节点上只能运行对应的容器,但是它们都可以通过swarm network进行通讯,构建一个完整的应用。

对于微服务拆分来说,可以构建跨平台的分布式应用非常具有吸引力。如果你的应用现在是一个传统的asp.net单体应用,你可以先采用microsoft/windowservercore镜像对整个单体应用进行容器化部署,然后逐步的将其中的某些组件进行拆分,使用microsoft/nanoserver上的.net core来运行这些微服务组件,你甚至可以引入nginx作为你的反向代理服务器,并将其运行在linux服务器节点上。

实用中的使用情况

两篇文章对一些其中的基本使用情况有了较好的概述:

https://www.cnblogs.com/daxnet/p/7719574.html

https://www.zhihu.com/question/51134842

docker入门、LXC、windows container 和 Hyper知识基础、实用情况的更多相关文章

  1. docker入门_image、container相关命令

    docker入门_image.container相关命令 镜像仓库服务.镜像仓库.镜像相关概念 镜像仓库服务:docker镜像仓库服务.阿里云镜像服务 镜像仓库:docker镜像仓库服务中会有很多仓库 ...

  2. Docker入门(windows安装)

    Docker入门(安装)Docker是一种轻量级容器技术,实际中直接运行在当前操作系统(Linux)上,而不是虚拟机中.PaaS提供了存储,数据库,网络,负载均衡,自动扩展等功能,Docker云平台就 ...

  3. Docker入门2------容器container常规操作

    参考转自 https://www.cnblogs.com/jsonhc/p/7760144.html Docker的container 运行一个container的本身就是开启一个具有独立namesp ...

  4. windows container (docker) 容器资料笔记

    背景 业务需求:简化公司私有云,公有云的部署,尝试寻找更好的,更优化的技术方案替换现有的虚拟机部署方案. 技术背景: .net Docker 学习资料 Docker中文社区: http://www.d ...

  5. docker windows container的一些注意点

    1.在阿里云esc的ws2016里装docker只能使用windows container,因为官方也说了主机也是虚拟机所以不能开启Hyper-v. 2.默认使用nat模式运行network,该模式在 ...

  6. Windows Container 和 Docker:你需要知道的5件事

    微软在2016年的Ignite技术大会上正式发布了Windows Server 2016,其中的容器服务已经可以作为生产环境使用.这意味着Windows 内置的容器服务正式进入了大家的视野,虽然之前我 ...

  7. Windows Container 和 Docker

    Windows Container 和 Docker 微软在2016年的Ignite技术大会上正式发布了Windows Server 2016,其中的容器服务已经可以作为生产环境使用.这意味着Wind ...

  8. Docker 入门教程(2)——image与container

    image镜像 Definition of: image Docker images are the basis of containers. An Image is an ordered colle ...

  9. docker入门1-docker container

    image和container介绍 一个image是一个可被docker执行的包,它包括程序运行的所有东西,包括代码,运行时,库,环境变量和配置文件. 一个container是image在内存中的运行 ...

随机推荐

  1. JDK Base64编解码1.7和1.8的坑

    场景 对接一个第三方api接口,其中签名部分用的是JDK8的编码.我们线上采用JDK7,导致项目无法编译 替换编解码部分为1.7的代码,然后签名又不对 所以坑就在这里,结论,1.7的编解码有换行符导致 ...

  2. <WP8开发学习笔记>获取手机的常用型号(如Lumia920,而非RM-822)

    之前WP7时代可以用API获得WP手机的型号如lumia510,但是到了WP8后用APi只能获得硬件版本号了如RM-822,这种型号可以让我们更详细的了解具体的硬件版本,比如国行和港行,设备版本号不一 ...

  3. 使用VBS实现SSH远程登录并自动执行命令

    set ws=createobject("wscript.shell")ws.run "Putty所在路径\putty.exe -ssh -pw 你的密码 用户名@192 ...

  4. LR字符串处理函数-lr_save_int

    int lr_save_int(int value,const char * param_name); value:要分配给参数的整数值.  param_name:参数的名称.  lr_save_in ...

  5. 从mysql数据库中查询最新的一条数据的方法

    第一种方法 SELECT * from a where id = (SELECT max(id) FROM a); 第二种方法: select * FROM 表名 ORDER BY id DESC L ...

  6. spring Cloud网关之Spring Cloud Gateway

    Spring Cloud Gateway是什么?(官网地址:https://cloud.spring.io/spring-cloud-gateway/reference/html/) Spring C ...

  7. 深拷贝和浅拷贝以及void里的return用法

    Object o1=new Object(); Object o2; int i1=3,i2; 浅拷贝 o2=o1;i2=i1; 深拷贝 o2=new Object();o2=o1.clone(); ...

  8. Python对文本读写的操作方法【源码】

    Dear ALL 今天给大家分享的是 TXT文本读写方式,也是文件操作最常用的一种方式,主要内容有: 文件写方法 文件读方法 with open() as f 方法 话不多说,码上见: ''' 标题: ...

  9. JAVA集合框架 - Collection

    collection大致介绍 Collection是集合层次结构中的根接口. 集合表示一组对象.有些集合允许重复元素,有些则不允许.有些是有序的,有些是无序的. JDK没有提供此接口的任何直接实现:它 ...

  10. caffe的python接口学习(2)生成solver文件

    caffe在训练的时候,需要一些参数设置,我们一般将这些参数设置在一个叫solver.prototxt的文件里面 有一些参数需要计算的,也不是乱设置. 假设我们有50000个训练样本,batch_si ...