虚拟机与容器

很明显可以看出两者在操作系统级别上的隔离和进程上的隔离的区别,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. jsp页面用DBHelper实现简单的登陆验证

    首先我们需要写一个简单的登陆页面login.jsp,然后用from表单提交给index.jsp页面.在index.jsp页面通过DBHelper连接数据库判断账号和密码,如果密码正确则显示登陆成功. ...

  2. 小技巧:如何用 Chrome 将 SVG 转成 PNG

    怎么把 SVG 转成 PNG ?用 Chrome 吧,非常好用,还能设定自己想要的尺寸. 什么是 SVG ? SVG (Scalable Vector Graphics,可缩放矢量图形) 是基于 XM ...

  3. Supervisor操作相关的进程

    Supervisor是用Python开发的一个客户机/服务器系统,允许用户监视和控制UNIX类操作系统上的多个进程. 功能:用于监听.启动.停止.重启一个或多个进程. 当Supervisor管理的进程 ...

  4. 如何修改centOS7的GUI图形界面

    在安装Gnome包之前,需要检查一下安装源(yum)是否正常,因为需要在yum命令来安装gnome包. 第一步:先检查yum 是否安装了,以及网络是否有网络.如果这两者都没有,先解决网络,在解决yum ...

  5. nacos基础--客户端下载

    对于nacos的作用,我在这里不在过多介绍,不知道的同学可以自行先了解,对于nacos,有官网进行介绍,对于一个初学者来说是一件非常方便的事情. 官网地址:https://nacos.io 但是在下载 ...

  6. 【Java入门】JDK安装和环境变量配置(Win7版)

    系统环境:Windows7 x64 安装JDK和JRE版本:1.8.0_191 1.下载JDK安装包 Oracle官网下载网址:https://www.oracle.com/technetwork/j ...

  7. uiautomatorviewer 截取手机屏幕报错

    1. 解决办法: 1.在e盘新建一个文件夹,命名为app.uix 2.打开cmd命令,输入命令adb pull /sdcard/app.uix E:/app.uix 3.打开uiautomatorvi ...

  8. Shiro反序列化复现

    Shiro反序列化复现 ——————环境准备—————— 目标靶机:10.11.10.108 //docker环境 攻击机ip:无所谓 vpsip:192.168.14.222 //和靶机ip可通 1 ...

  9. 图解MySQL索引(三)—如何正确使用索引?

    MySQL使用了B+Tree作为底层数据结构,能够实现快速高效的数据查询功能.工作中可怕的是没有建立索引,比这更可怕的是建好了索引又没有使用到.本文将围绕着如何优雅的使用索引,图文并茂地和大家一起探讨 ...

  10. c++ 对vector和deque进行逆序排序问题

    1.vector vector<int> data1; 2.deque deque <int> data2; 逆序排序方式: 方式1.使用reverse函数   (内置数据类型 ...