
如果你来自 编程或经典计算 现在你正为 Homelabs、Docker、Icecast 或 Azuracast 而苦恼——难怪你会头晕目眩。端口、IP、SSL、Windows、Linux 和容器,搞得你好像需要再读个学位才能搭建一个简单的广播服务器。
好消息是,一旦你理解了 Windows 系统中的容器究竟是什么?它们与虚拟机有何不同,以及在哪些情况下它们更合适——一切都豁然开朗了。您可以让多个应用程序监听同一个端口(从外部看完全一样),每个应用程序都在各自的容器中运行,并拥有有效的 SSL 证书,而无需在家里堆满树莓派。
容器究竟是什么?它为什么不是虚拟机?
软件容器本质上是一个 隔热轻便包装 在这里,您可以将应用程序及其运行所需的一切打包在一起:库、运行时环境、配置文件以及部分用户模式操作系统。此软件包运行在宿主操作系统内核之上,而不是将整个操作系统打包在内部。
另一方面,在虚拟机中,你拥有…… 完整的客户操作系统 每个虚拟机都有自己的内核、驱动程序和服务,运行在 Hyper-V、VMware 或 VirtualBox 等虚拟机管理程序之上。每个虚拟机都认为自己拥有独立的硬件:虚拟 CPU、内存、磁盘、网卡等等。这提供了极强的隔离性,但也消耗更多资源,启动时间更长。
使用容器时,宿主操作系统(例如) Windows Server 2019 或 2022Linux 发行版(或 Linux 发行版)与所有容器共享内核。每个容器都有自己的虚拟文件系统、进程空间和逻辑网络配置,但底层所有操作都通过同一个内核运行。
共享内核的这种技巧使得容器更加…… 比虚拟机轻它占用更少的磁盘空间,需要的内存更少,启动只需几秒钟(甚至更短)。这就是为什么现在您可以管理几十个甚至几百个容器,而以前您只能管理几个虚拟机。
总之,虽然虚拟机 虚拟化硬件 他们在此基础上构建了整个操作系统,也就是容器。 虚拟化操作系统 它们只隔离应用程序及其用户环境。
Windows 中的容器生态系统:微软提供什么
多年来,微软一直在容器领域投入巨资,无论是为了…… Windows 和 LinuxDocker 并没有止步于“它只能在 Windows 上运行”,而是围绕它构建了一个完整的生态系统:官方镜像、与 Visual Studio 的集成、Azure 支持和编排工具。
在本地开发方面,您可以使用 Windows 10/11 上的 Docker Desktop 在您自己的 PC 上运行 Windows 和 Linux 容器。Docker Desktop 利用 Windows 内置的容器功能,并在需要时使用小型虚拟机来运行 Linux 容器。 WSL2但这一切对你来说都是透明的。
如果你在服务器环境下工作, Windows Server 2016、2019、2022 和 2025 它们允许您以原生方式运行容器。借助它们,您可以构建强大的解决方案:经典的 .NET 应用程序、后端服务、API、微服务等,这些解决方案可以打包成镜像并以容器的形式部署。
为了完成整个开发周期,Visual Studio 和 Visual Studio Code 集成在一起。 对 Docker 的原生支持Docker Compose、Kubernetes 和 Helm。只需点击几下鼠标或直接从编辑器操作,即可编译、调试、创建镜像并将其发布到镜像仓库,无需频繁切换工具。如果您想比较不同的环境和工具,请查看这篇指南。 集成开发环境和开发工具.
您可以将创建的图片上传到 Docker中心 (如果你不介意它们是否公开) Azure 容器注册表 (ACR)Azure Container Registry (ACR) 如果您希望在组织或云环境中拥有私有镜像仓库,您的开发、测试和生产环境可以从那里拉取镜像并根据需要进行部署。
Windows 容器的实际工作原理
Windows 容器基于 主机内核但它并非随意连接。系统会为其提供一个独立的资源“视图”:虚拟化文件系统、自身的注册表项、进程、网络,以及(如果需要)外部挂载的持久存储。
应用程序在用户模式下所需的文件和库被打包到一个文件中。 基本形象在基础镜像之上,堆叠了额外的层:特定的依赖项、配置、您的应用程序代码……这些层堆叠起来的结果就是最终的容器镜像,它将成为您启动一个或多个容器的模板。
关键一点: 图像是不可更改的从镜像创建容器时,应用程序所做的更改(临时文件、日志等)会保存在容器顶部的可写层中。如果丢弃容器,除非已挂载持久卷或存储(例如 Azure 磁盘或 Azure 文件共享),否则该层将丢失。
这种分层系统使您能够 重复使用图片 应用程序之间可以进行跨平台集成。例如,.NET 团队会发布预构建的 .NET Core 镜像(基于 Nano Server),您只需添加代码和配置即可。这样就无需每次都安装运行时环境,共享层也只需下载一次。
Windows 系统中,进程隔离有两种模式: 流程隔离其中容器直接共享宿主机内核,并且 使用 Hyper-V 进行隔离每个容器都在一个拥有独立内核的微型虚拟机中运行。前者更轻量级,后者则提供更高的安全性和兼容性。
基础 Windows 镜像和容器类型
微软提供多种 官方基础图像 可用于构建自定义镜像的 Windows 镜像。每个镜像都针对不同的应用场景、大小和兼容性而设计。
“Windows”图像几乎包含了所有 所有系统 API 和服务 (除部分服务器角色外)。它是最全面的,如果您需要与使用多种操作系统功能的应用程序实现最大程度的兼容性,它是最合适的选择。
“Windows Server”镜像面向 服务器场景 它还包含全套 Windows Server API 和服务,非常适合那些原本就为该环境设计的企业应用程序。
“Windows Server Core”是其后续版本 光它使用 Windows Server API 的一个子集和完整版的 .NET Framework。它包含了大部分服务器角色,但并非全部。对于不需要完整图形界面的典型服务器应用程序来说,它是一个良好的基础。
“纳米服务器”是最 极简且优化它专为 .NET Core 和特定服务器角色而设计。其体积小巧,非常适合需要快速启动且资源消耗低的容器环境。
由于自然界具有层次丰富的特性,你不一定非要从这些“纯粹”的图像中选取。例如,你可以使用一张官方图片…… .NET Core 或 ASP.NET Core 它已经包含了运行时环境,你只需要添加你的应用程序即可。这减少了配置工作量,并且由于与其他镜像共享层,也提高了 Docker 缓存效率。
面向开发人员和管理员的容器
对于开发团队来说,容器简直是无价之宝:它们允许 启动相同的环境 只需几秒钟即可投入生产环境,不会搞乱笔记本电脑的操作系统,也不会因为库版本或依赖项而烦恼。
开发人员不再使用通常的说法“在我的机器上运行正常”,而是启动一个容器,该容器使用与生产服务器上相同的镜像。该镜像包含: 确切版本 由于应用程序需要运行时、框架和配置,因此“此 DLL 在此处不同”或“Java 版本不匹配”等许多问题都消失了。
这些容器也让操作更加便捷。 协同工作共享环境非常简单,只需传递 Dockerfile 或镜像仓库名称即可。任何团队成员都可以在几秒钟内启动相同的服务,无需遵循冗长的安装手册。
对于 IT 专业人员和系统管理员来说,容器允许您构建 标准化基础设施 适用于开发、测试和生产环境。每个环境都使用相同的镜像和编排文件,从而减少意外情况和手动配置错误。
此外,您还可以使用容器的交互模式来运行,例如: 同一个命令行工具的多个版本 在同一台服务器上运行,不会发生冲突。这对于测试、迁移或与旧版软件的兼容性以及诸如以下任务非常有用: 在 Windows 中创建 Bash 脚本.
Windows 容器和 Linux 容器的主要区别
尽管概念相似, Windows 容器和 Linux 容器之间仍存在重要差异。两者都共享宿主机内核,但显然并非同一内核,且提供的 API 也不同,因此每个宿主机只能运行与其操作系统类型相同的容器。
在 Linux 主机上,你只能运行 Linux 容器 在 Windows 主机上,您可以原生运行 Windows 容器,并且使用 Hyper-V 或 WSL2 等技术,也可以运行 Linux 容器,尽管在这种情况下,实际上有一个额外的中间层充当中间层。
Windows 有两种隔离模式:进程隔离和 Hyper-V 隔离。进程隔离与 Linux 的进程隔离非常相似: 容器直接共享内核 而且,从宿主机的角度来看,它的主进程也和其他进程一样。如果你用 PowerShell 查看进程列表,你会发现容器的进程 ID (PID) 与宿主机上的一个进程匹配。
在 Hyper-V 模式下,每个容器都在一个微型虚拟机中运行,并拥有自己的虚拟机。 独立内核从主机端,您不再直接看到应用程序进程,而是看到虚拟机进程(例如,Windows 上的 vmwp)。这更加安全,并且与某些应用程序具有更好的兼容性,但会消耗更多资源。
还有 具体限制 在 Windows 容器中,并非所有内容都能容器化。例如,Microsoft DTC(分布式事务)等服务、带有传统图形界面的客户端应用程序(如 Office)以及某些基础架构角色(如 DHCP、DNS、域控制器、NTP 或打印和文件服务器)在标准容器中不受支持。
使用容器的优势(也适用于 Windows)
容器的优势数不胜数,而且适用于 Linux 和 Windows 系统。首先是…… 隔离每个容器都是一个独立的单元,这减少了应用程序之间的冲突,并在出现故障或遭到破坏时提高了安全性。
第二个是 可移植性容器将应用程序及其依赖项和配置封装起来,因此您可以将其在不同的机器、数据中心或公有云之间迁移,而无需从头开始重新配置所有内容。“一次构建,到处运行”的理念在这里得到了完美的诠释。
另一个很大的优势是 资源效率由于多个容器共享同一个内核,因此每个实例的内存和磁盘消耗远低于虚拟机。您可以在同一台物理服务器上运行更多应用程序,从而节省成本。
在开发过程中,容器是一种强大的加速器:它们可以创建环境 可复现且可自动化这些做法与 DevOps 和 CI/CD 非常契合。通过在 Dockerfile 中定义镜像并在 Git 中进行版本控制,您可以精确控制生产环境中部署的内容及其构建方式。
此外,可维护性也得到提升:更新应用程序涉及构建一个 新图片 并部署它。如果出现问题,您可以轻松回滚到之前的版本,只需更改标签或将部署目标更改为另一个镜像即可。
集装箱安全与风险
集装箱安全是件严肃的事情:它不仅仅是“稍微隔热一下”就完事了。它需要得到全面保护。 整个链条从您使用的基础镜像到容器运行的运行时环境。为了加强主机保护,请审查工具和 提高安全性的应用程序.
最常见的风险之一是使用 存在漏洞的图像 甚至可能含有恶意软件。因此,在上传或部署图像(包括您自己的图像和第三方图像)之前,务必使用漏洞分析工具对其进行扫描。
另一个危险是暴露于 敏感数据如果镜像发布到公共注册表或有人获得系统访问权限,则嵌入在镜像或不受控制的环境变量中的密码、API 密钥或证书可能会泄露关键信息。
我们还需要照顾好…… 运行时配置权限过高、主机卷挂载不受限制、网络功能过于开放等等。配置错误的容器可以作为攻击入口点,进而危害主机或基础设施的其他部分。
为了缓解所有这些问题,我们使用扫描工具、静态和动态代码分析、供应链安全策略以及编排平台控制(例如 Kubernetes)来定义资源限制、网络策略和访问规则。
容器还是虚拟机:何时适合使用哪种方式?
在容器和虚拟机之间进行选择并非非黑即白的问题。这两种技术都是 补充 事实上,在很多环境中,它们是结合使用的:虚拟机作为基础,其上运行应用程序的容器。
当您需要时,虚拟机是合乎逻辑的选择。 完全隔离运行不同的操作系统(例如,在没有特定中间件层的 Windows 主机上运行 Linux)或者应用程序需要对特定硬件或驱动程序进行非常低级别的访问。
另一方面,当优先级为……时,容器的优势就显现出来了。 效率、速度和弹性它们启动只需几秒钟,易于扩展,并且消耗的资源更少,非常适合微服务、API、Web 服务器和现代应用程序。
在云端,服务提供商通常在后台虚拟机上运行容器。例如,Azure Kubernetes 服务 (AKS) 在 Azure 虚拟机上部署节点,容器则在这些虚拟机上运行。这让您可以兼得两者的优势:既能实现节点级别的强大隔离,又能获得轻量级的应用级性能。
在许多情况下,实际可行的做法是混合使用:使用虚拟机进行 关键基础设施服务 或者与操作系统紧密耦合,以及受益于可扩展性和可移植性的应用层容器。
编排:为什么 Kubernetes 及其同类工具至关重要
当你只有两三个容器时,使用 `docker run`、`docker stop` 或 `docker logs` 手动管理它们不成问题。但当你的应用程序包含多个容器时,问题就出现了…… 数十个或数百个容器具备副本、负载均衡、更新和监控功能。
那就是…… 容器编排器 例如 Kubernetes,它已成为任何现代容器化基础设施的关键组件。它的使命是大规模地管理生产环境中的容器。
编曲者的典型职能包括: 大规模实施 容器、负载分配到集群节点、健康监控(如果一个容器发生故障,另一个容器将接管)、节点间故障转移和自动负载扩展。
他们还负责 网络功能它们向外部开放服务,提供内部发现服务,在 pod 之间实施防火墙规则等。它们还协调应用程序更新(例如,滚动部署)以防止服务中断。
在微软的生态系统中,核心组件是 Azure Kubernetes 服务 (AKS),它通过 Azure Arc 或 Azure Stack 在 Azure 和本地提供托管的 Kubernetes 服务。其他平台,例如…… 红帽OpenShift 他们还为 Windows 容器提供了越来越多的支持,从而扩展了混合环境的选择范围。
云端容器即服务
各大云服务提供商已经汇集了一整套目录 容器服务 因此,您无需从零开始管理一切。在基础设施即服务 (IaaS) 和平台即服务 (PaaS) 层面,您可以找到从镜像仓库到完全托管的 Kubernetes 集群等各种服务。
亚马逊网络服务提供 Amazon ECS(弹性容器服务)和 Amazon EKS(弹性 Kubernetes 服务)。ECS 是其中一项服务。 AWS专有另一方面,EKS 为您提供托管的 Kubernetes,如果您想使用事实上的行业标准,这将非常有用。
在 Microsoft Azure 中,除了 AKS 之外,您还有 Azure 容器注册表 用于私密地存储和版本控制容器镜像。这与基于 Azure DevOps 或 GitHub Actions 的 CI/CD 管道完美契合。
Google Cloud Platform 提供 Google Kubernetes Engine (GKE) 作为其主要的托管 Kubernetes 解决方案。它还包含 App Engine,用于运行 Web 和移动应用程序,而无需直接管理容器,尽管其机制与容器管理类似。
除了这些巨头之外,许多其他 IaaS 和 PaaS 提供商也提供各种形式的“容器即服务”。关键在于你要专注于…… 您的应用程序图片 并且在其配置方面,提供商负责节点、系统补丁、扩展,甚至部分基础设施安全。
用于创建和管理容器的工具
毫无疑问,最流行的容器操作工具是…… DockerDocker 引入了标准镜像格式、运行时环境以及围绕它构建的生态系统,极大地简化了容器的采用,即使是对非系统专家而言也是如此。
Docker 的核心是 Docker Engine,它是负责以下功能的组件: 创建、运行和管理容器 在主机上。此外,Dockerfile 是一个文本文件,用于描述如何构建镜像:使用哪个基础镜像、安装哪些软件包、暴露哪些端口、启动时运行什么命令。
生成的容器镜像是一个逻辑文件,其中包含应用程序所需的所有组件:代码、运行时环境、依赖项以及部分操作系统。您可以从该镜像启动一个或多个容器,这些容器就是运行在主机上的实际实例。
Docker Hub 充当共享和分发镜像的角色。 公共登记处 规模庞大,拥有数千张官方和社区镜像。组织通常会将其与私有镜像仓库(例如 ACR 或自托管镜像仓库)结合使用,以便更好地控制生产环境中部署的镜像。
除了 Docker 和 Kubernetes 之外,还出现了其他工具:Podman(无守护进程且与 Docker CLI 兼容)、containerd(Docker 底层使用的运行时)、基于 Kubernetes 的企业平台 OpenShift、HashiCorp 的 Nomad(用于编排工作负载)、Docker Swarm(一种更简单的编排器)以及 LXD 或 Vagrant 等涵盖相关场景的解决方案。
实际应用:从 Netflix 到你的家庭实验室
集装箱运输并非大公司的专属。在全球范围内,像我们这样的公司也需要使用集装箱。 Netflix公司 他们利用这些技术来扩展其流媒体平台,摩根大通等银行利用这些技术提供网上银行服务,梅奥诊所等医院则将它们应用于病人管理系统。
在教育领域,像哈佛大学这样的大学正在使用集装箱。 在线学习平台确保为遍布全球的学生提供一致的学习环境。在公共管理领域,甚至像美国国防部这样的机构也在国家安全应用中使用容器。
但说到底,在家庭实验室或个人项目中,容器允许你搭建诸如以下的服务: Icecast、Azuracast、Web 服务器、数据库或监控面板 在单台机器上,没有端口重叠或依赖关系。
与其为每个服务配备一台 Raspberry Pi,不如在同一主机上设置多个容器,并使用反向代理(例如容器化的 Nginx 或 Traefik),该反向代理接收 443 端口上的 HTTPS 流量,并根据域名或路由将其内部分发到不同的服务。
关于SSL,关键在于理解…… 加密终有结束的时候。 在链路中:这可能发生在运行服务的容器中,也可能发生在容器前面的反向代理中。在这两种情况下,容器都会看到发往其内部端口的“正常”HTTP流量,即使来自外部的所有流量都经过加密。
在网络中,每个容器都有自己的 Docker网络内的内部IP地址 以及一个内部端口。从外部来看,主机宣告一个或多个端口,并将它们映射到容器的内部端口。这就解释了为什么多个容器可以监听同一个内部端口 80,而主机上只需要为每个容器分别打开 8080、8081 和 8082 端口。
在这种情况下,Windows 中的容器在您想要以下操作时非常有意义: 充分利用你现有的 Windows 电脑 (笔记本电脑、台式机、服务器)无需设置大量物理设备即可托管多个服务,保持秩序、隔离和相对简单的管理。
最终,了解容器在 Windows 中的工作原理、基础镜像的作用、容器如何与网络集成以及容器相对于虚拟机的优势,可以帮助您做出更明智的决策:从选择下一个 .NET 应用程序是容器化还是在虚拟机中运行,到了解如何在 ThinkPad 上设置带有 SSL 的 Icecast 而不会耗尽端口或资源。
