在 Windows 上可以用 Docker 吗?| 洞见
簡介
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 吗?| 洞见的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何向微软 Docs 和本地化社区提交翻
- 下一篇: 分布式系统(微服务架构)的一致性和幂等性