系列文章

《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 进行安装【具体参考下面启动容器功能-安装容器】。

方法二:通过服务器管理器

  1. 打开“服务器管理器”。
  2. 点击“管理” -> “添加角色和功能”。
  3. 在“功能”列表中,找到“容器”。如果已勾选,说明已开启。

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

    1docker pull mcr.microsoft.com/windows/servercore:ltsc2022
    (注意:Windows Server 只能运行 Windows 镜像,不能运行 Linux 镜像,除非开启 Hyper-V 切换)
容器操作 (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 容器环境已经完全开启并可用。

⚠️ 重要注意事项

  1. 只支持 Windows 容器
    Windows Server 2022 原生只能运行 Windows 容器(如 nanoserverservercore)。你不能像在 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 容器中进行开发或测试。

  2. 可视化管理
    如果你觉得命令行太枯燥,可以安装第三方可视化工具 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 里构建镜像。这对于写代码调试非常方便。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