这个错误的核心原因是 Docker 无法正确使用 GPU 资源。通常是因为缺少 nvidia-container-runtime,或者是在使用 Snaps 版的 Docker 时存在兼容性问题。
我根据几种情况整理了对应的解决方案,你可以参考:
📝 第一步:确认 Docker 环境
请检查您的情况,然后选择对应的操作。
| 情况 | 解决方案 |
|---|---|
| 情况一:系统未安装 NVIDIA Container Toolkit | 这是最常见的原因,需要安装 Toolkit 并配置 Docker。请参考"彻底修复方案"。 |
| 情况二:Docker 通过 Snap 安装 | Snap 的严格限制可能导致 GPU 访问异常【15†L10-L16】。建议完全卸载 Snap 版 Docker,改用官方仓库安装。之后参考"彻底修复方案"。 |
| 情况三:已按情况一/二处理,但仍有问题 | 可以检查一下 Docker 配置文件 (/etc/docker/daemon.json) 中是否包含 nvidia 运行时配置,并确认 NVIDIA 驱动版本(建议 >= 550)是否正确。 |
彻底修复方案:包含安装 Toolkit、配置 Docker 运行时和验证。
bash# 1. 安装 NVIDIA Container Toolkit curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit nvidia-container-runtime # 2. 配置 Docker 运行时 sudo nvidia-ctk runtime configure --runtime=docker # 3. 重启 Docker sudo systemctl restart docker验证安装:
bashsudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi
💎 核心解决步骤总结
- 确认 Docker 安装方式:如果不是通过官方仓库安装,需要先卸载现有版本(尤其是 Snap 版)。
- 安装并配置 NVIDIA Container Toolkit:这是让容器访问 GPU 的关键。
- 验证配置 :重新运行
sudo docker run --rm --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi,如果能看到类似Tesla T4的显卡信息,就代表成功了。
🚀 Milvus GPU 版后续排查指南
如果修复后遇到以下情况,请按指引操作:
- 检查 GPU 是否被 Milvus 识别 :成功运行上述测试命令后,重启 Milvus:
sudo docker compose down && sudo docker compose up -d。查看日志确认:sudo docker logs milvus-standalone | grep -i gpu,若出现GPU is enabled等字样,则表示识别正常。 - 处理容器启动失败 :若日志显示
No devices found等错误,检查docker-compose.yml中 GPU 配置是否正确。请确保deploy部分未错误注释,且device_ids列表中至少有一个有效 ID(如["0"])【14†L9-L10】。此外,确认宿主机驱动版本与容器内要求兼容(如nvidia/cuda:12.6.0镜像通常要求驱动版本 >= 550)。
明白了,之前用 Snap 安装的 Docker 在处理 GPU 权限等任务时受限,我们现在要把它彻底卸载,然后安装官方版本。
第一步:彻底卸载 Snap 版 Docker
为了保证新安装的系统干净,我们需要彻底移除 Snap 版 Docker。
-
停止并确认服务:
bashsudo snap stop docker sudo systemctl status docker.socket # 检查并确保相关服务已停止 -
完全卸载 :
使用
--purge参数可以一并删除所有配置和数据,这是最彻底的卸载方式。bashsudo snap remove --purge docker -
清理残留文件 :
卸载完成后,可以手动删除几个相关目录,以确保没有任何残留。
bashsudo rm -rf /snap/docker sudo rm -rf /var/snap/docker sudo rm -rf /var/lib/snapd/snaps/docker* sudo rm -rf ~/.docker sudo rm /etc/docker/daemon.json # 如果存在的话 -
最后验证:
bashwhich docker docker --version如果两条命令都提示
command not found,就说明卸载成功了。
第二步:安装官方 Docker Engine
我会推荐更稳妥的 仓库安装 方式,并把两种方法都列出来,方便你选择。
📦 方案一:仓库安装 (最稳定,官方推荐)
官方仓库能确保你总是获得稳定且最新的版本,同时也便于日后通过 apt 命令升级。
-
更新系统并安装依赖:
bashsudo apt-get update sudo apt-get install ca-certificates curl gnupg lsb-release -
添加 Docker 官方 GPG 密钥和软件源:
bash# 创建密钥目录 sudo install -m 0755 -d /etc/apt/keyrings # 下载并安装 GPG 密钥 sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc # 添加 Docker 官方软件源 echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo \"${UBUNTU_CODENAME:-$VERSION_CODENAME}\") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null # 更新软件包索引 sudo apt update- 说明 :这里使用了
docker.asc作为新版 Ubuntu 推荐的密钥文件格式,相比apt-key更安全。
- 说明 :这里使用了
-
安装 Docker 引擎和相关组件 :
安装
docker-ce(社区版)和docker-compose-plugin(新版 Docker Compose)等主要组件。bashsudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -
启动并验证 Docker:
bashsudo systemctl enable docker sudo systemctl start docker sudo docker run hello-world # 用于验证安装是否成功
🚀 方案二:官方脚本安装 (快速简便)
官方提供了一个便捷的安装脚本,适合快速部署开发环境,但为了系统安全和稳定性,并不推荐在生产环境使用。
bash
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
这个命令会从阿里云的镜像站下载并执行官方脚本,可以自动完成安装,并且国内下载速度通常更快。
⚙️ 第三步:优化配置:非 root 用户权限和镜像源
-
免 sudo 使用 Docker
安装完成后,默认只有
root用户有权限。可以将当前用户加入到docker用户组,这样就不需要每次在docker命令前都加上sudo了。bashsudo usermod -aG docker $USER newgrp docker这之后,可以再次运行
docker run hello-world来验证权限是否已经生效。 -
配置国内镜像加速器 (可选)
如果后续拉取镜像遇到网络问题,可以配置国内加速器。创建或编辑
/etc/docker/daemon.json文件,参考下面的模版进行配置:json{ "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me", "https://docker.m.daocloud.io" ] }保存文件后,重启 Docker 服务即可生效:
bashsudo systemctl restart docker
🔗 与后续操作衔接:重新部署 Milvus
完成了 Docker 的切换后,恭喜你!这意味着你拥有了一个能支持 GPU 的、干净的 Docker 环境,之前的那些权限和配置报错都不会再出现了。
现在,你可以回到我们之前讨论的 Milvus 部署步骤,使用新的官方 Docker 拉取 GPU 版镜像。为了避免配置冲突,建议在一个全新的目录下操作。这样一来,Milvus 就能够顺利识别到你的显卡,启动速度也会有明显提升。
密钥文件 docker.asc 为空或损坏,通常意味着 curl 命令没能从 Docker 服务器成功下载到正确的 GPG 公钥。
简单来说,这是一个网络或命令执行问题。就像盖房子缺了原材料,它导致了后续安装无法进行。我们可以一起把它修好。
🔍 可能的原因
- 网络连接不畅 :这是最常见的原因。直接从官方源
download.docker.com下载密钥有时会遇到网络问题,导致文件下载不完整。 - 前置步骤有误 :密钥存储目录
/etc/apt/keyrings可能因权限问题未能正确创建,或是创建命令失败了。 - 命令执行偏差 :这通常是人为失误。比如,可能漏掉了
-fsSL参数,或错误地把-o写成了-O,甚至无意间重复运行了gpg --dearmor命令,把二进制数据错误地导入了文本文件。
🛠️ 推荐方案:使用国内镜像下载(成功率最高)
与其等待网络偶遇转机,不如主动切换路线。使用国内的镜像站下载密钥,往往能一步到位,避免网络问题。
第一步:下载密钥并正确存放
你可以从以下两种国内镜像源中选择一个下载密钥。无需纠结,任选一个即可。
-
选项A:使用中科大镜像源
bashsudo curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc -
选项B:使用网易镜像源
bashsudo curl -fsSL https://mirrors.163.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
第二步:设置文件权限
密钥文件存放好后,给它设置一个适当的读取权限,让系统能够顺利访问。
bash
sudo chmod a+r /etc/apt/keyrings/docker.asc
第三步:验证文件是否正常
这一步很关键,可以确保我们的操作生效了。
- 检查文件大小 :运行
ls -lh /etc/apt/keyrings/docker.asc。一个正常的密钥文件大小应该在 1~3 KB 左右,内容以-----BEGIN PGP PUBLIC KEY BLOCK-----开头。 - 清理潜在缓存 :为确保后续更新使用新密钥,建议运行
sudo apt-get clean清除本地包缓存。 - 测试软件源 :运行
sudo apt-get update。如果不再报错,就说明修复成功了。
💡 关键知识点:docker.asc 文件到底是什么?
docker.asc 本质上是一个 ASCII 格式的 GPG 公钥文件。它的主要作用是验证 Docker 软件包的签名,确保你从软件源下载的 Docker 软件包没有被篡改,并且确实来自 Docker 官方。
💎 总结
核心思路:放弃波动的国外官方源,改用稳定的国内镜像站来下载 GPG 密钥,并确保文件权限设置正确。
🔗 后续安装
解决了密钥问题后,你就可以继续之前的步骤,通过软件源安装 Docker 了。
bash
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(. /etc/os-release && echo \"$VERSION_CODENAME\") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
bash
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
如果在后续的安装过程中,又出现了新的报错或疑问,随时可以再来找我。
前面遇到了不少波折,现在我们回到最标准的安装路径上,通过Ubuntu的包管理器来安装Docker,这也是最稳定、后续维护最方便的方式。
整个过程主要分为两大步:一、配置官方软件源;二、安装Docker引擎。
🛠️ 第一步:配置Docker官方软件源
通过APT安装Docker就像是去一个官方商店买东西。但是Ubuntu默认的"商店"里并没有Docker的最新版,所以我们需要先把Docker的官方"商店"(即软件源)添加到系统里。
-
更新系统并安装必要依赖
这一步是给系统安装一些基础工具,保证我们能安全地通过HTTPS协议下载和安装软件。
bashsudo apt update sudo apt install ca-certificates curl gnupg lsb-release -y -
创建密钥目录
为Docker的GPG密钥创建一个专门的存放目录。
bashsudo install -m 0755 -d /etc/apt/keyrings -
添加Docker的官方GPG密钥
GPG密钥就像一个防伪标签,用来验证我们接下来要安装的Docker软件包是官方出品,没有被篡改过。
bashcurl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg -
添加Docker的APT软件源
这一步,就是把Docker官方"商店"的地址写入系统,并指向我们刚才导入的防伪标签(密钥)。
bashecho \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
🚀 第二步:安装Docker引擎
"商店"配置好了,现在就可以正式"购物"了。
-
更新软件包索引
让系统刷新一下软件源列表,这样它才能找到我们刚才添加的Docker商店里的软件包。
bashsudo apt update -
安装Docker及核心组件
这个命令会安装Docker社区版、命令行工具、容器运行时等一整套环境。
bashsudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y -
启动并设置开机自启
安装完成后,启动Docker后台服务,并确保它会在你每次开机时自动运行。
bashsudo systemctl start docker sudo systemctl enable docker
✅ 第三步:验证安装
我们可以通过运行一个测试容器来验证Docker是否安装成功并正常运行。
bash
sudo docker run hello-world
如果看到类似 Hello from Docker! 的信息,就说明Docker已经成功安装并运行了。
⚙️ 第四步:配置非root用户权限 (可选但推荐)
默认情况下,只有 root 用户能运行Docker命令。为了避免每次都要输入 sudo,可以将你的普通用户添加到 docker 用户组。
bash
sudo usermod -aG docker $USER
newgrp docker
注意 :出于安全考虑,docker 用户组的权限等同于 root 用户,请谨慎分配,只把需要此项权限的用户添加进去。
⚡️ 第五步:配置镜像加速器 (可选但强烈推荐)
在国内使用Docker Hub官方源可能会很慢,配置国内的镜像加速器可以显著提升拉取镜像的速度。
-
编辑配置文件
bashsudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": [ "https://docker.1ms.run", "https://docker.xuanyuan.me", "https://docker.m.daocloud.io" ] } EOF -
重启Docker服务使配置生效
bashsudo systemctl daemon-reload sudo systemctl restart docker
配置完成后,可以用 docker info | grep -A 5 "Registry Mirrors" 来验证一下加速器是否已生效。如果能看到刚才配置的地址,就说明成功了。
至此,你的Docker就通过包管理器安装完成了。这样就可以继续使用这个新环境,来部署GPU版本的Milvus了。如果在安装过程中遇到任何问题,随时可以告诉我。