在 Windows 上可以用 Docker 吗?| 洞见

简介

Docker,或者准确一点说,容器技术,在近几年里几乎成为了应用分发和集群部署的默认技术了。背景部分,如果感兴趣,请参考闲谈集群管理模式一文。Docker 生态的成熟还有赖于其周边工具和实践模式的兴起。比如,曾经雨后春笋般出现的编排技术,以及基于容器技术的 DevOps 实践大规模地开展。

640?wx_fmt=jpeg

作者:陈计节

ThoughtWorks 高级咨询师;多年的跨平台 .NET 开发者;敏捷开发实践者,技术布道师。


那么这么好的技术,在 Windows 上能用吗?在各种场合,都有人与我讨论这个的话题。每次听到这样的疑问,我也是很无奈的。毕竟,只要稍微搜索一下,就不难回答:是可以的。不过,深入想一下,人们有这样的疑问也是有道理的:毕竟 Docker 是起源于 Linux 上的技术。

Docker 是基于 Linux 内置的 Namespace 和 CGroup 等系统内隔离机制而抽象出来的一种轻虚拟化技术。与虚拟机相比,它以一种轻量级的方式实现了运行空间的隔离。如果物理机是一幢住宅楼,虚拟机就是大楼中的一个个套间,而容器技术就是套间里的一个个隔断不难理解,Docker 作为一种隔断,它并不能基于一种内核(Linux)提供另一种内核(Windows)的虚拟化运行环境。所以,基于 Linux 的 Docker 是不支持运行 Windows 应用的。

早在 Docker 之前,Linux 就已经提供了今天的 Docker 所使用的那些基础技术。当年 Docker 仿佛一夜之间突然火爆全球的背后,技术上的积累并不是瞬间完成的。这一切在 Windows 上显得有些滞后。在 Docker 已经众所周知的时候,Windows 系统却根本没有类似的机制,更别提 Windows 独有的工具链和实践方法了。所以,我们看到,早期 Windows 与 Docker 的交集只是为其提供应用开发环境。


boot2docker与Docker for Windows

可以在 Windows 开发面向 Docker 部署的应用程序——Windows 的桌面体验比 Linux 好太多,所以很早就出现了在异构操作系统上以虚拟机的形式运行 Docker 的项目出现,也就是 boot2docker。它既支持 Windows,也支持 macOS。

后来,Docker 公司开始推出自己的Docker for Windows工具包,它旨在为开发人员在Windows上开发面向Docker的应用程序提供完整的工具链,其中包括运行环境、客户端,Docker Swarm 编排工具和其他工具Docker for Windows 中负责运行环境配置的工具是Docker Machine。与 boot2docker 类似,Docker Machine 也会在Windows上创建一个Linux虚拟机,用于运行Docker引擎。也就是说,这个环境也只支持Linux的应用程序格式的,并不支持Windows应用程序的运行

640?wx_fmt=jpeg

