在 Windows Server 2019 上部署 Docker 容器,主要取决于你希望使用 Windows 容器(运行 .NET Framework、IIS 等 Windows 应用)还是 Linux 容器(运行 Nginx、Node.js、Python 等 Linux 应用)。
以下是两种场景的详细部署步骤:
前置条件
- 操作系统版本:确保已安装 Windows Server 2019 (Standard or Datacenter)。
- 更新系统:运行
wsreset或前往 Windows Update 将系统更新到最新补丁。 - 功能启用:必须启用“容器”和“Hyper-V"功能(如果是 Linux 容器模式,需开启 Hyper-V;如果是原生 Windows 容器模式,则不需要 Hyper-V,但推荐开启以支持混合模式)。
启用必要功能(PowerShell 管理员模式)
# 启用容器和 Hyper-V 功能
Enable-WindowsOptionalFeature -Online -FeatureName Containers,Microsoft-Hyper-V -All -NoRestart
执行后建议重启服务器:Restart-Computer
方案 A:部署 Windows 容器
适用于需要运行 .exe, .dll, IIS, SQL Server 等原生 Windows 应用。
1. 下载并安装 Docker Desktop for Windows (不推荐用于生产) 或 Docker Engine
注意:Windows Server 通常不使用 Docker Desktop(它依赖 WSL2),而是直接安装 Docker Engine。
方法一:使用 Chocolatey (推荐,最简便)
打开 PowerShell (管理员),执行:
choco install docker-engine --params '/EngineVersion:24.0.7'
(注:版本号可根据需求调整,请查阅 Docker 官方文档获取最新版本)
方法二:手动安装 MSI
- 访问 Docker Hub。
- 下载
docker-ce-<version>.msi。 - 双击运行安装程序,选择默认路径即可。
2. 验证安装
docker version
如果显示 Client 和 Server 版本信息,说明安装成功。
3. 拉取并运行 Windows 镜像
由于是 Windows 环境,必须使用 Windows 基础镜像:
# 拉取官方 Hello World 镜像 (Windows 版)
docker pull mcr.microsoft.com/windows/nanoserver:ltsc2019
# 运行容器
docker run -it --rm mcr.microsoft.com/windows/nanoserver:ltsc2019 cmd
如果报错提示缺少 NanoServer 镜像,请确认你的主机版本与镜像版本匹配(如 LTSC 2019 对应 ltsc2019)。
方案 B:部署 Linux 容器
适用于运行大多数开源工具(Nginx, Redis, Node.js, Python 等)。
前提:必须先启用 WSL 2 后端或 Hyper-V 隔离模式。在 Server 2019 上,推荐使用 Moby/LinuxKit 或 Docker with Hyper-V。
1. 配置 Docker 为 Linux 容器模式
编辑 Docker 配置文件 C:ProgramDataDockerconfigdaemon.json。如果不存在,请创建该文件。
添加以下内容:
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-level": "warn",
"storage-driver": "overlay2",
"features": {
"buildkit": true
}
}
关键设置:对于 Linux 容器,通常需要设置 --exec-opt native.cgroupdriver=systemd 以确保兼容性。
2. 切换 Docker 运行时
关闭 Docker 服务:
Stop-Service docker
修改启动参数以允许 Linux 容器。在 C:ProgramDataDockerconfigdaemon.json 中确保没有强制指定 Windows 容器标签。
更简单的做法是使用 Docker Desktop 的 WSL 2 后端(如果在服务器上安装了 WSL 2),或者直接使用以下命令切换开关(视具体安装方式而定):
# 切换到 Linux 容器模式
Set-DockerContext -Name linux
如果未安装 Docker Desktop,直接在命令行运行 docker run 时会自动尝试拉取 Linux 镜像。如果失败,请检查是否启用了 Hyper-V 且网络正常。
3. 拉取并运行 Linux 镜像
# 拉取 Nginx 镜像
docker pull nginx:latest
# 运行容器,映射端口 80
docker run -d -p 80:80 --name my-web-server nginx
常见问题排查
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| 无法拉取镜像 | 网络不通或 DNS 问题 | 检查服务器能否 ping 通X_X,或在 daemon.json 中添加国内镜像提速器地址。 |
| 权限拒绝 (Access Denied) | 用户无权限访问 Docker Socket | 将当前用户加入 docker-users 组或运行 PowerShell 作为管理员。 |
| Linux 容器启动失败 | 缺少 Hyper-V 或 WSL2 | 确保已启用 Hyper-V 功能 (Enable-WindowsOptionalFeature) 并重启。 |
| Windows 容器版本不匹配 | 主机版本与镜像版本不一致 | 确保 mcr.microsoft.com/windows/nanoserver:<version> 中的 <version> 与 Server 2019 的构建号一致(通常用 ltsc2019)。 |
最佳实践建议
- 生产环境:建议使用 Docker Engine 而非 Docker Desktop,因为后者包含 GUI 组件且资源占用较高。
- 安全加固:不要随意暴露容器端口,建议使用反向X_X(如 Nginx Ingress 或 IIS ARR)管理流量。
- 日志管理:配置
json-file驱动并限制日志大小,防止磁盘被填满。 - 监控:集成 Prometheus + Grafana 监控容器资源使用情况。
如果你需要针对特定应用(如 IIS 或 Nginx)的具体 Dockerfile 编写指导,请告诉我!
轻量云Cloud