简介

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

作者:陈计节

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应用程序的运行

在 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 也没有区别。

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


Windows容器架构

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

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

(图片来自 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 容器技术实现容器化、云原生的特性。

END

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

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

在 Windows 上可以用 Docker 吗?| 洞见相关推荐

  1. 在Windows上安装Docker

    背景 Windows的Docker桌面是Microsoft Windows的Docker的社区版本.您可以从Docker Hub下载适用于Windows的Docker桌面.该页面包含有关在Window ...

  2. Linux、Windows、Mac下Docker的安装与使用

    Linux.Windows.Mac下Docker的安装与使用 一.Linux下的安装 二.Windows与Mac下的安装 三.Docker的使用 一.Linux下的安装 这里以Centos 7为例,首 ...

  3. 史上最全docker安装方法!

    2017年2月8日,docker更新到1.13.1(更新日志),此后又分为了docker CE(社区版)和docker EE(商业版). 此处只分享docker CE安装方法,商业版多了容器资源监控和 ...

  4. mscoreei.dll没有被指定在windows上运行_在Windows上使用Docker运行.NetCore

    今天我们来说下如何在windows下使用docker运行.net core,既然是docker,那么我们首先得在windows上安装docker. 在Windows安装 docker 有两种选择 : ...

  5. Windows 上配置Docker Desktop 的k8s

    前言:打算在windows上配置docker & k8s 的环境来实现abp vnext 的k8s部署,遂进行一系列的安装和配置 在docker desktop 上启动k8s但是一直在star ...

  6. 在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)

    背景 平时开发大部人都是在提供了高效GUI的window下工作,但是真正部署环境普遍都是在Linux中,所以为了让开发环境和部署环境统一,我们需要在windows模拟LInux环境,以前我们可能通过虚 ...

  7. 在Windows上使用Docker运行.NetCore

    今天我们来说下如何在windows下使用docker运行.net core,既然是docker,那么我们首先得在windows上安装docker. 在Windows安装 docker 有两种选择 : ...

  8. Windows上设置Docker共享盘符

    Windows上设置Docker共享盘符 Docker中的settings里的Shared Drives 选择对应盘符后,点击Apply后无法生效,没办法选择对应盘符进行分享. Exceptions: ...

  9. windows守护进程_在Linux的Windows子系统上(WSL)使用Docker(Ubuntu)

    平时开发大部人都是在提供了高效GUI的window下工作,但是真正部署环境普遍都是在Linux中,所以为了让开发环境和部署环境统一,我们需要在windows模拟LInux环境,以前我们可能通过虚拟机的 ...

最新文章

  1. datetime类型需要指定长度吗_你真的用对数据库了吗?
  2. log4j配置不生效
  3. zoj-What day is that day?
  4. Makefile和automake中判断CPU位数
  5. MySQL模糊查询—like关键字
  6. [Java基础]反射概述
  7. host ntrip 千寻rtk_最新测量干货:南方银河1和银河1Plus RTK设备连接千寻cors账号的设置方法...
  8. linux系统能装什么显卡,Linux系统下安装显卡驱动
  9. 招贤纳士|360WEB平台云平台部招人啦
  10. RAC环境下管理OGG-HA
  11. 东芝抢先一步,推出了全球首款16TB容量的硬盘MG08系列
  12. 51单片机按键计数c语言程序,利用AT89C51单片机制作的按键次数计数器
  13. The NPF driver isn't running. You may have trouble capturing or listing interfaces
  14. 基于 OpenVINO™ 的 AI 视觉应用基础课学习笔记(三)深度学习简介
  15. americdan-life
  16. 车载 DCAC 电源模块
  17. 什么是布隆过滤器?如何使用?
  18. reduce的方法详解
  19. php命令执行后门,phpstudy后门利用方法及getshell
  20. 截图自动添加水印图片工具 pickpick设置中文语言

热门文章

  1. Go开发Struct转换成map两种方式比较
  2. 私有云搭建 OpenStack(centos7.3, centos-release-openstack-ocata)
  3. onmouseover-onmouseout
  4. Java精选笔记_JDBC
  5. Android渠道包自动化验证
  6. CSS2-3常见的demo列子总结
  7. Eclipse C++的配置问题launch failed binary not found
  8. ArchiMate - 发布【企业架构语言ArchiMate v0.5.pdf】
  9. NET框架下如何使用PaddleOCRSharp
  10. 如何将自定义的 Delegate 转成 Func 委托?