在 Windows 上运行的 Docker for Windows(图片来自Docker文档


Windows容器技术

正当 Linux 世界的容器技术借着 Docker 的东风刮遍世界的时候,Windows 系统也发现了容器粒度的重要性。

微软与 Docker 在 2014 年宣布了合作,以期将容器技术带到 Windows Server 操作系统,并为传统的 Windows 应用程序的容器化改造提供更直接的支持。不久之后,微软在 Ignite 2015 上宣布将推出为容器优化的 Windows Nano Server;第一次 Windows 容器真正与与开发者见面是在 Windows 10 的年度更新(2016.8)上,它正式提供 Windows 容器的开发环境。在 2017 年 10 月发布的 Windows Server 1709 版本包含了 Windows 容器,意味着这项技术可以用于生产环境了。Windows 容器是真正能够运行 Windows 应用程序的容器技术包括依赖 IIS、注册表等大量 Windows 特性的应用程序都可以在 Windows 容器中运行。

虽然 Windows 对容器的支持有些姗姗来迟,但社区对 Windows 容器的关注和运用却是异常活跃。这主要得益于容器技术本身生态的成熟,一来人们对这项技术已经有了充分的认知,同时周边工具和实践都已经日趋完善。另一方面,在与 Docker 公司一同打造这项技术的过程中,也注意了与已有技术的兼容性。人们发现,在电脑上启用 Windows Container 功能之后,接下来的操作步骤仍然是基于 Docker 客户端完成的,命令行参数与 Linux 上的 Docker 也没有区别。

640?wx_fmt=jpeg

几乎与 Windows 容器技术本身日趋成熟过程的同时,周边工具对 Windows 容器的支持也在同步完善。Docker for Windows 在新的版本中添加了一个贴心的菜单,可以一键切换 Linux 容器和 Windows 容器;Kubernetes 从 1.5 版本开始增加对 Windows 容器的支持;云环境方面,包括 Azure 和 AWS 在内的众多云环境都第一时间提供了 Windows 容器的支持……

640?wx_fmt=jpeg


Windows容器架构

Windows 是如何既提供自有容器技术,又提供与 Docker 兼容的操作接口的呢? 

下面的上图是 Linux 容器的架构,下图则是 Windows 容器的。可以发现两者结构很类似。与 Linux 类似,Windows 也新新抽象出来了 CGroup 和 Namespace 的概念,并提供出一个新的抽象层次 Compute Service,即宿主机运算服务(Host Compute Service,hcs)。相较于底层可能经常重构的实现细节,hcs 旨在为外部(比如 Docker 引擎)提供较稳定的操作接口。hcs 的操作接口目前有 Go 语言版本,以及 C# 语言版本,前者目前在 Docker 客户端中用来操作 Windows 容器。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

(图片来自 Black Belt 在 DockerCon 的演讲:Docker 与 Windows 容器揭秘

容器镜像方面,微软自己提供了 Server Core 和 Nano Server 两种服务器版本。Server Core 可以理解为 Windows Server 去掉了 GUI 的部分,因此功能更完整(比如包括文件服务器、DNS 服务器等功能),同时镜像大小也更大(2GB~5GB);而 Nono Server 则是专为容器优化的迷你型系统,只包含有核心的 Windows 服务器功能,镜像大小为(130MB~400MB)。基于基础镜像来构建自己镜像的方法与 Linux 镜像是一样的,所以 DockerFile 文件的格式和语法并没有不同。

授权方面,只要用户已经取得宿主机的授权,微软并不会单独向用户收取容器镜像的授权费


小结

容器技术本身以及围绕它的一系列工具和实践让应用程序的打包和发布变得标准化,很大程度上可以消除应用程序对特定环境的依赖,进而为高效的集群化部署和运维提供有力保障。作为容器技术的代表,Docker 可以以两种形式运行在 Windows 上:以 Hyper-V 虚拟机的形式运行 Linux 格式的容器,或者运行原生的 Windows 容器。其中前者运行 Linux 格式的应用程序,后者能运行 Windows 应用程序。如果稍微用一点技巧,还可以让这两者同时运行在 Windows 电脑上

Windows 10 和 Windows Server 都提供了对 Windows 容器的支持,各种容器化工具对 Windows 容器的支持也在日趋完善当中。基于 Windows 开发新的应用时一方面可以优先考虑跨平台容器化部署的能力,另一方面也可以与存量应用程序一样考虑借助 Windows 容器技术实现容器化、云原生的特性。

640?wx_fmt=jpeg


END

原文地址:https://blog.jijiechen.com/post/docker-on-windows/

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319381.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泰勒及洛朗展开学习笔记

2020-1024996 最近太忙了,今天好像没有写题,不过研究了一下数学hh。 2020.10.24今天又有工数课,我又没听,我记得上节工数课我看了换根dp,哦?好吧我没听过工数,那没事了,不过这次不敢…

【结论】串串串(nowcoder 20107-A)

正题 nowcoder 20107-A 题目大意 给你两个01串,有若干询问,每次询问两段长度相等的字串不同位数的奇偶性 解题思路 因为只用判断奇偶性,所以同时修改两个字符是不会改变结果的,那么可以直接将字串修改为只有0/1个1的串&#xf…

SmartSql For Asp.Net Core 最佳实践

常规操作安装 SmartSqlInstall-Package SmartSql安装 SmartSql.DIExtensionInstall-Package SmartSql.DIExtension配置SmartSqlConfig.xml写库(Write)必选 唯一节点读库(Read)可选 多节点配置PostgresqlPostgresql 客户端 NpgsqlI…

矩阵乘法学习记录

这要从校赛的一个区间与非操作题说起,群里大佬用的ddp思想使其满足结合律,但是我连矩阵乘法都不会于是从头开始学习矩阵乘法。 P3390 【模板】矩阵快速幂 和快速幂一模一样,只是把数乘换成矩阵乘,只需要定义结构体矩阵然后重载一…

51nod1600-Simple KMP【SAM,树链剖分】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1600 题目大意 给出一个字符串sss,每次在最后插入一个字符后求它的所有分别子串构出的failfailfail树的深度和。 1≤Q≤1051\leq Q\leq 10^51≤Q≤105 解题思路 考虑两个相等的子串长度为le…

课程 预编译框架,开发高性能应用 - 微软技术暨生态大会 2018

微软技术暨生态大会(Tech Summit),2018 年在上海世博中心召开。这是最后一次的 Tech Summit 了;明年开始,中国大陆地区就要和其他国家和地区一样,进行全球 Ignite Tour 了。我也有幸成为分会场讲师团队的一…

【DP】方格计数(nowcoder 20107-B)

正题 nowcoder 20107-B 题目大意 在一个H*W的平面上,选择N个点(坐标为非负整数),使得每个点之间的距离大于D,问你有多少种方案 解题思路 设fi,j,kf_{i,j,k}fi,j,k​为有i个格子,选择k个格子,…

YbtOJ#853-平面标记【整体二分,凸壳】

正题 题目链接:http://www.ybtoj.com.cn/contest/119/problem/3 题目大意 给出nnn个点(xi,yi)(x_i,y_i)(xi​,yi​),mmm次给出(ki,ai)(k_i,a_i)(ki​,ai​)表示标记所有满足 yj>kixjaiy_j>\frac{k_i}{x_j^{a_i}}yj​>xjai​​ki​​的未标记点 求每个点…

Ocelot简易教程(五)之集成IdentityServer认证以及授权

最近比较懒(编者注:作者不是真懒,而是在憋大招,他最近实现了把Ocelot的配置使用数据库存储),所以隔了N天才来继续更新第五篇Ocelot简易教程,本篇教程会先简单介绍下官方文档记录的内容然后在前几…

【启发式合并】【dfs】树数树(nowcoder 20107-C)

正题 nowcoder 20107-C 题目大意 给一棵树,让你构造一个序列a,使得a中的数互不相等,且相邻点是祖先的关系,回答序列最长长度 解题思路 书中的每个点可以把字数的两个序列连起来 考虑维护一个堆,存子树中的序列&…

CF848E-Days of Floral Colours【dp,分治NTT】

正题 题目链接:https://www.luogu.com.cn/problem/CF848E 题目大意 2n2n2n个花排成一个圆环,nnn种颜色每种两个,要求两个相同颜色之间最小距离为1,21,21,2或nnn。 对于一种染色方案的权值为:删除掉距离为nnn的颜色后,剩下的连续…

2020 China Collegiate Programming Contest Qinhuangdao Site 补题部分

已经补AEFGK E. Exam Results 枚举二分动态开点权值线段树O(nlogN)O(nlogN)O(nlogN) 智商太低,想不到什么贪心只能暴力数据结构维护 对于所有学生的最高成绩只可能是ai(1≤i≤n)a_i(1\leq i\leq n)ai​(1≤i≤n)或者最大的bib_ibi​,对于后面一种情况…

CCPC Training Class

杭电oj 题意&#xff1a; 字符串中出现次数最多的字母的次数是多少&#xff1f; 题解&#xff1a; 题目看不懂。。。又臭又长 懒得看。。 但是仔细看样例就会发现。。其实考的很简单 比赛时这题是我做的&#xff0c;以下为考试原码 代码&#xff1a; #include<string&…

【交互】Omkar and the Meaning of Life(CF-1586D)

正题 CF-1586D 题目大意 有一个大小为n的数列a&#xff0c;你可以进行最多2*n次查询 对于每次查询&#xff0c;你要给出一个大小为n的数列b&#xff0c;ciaibic_ia_ib_ici​ai​bi​&#xff0c;题目会回答c中出现次数大于2的数的最早出现位置 现在让你得出a数组 解题思路 …

ASP.NET Core 集成测试中结合 WebApplicationFactory 使用 SQLite 内存数据库

SQLite 内存数据库&#xff08;in-memory database&#xff09;的连接字符串是 Data Source:memory: &#xff0c;它的特点是数据库连接一关闭&#xff0c;数据库就会被删除。而使用 services.AddDbContext 通过连接字符串配置 EF Core 时&#xff0c;EF Core 会在每次查询或…

P4389-付公主的背包【生成函数,多项式exp】

正题 题目链接:https://www.luogu.com.cn/problem/P4389 题目大意 nnn种物品&#xff0c;第iii种大小为viv_ivi​&#xff0c;数量无限。对于每个s∈[1,m]s\in[1,m]s∈[1,m]求刚好填满sss容量的方案数。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 统计和为一定值的…

mex性质学习

E.Complicated Computations 如果一个区间的mexamexamexa&#xff0c;满足以下条件&#xff1a; 区间未出现aaa区间出现1→a−11\to a-11→a−1 因此若考虑是否存在一个区间的mex值是aaa&#xff0c;我们尝试把整个区间以aaa为端点划分成若干段&#xff0c;只要每一段内&…

Cows

题目 题意: 有一群牛&#xff0c;每个牛有两个属性值[S,E]&#xff0c;如果牛i和牛j属性值满足Si < Sj 且 Ej < Ei 且 Ei - Si > Ej - Sj&#xff0c;牛i比牛j强壮&#xff0c;输出每个牛比自己强壮的牛的数量。 题解&#xff1a; 我们可以把[S,E]看作坐标&#x…

【SAM】差异(P4248)

正题 P4248 题目大意 设TiT_iTi​为第i个字符开始的后缀&#xff0c;求&#xff1a; ∑i1n∑ji1nlen(Ti)len(Tj)−2lcp(Ti,Tj)\sum_{i1}^n \sum_{ji1}^n len(T_i)len(T_j)-2\times lcp(T_i,T_j)i1∑n​ji1∑n​len(Ti​)len(Tj​)−2lcp(Ti​,Tj​) 解题思路 用SAM建立paren…

P4345-[SHOI2015]超能粒子炮·改【Lucas定理,类欧】

正题 题目链接:https://www.luogu.com.cn/problem/P4345 题目大意 TTT组询问&#xff0c;给出n,kn,kn,k求 ∑i0k(ni)\sum_{i0}^{k}\binom{n}{i}i0∑k​(in​) 对233323332333取模的值 1≤T≤105,1≤k≤n≤10181\leq T\leq 10^5,1\leq k\leq n\leq 10^{18}1≤T≤105,1≤k≤n≤1…