很明显能够看出二者在操做系统级别上的隔离和进程上的隔离的区别,VM由于隔离级别更高明显更重。html
文件系统隔离:每一个容器都有本身的root文件系统
进程隔离:每一个容器都运行在本身的进程环境中
网络隔离:容器件的虚拟网络接口和IP地址都是分开的
资源隔离和分组:使用cgroup将CPU和内存之类的资源独立分配给每一个容器linux
虚拟机 | 容器 | |
---|---|---|
隔离 | 提供与主机操做系统和其余 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 容器网络。 |
这篇文章对于docker入门,在docker架构方面的了解有很大的帮助,此等级标题下均为该文章内容。git
http://www.javashuo.com/article/p-afavwoqh-ke.htmlgithub
Dockerfile是什么:docker
前面咱们已经提到了 Docker
的一些基本概念。以 CTF
选手的角度来看,咱们能够去使用 Dockerfile
定义镜像,依赖镜像来运行容器,能够去模拟出一个真实的漏洞场景。所以毫无疑问的说, Dockerfile
是镜像和容器的关键,而且 Dockerfile
还能够很轻易的去定义镜像内容,说了这么多,那么 Dockerfile
究竟是个什么东西呢?shell
Dockerfile
是自动构建 docker
镜像的配置文件, 用户可使用 Dockerfile
快速建立自定义的镜像。Dockerfile
中的命令很是相似于 linux
下的 shell
命令。windows
Docker镜像只是一个自定义文件/目录结构,经过一个或多个Dockerfiles的FROM和RUN指令以层的形式进行组装,并带有一些元数据(例如:打开哪一个端口或在容器启动时执行哪一个文件),若是内核能够运行守护程序(docker daemon),通常表明具备运行的一些通用API,这时若是镜像中包含依赖内核最新的一些功能的软件将没法运行,但由于通用的API足以支持程序的最初启动,Docker并不会阻止,由于它不在意镜像中的内容和用哪一个内核的版原本启动镜像,其实通常本机的操做系统都是较新的(若对旧的内核的一些功能的引用没用致使操做系统的BUG或被黑客攻击的风险,通常到新的操做系统也会保留),因此,问题并不常见。安全
**OS ** =内核+文件系统/库服务器
镜像 =文件系统/库
先下结论,如果为了运行docker,因为docker引擎是在Linux环境上开发的,因此在Linux上确定是效率更高的,可是在windows上的docker与Linux其实在hyper - v改善后难以看出明显的差距。容器是一项存在好久的技术了,docker的精髓在将所须要的文件系统、依赖打包成了统一的一层docker image,结合微服务的思想的出现,适合于快速的开发交付,才得以发光。
docker = LXC(container)+docker image;
hyper 技术主要是为了保护共享基于LXC和windows container而诞生的(Linux和windows都可采用相同原理的技术):
hyper = VM(轻型,没有完整的操做系统下文连接有相关讲述)+docker image;
在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 隔离时,多个容器实例在主机上并发运行;可是,每一个容器在高度优化的虚拟机中运行,并有效地得到本身的内核。 因为虚拟机的存在,所以能够在每一个容器之间以及容器与容器主机之间进行硬件级别的隔离。
至于二者的由来以及与Docker的区别,能够看下面两篇文章(包括Hyper在如何轻量级的思路:1加快容器启动速度(精简VM配置和内核、VM Cache功能) 2.下降内存开销):
Swarm是Docker提供的容器编排平台,从1.12版本开始,任何的服务器节点均可以加入Swarm集群,这一样适用于Windows服务器。所以,你能够在一个Swarm集群中混合部署Windows和Linux节点,虽然不一样的操做系统节点上只能运行对应的容器,可是它们均可以经过swarm network进行通信,构建一个完整的应用。
对于微服务拆分来讲,能够构建跨平台的分布式应用很是具备吸引力。若是你的应用如今是一个传统的asp.net单体应用,你能够先采用microsoft/windowservercore镜像对整个单体应用进行容器化部署,而后逐步的将其中的某些组件进行拆分,使用microsoft/nanoserver上的.net core来运行这些微服务组件,你甚至能够引入nginx做为你的反向代理服务器,并将其运行在linux服务器节点上。
两篇文章对一些其中的基本使用状况有了较好的概述: