《FastAPI零基础入门与进阶实战》第29篇:Windows Server 2022 Standard 下安装 Docker CE
系列文章
《FastAPI零基础入门与进阶实战》
https://blog.csdn.net/sen_shan/category_12950843.html
第27篇:构建 Docker 镜像
https://blog.csdn.net/sen_shan/article/details/158418622
文章目录
前言
在 Windows Server 2022 Standard 上安装 Docker,不能使用我们熟悉的“Docker Desktop”(桌面版),因为那是给 Windows 10/11 用的。
在服务器系统上,我们需要安装 Docker EE (企业版) 或 Docker CE (社区版) 的服务器组件。以下是基于 PowerShell 的标准安装步骤。
检查 Windows 功能是否启用
1. 检查 Windows 功能是否启用
最基础的检查,确认“容器”功能是否已在系统中安装。
方法一:使用 PowerShell(推荐)
以管理员身份打开 PowerShell,执行以下命令:
Get-WindowsFeature -Name Containers
- 正常状态:
Install State应显示为 Installed。 - 异常状态:如果显示为
Available,说明功能未安装,需要运行Install-WindowsFeature -Name Containers进行安装【具体参考下面启动容器功能-安装容器】。
方法二:通过服务器管理器
- 打开“服务器管理器”。
- 点击“管理” -> “添加角色和功能”。
- 在“功能”列表中,找到“容器”。如果已勾选,说明已开启。
2. 检查 Docker 服务状态
容器功能开启后,需要 Docker 引擎服务来管理容器。检查服务是否正常运行。
Get-Service docker
- 正常状态:
Status应显示为 Running。StartType应显示为 Automatic(开机自启)。
- 异常处理:
如果状态不是 Running,可以尝试启动服务:
Start-Service docker
安装容器
这是运行 Docker 的基础,必须先开启 Windows 的容器功能。
# 安装 Containers 功能
Install-WindowsFeature -Name Containers
# 安装 Hyper-V 功能(虽然 Server 2022 可能已自带,但确保开启)
Install-WindowsFeature -Name Hyper-V
# 重启服务器使配置生效
Restart-Computer -Force
安装 Docker
服务器重启后,再次以管理员身份打开 PowerShell,执行以下命令:
方案 A:安装 Docker EE(企业版,最推荐,稳定性高)
以下是AI给出方案,但是一直没有安装成功,所以采用方案B安装 Docker CE。
# 1. 安装 NuGet 提供程序(用于下载模块)
Install-PackageProvider -Name NuGet -MinimumVersion 2.8.5.201 -Force
# 2. 安装 Docker 的 PowerShell 模块
Install-Module -Name DockerMsftProvider -Force
# 3. 安装 Docker 引擎
Install-Package -Name docker -ProviderName DockerMsftProvider -Force
方案 B:安装 Docker CE(社区版,如果你想要最新功能)
# 下载安装脚本
Invoke-WebRequest -UseBasicParsing "https://raw.githubusercontent.com/microsoft/Windows-Containers/Main/helpful_tools/Install-DockerCE/install-docker-ce.ps1" -o install-docker-ce.ps1
# 执行安装脚本
.\install-docker-ce.ps1
配置与启动
安装完成后,通常需要重启一次服务器。
# 重启服务器
Restart-Computer -Force
启动后,验证 Docker 是否正常工作:
# 检查 Docker 服务状态
Get-Service docker
# 如果服务未运行,手动启动
Start-Service docker
# 设置开机自启
Set-Service -Name docker -StartupType Automatic
# 查看 Docker 版本
docker --version
运行测试容器
运行一个简单的测试容器,验证网络和运行时是否正常:
docker run hello-world
- 注意:Windows 容器的镜像非常大(通常是几个 GB),首次拉取会比较慢。
- 如果你看到
Hello from Docker!的字样,恭喜你,环境跑通了!
数据转移
Docker CE(社区版) 且运行在 Windows Server 环境下,它默认使用 Windows 的文件系统路径(如 C:\ProgramData\docker)来存储镜像和容器数据。
随着使用时间的增加,这些数据会变得非常大(几十 GB),导致 C 盘空间不足。
以下是将 Docker CE 数据目录完整迁移到 D 盘 的三种方案。请根据你的具体情况选择
方案一:修改守护进程配置 (daemon.json) —— 推荐 (最干净)
这是最标准的方法,通过修改配置文件告诉 Docker 换个地方存数据。
步骤:
停止 Docker 服务
Stop-Service docker
迁移现有数据
将 C 盘原有的数据复制到 D 盘的新目录。【对复制数据保留意见,因为没项目在里面所以可以不复制,直接建立D:\docker-data】
# 创建目标目录
mkdir D:\docker-data
# 复制数据 (使用 robocopy 保证权限和完整性)
robocopy "C:\ProgramData\docker" "D:\docker-data" /E /COPYALL /XJ /R:1 /W:1 /B
说明:在实际操作中直接建立D:\docker-data,并把对system权限完整控制
注意:如果提示权限不足,请在命令前加 Start-Process powershell -ArgumentList "robocopy..." -Verb RunAs 或直接在管理员窗口操作。
参数详解(为什么加这些):
/E:复制子目录,包括空的。/COPYALL:复制所有信息(文件数据、属性、时间、ACL 权限等)。/XJ:关键参数。排除目录交接点(Junction Points),防止进入无限循环或复制链接本身。/B:关键参数。使用备份模式(Backup mode)。这是解决Access is denied的核心,它会让系统暂时提升权限,允许管理员绕过文件安全设置进行复制。/R:1:失败重试 1 次(默认是 100 万次,太浪费时间)。/W:1:每次重试间隔 1 秒。
清理 C 盘的旧数据
删除 C 盘上的旧数据文件夹,防止它干扰 D 盘的新数据。
# 删除 C:\ProgramData\docker\windowsfilter 目录下的所有内容
# 注意:不要删除整个 docker 文件夹,只删除里面的子文件夹
Remove-Item -Recurse -Force "$Env:ProgramData\docker\windowsfilter\*"
# 或者,如果你之前备份过,直接删除整个 docker 文件夹再重建
Remove-Item -Recurse -Force "$Env:ProgramData\docker"
mkdir "$Env:ProgramData\docker"
如果PowerShell无法删除,请直接在windows下删除,在删除由于权限问题按照下面操作。
权限不足
如果上述方法仍提示“拒绝访问”,你需要先获取文件的所有权,再修改权限。
在 PowerShell 中运行以下命令:
# 1. 获取所有权
takeown /F "$Env:ProgramData\docker\windowsfilter" /R /D Y
# 2. 给 Administrators 组完全控制权限
icacls "$Env:ProgramData\docker\windowsfilter" /grant Administrators:F /T /C
# 3. 再次尝试删除
Remove-Item -Path "$Env:ProgramData\docker\windowsfilter\*" -Recurse -Force
如果PowerShell无法删除,请直接在windows下删除
修改配置文件
打开 Docker 的配置文件 C:\ProgramData\docker\config\daemon.json(如果不存在则创建)。
添加 data-root 参数:
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com"
],
"data-root": "D:\\docker-data"
}
注意:路径中的反斜杠要转义(写两个 \\),或者使用正斜杠 /
注意:镜像加速主要对 Linux 镜像有效,Windows 镜像(如 nanoserver)依然需要从微软源下载,速度取决于网络环境。
启动服务并验证
Start-Service docker
docker info
在输出信息中查找 Docker Root Dir,如果显示为 D:\docker-data,则表示迁移成功。
方案二:使用符号链接 (Symbolic Link) —— 通用 (无需改配置)
如果你不想修改配置文件,或者迁移后遇到兼容性问题,可以使用“透明”的符号链接。Docker 以为还在 C 盘操作,实际上数据全在 D 盘。
步骤:
停止 Docker 服务
Stop-Service docker
移动旧数据
将原来的 docker 文件夹移动到 D 盘。
# 将 C:\ProgramData\docker 重命名备份
mv "$Env:ProgramData\docker" "$Env:ProgramData\docker-backup"
# 或者直接剪切到 D 盘
mv "$Env:ProgramData\docker-backup" D:\
创建符号链接
执行以下命令,创建一个指向 D 盘的“快捷方式”,但对系统来说它就是原目录。
cmd /c 'mklink /J "%PROGRAMDATA%\docker" "D:\docker-data"'
解释:/J 是目录联结(Junction),比符号链接更稳定,且不需要特殊权限。
启动服务
Start-Service docker
此时,所有写入 C:\ProgramData\docker 的数据实际上都会存储在 D:\docker-data 中。
方案三:重置数据目录 (全新开始)
如果你之前的 C 盘数据不重要(或者你已经导出镜像备份了),想彻底清空并从 D 盘重新开始。
方案三虽然简单,但是方案一更让人熟悉Docker。
步骤:
-
停止服务并卸载
Stop-Service docker
# 如果之前注册过服务,先注销
dockerd --unregister-service
直接指定目录启动
手动启动 Docker 并指定数据目录:
dockerd --data-root "D:\docker-data" --register-service
Start-Service docker
运行测试容器
运行一个简单的测试容器,验证网络和运行时是否正常:
docker run hello-world
- 注意:Windows 容器的镜像非常大(通常是几个 GB),首次拉取会比较慢。
- 如果你看到
Hello from Docker!的字样,恭喜你,环境跑通了!
核心操作指南 (常用命令)
AI制作,以下命令未验证,记录便于后期使用
镜像操作 (Images)
搜索镜像
docker search nginx
拉取镜像
docker pull mcr.microsoft.com/windows/servercore:ltsc2022
(注意:Windows Server 只能运行 Windows 镜像,不能运行 Linux 镜像,除非开启 Hyper-V 切换)
容器操作 (Containers)
运行一个交互式容器
docker run -it mcr.microsoft.com/windows/servercore:ltsc2022 powershell
-it表示交互模式。- 进入容器后,输入
exit可以退出
在后台运行容器
docker run -d --name my-iis mcr.microsoft.com/windows/servercore/iis
查看正在运行的容器
docker ps
查看所有容器 (包括停止的):
docker ps -a
停止/启动容器:
docker stop my-iis
docker start my-iis
镜像操作 (Images)
- 搜索镜像:powershell
1docker search nginx - 拉取镜像:powershell
(注意:Windows Server 只能运行 Windows 镜像,不能运行 Linux 镜像,除非开启 Hyper-V 切换)1docker pull mcr.microsoft.com/windows/servercore:ltsc2022
容器操作 (Containers)
-
运行一个交互式容器 (以 PowerShell 为例):
1docker run -it mcr.microsoft.com/windows/servercore:ltsc2022 powershell-it表示交互模式。- 进入容器后,输入
exit可以退出。
-
在后台运行容器:
1docker run -d --name my-iis mcr.microsoft.com/windows/servercore/iis -
查看正在运行的容器:
1docker ps -
查看所有容器 (包括停止的):
1docker ps -a -
停止/启动容器:
1docker stop my-iis 2docker start my-iis
常见问题排查表
表格
| 检查项 | 命令/操作 | 预期结果 | 异常处理 |
|---|---|---|---|
| 容器功能 | Get-WindowsFeature Containers |
Installed | Install-WindowsFeature Containers |
| Docker 服务 | Get-Service docker |
Running | Start-Service docker |
| 虚拟化支持 | 任务管理器 -> 性能 -> 虚拟化 | 已启用 | 进 BIOS 开启 VT-x / AMD-V |
| Hyper-V 启动 | bcdedit /enum |
hypervisorlaunchtype Auto |
bcdedit /set hypervisorlaunchtype Auto |
如果你能成功运行 docker run 并进入 cmd.exe,就说明你的 Windows 容器环境已经完全开启并可用。
⚠️ 重要注意事项
-
只支持 Windows 容器:
Windows Server 2022 原生只能运行 Windows 容器(如nanoserver、servercore)。你不能像在 Linux 上那样直接运行 Ubuntu 等 Linux 容器。- 测试命令:
docker run mcr.microsoft.com/windows/nanoserver:ltsc2022 cmd -
关于 WSL 2:
之前尝试安装 WSL,但在 Windows Server 2022 上,WSL 2 的支持非常有限且不稳定。官方文档通常不推荐在 Server 2022 上使用 WSL 2 来运行 Docker。建议直接在 Windows 容器中进行开发或测试。
- 测试命令:
-
可视化管理:
如果你觉得命令行太枯燥,可以安装第三方可视化工具 Portainer&IDE 集成 (如 Visual Studio Code):
-
Portainer
-
如果你在服务器上工作,不想记太多命令,可以安装 Portainer。
- 它是啥:这是一个轻量级的管理 UI,可以让你通过浏览器来管理 Docker。
- 如何安装:它本身也是一个 Docker 容器。
- 安装命令(在 PowerShell 中运行):
-
# 创建存储数据的卷 docker volume create portainer_data # 运行 Portainer 容器 docker run -d -p 9000:9000 --name portainer --restart=always -v \\.\pipe\docker_engine:\\.\pipe\docker_engine -v portainer_data:C:\data portainer/portainer-ce -
VS Code
-
如果你是开发者,VS Code 有一个官方的 Docker 扩展。
- 功能:在 VS Code 的侧边栏会显示一个 Docker 图标,你可以直接看到所有的镜像、容器、卷。
- 操作:你可以右键点击容器来启动、停止、进入终端,甚至可以直接在 IDE 里构建镜像。这对于写代码调试非常方便。
更多推荐
所有评论(0)