docker无法连接GPU资源解决方案

这个错误的核心原因是 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

验证安装:

bash 复制代码
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:12.6.0-base-ubuntu24.04 nvidia-smi

💎 核心解决步骤总结

  1. 确认 Docker 安装方式:如果不是通过官方仓库安装,需要先卸载现有版本(尤其是 Snap 版)。
  2. 安装并配置 NVIDIA Container Toolkit:这是让容器访问 GPU 的关键。
  3. 验证配置 :重新运行 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。

  1. 停止并确认服务

    bash 复制代码
    sudo snap stop docker
    sudo systemctl status docker.socket # 检查并确保相关服务已停止
  2. 完全卸载

    使用 --purge 参数可以一并删除所有配置和数据,这是最彻底的卸载方式。

    bash 复制代码
    sudo snap remove --purge docker
  3. 清理残留文件

    卸载完成后,可以手动删除几个相关目录,以确保没有任何残留。

    bash 复制代码
    sudo 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  # 如果存在的话
  4. 最后验证

    bash 复制代码
    which docker
    docker --version

    如果两条命令都提示 command not found,就说明卸载成功了。

第二步:安装官方 Docker Engine

我会推荐更稳妥的 仓库安装 方式,并把两种方法都列出来,方便你选择。

📦 方案一:仓库安装 (最稳定,官方推荐)

官方仓库能确保你总是获得稳定且最新的版本,同时也便于日后通过 apt 命令升级。

  1. 更新系统并安装依赖

    bash 复制代码
    sudo apt-get update
    sudo apt-get install ca-certificates curl gnupg lsb-release
  2. 添加 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 更安全。
  3. 安装 Docker 引擎和相关组件

    安装 docker-ce(社区版)和 docker-compose-plugin(新版 Docker Compose)等主要组件。

    bash 复制代码
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
  4. 启动并验证 Docker

    bash 复制代码
    sudo 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 用户权限和镜像源

  1. 免 sudo 使用 Docker

    安装完成后,默认只有 root 用户有权限。可以将当前用户加入到 docker 用户组,这样就不需要每次在 docker 命令前都加上 sudo 了。

    bash 复制代码
    sudo usermod -aG docker $USER
    newgrp docker

    这之后,可以再次运行 docker run hello-world 来验证权限是否已经生效。

  2. 配置国内镜像加速器 (可选)

    如果后续拉取镜像遇到网络问题,可以配置国内加速器。创建或编辑 /etc/docker/daemon.json 文件,参考下面的模版进行配置:

    json 复制代码
    {
      "registry-mirrors": [
        "https://docker.1ms.run",
        "https://docker.xuanyuan.me",
        "https://docker.m.daocloud.io"
      ]
    }

    保存文件后,重启 Docker 服务即可生效:

    bash 复制代码
    sudo systemctl restart docker

🔗 与后续操作衔接:重新部署 Milvus

完成了 Docker 的切换后,恭喜你!这意味着你拥有了一个能支持 GPU 的、干净的 Docker 环境,之前的那些权限和配置报错都不会再出现了。

现在,你可以回到我们之前讨论的 Milvus 部署步骤,使用新的官方 Docker 拉取 GPU 版镜像。为了避免配置冲突,建议在一个全新的目录下操作。这样一来,Milvus 就能够顺利识别到你的显卡,启动速度也会有明显提升。

密钥文件 docker.asc 为空或损坏,通常意味着 curl 命令没能从 Docker 服务器成功下载到正确的 GPG 公钥。

简单来说,这是一个网络或命令执行问题。就像盖房子缺了原材料,它导致了后续安装无法进行。我们可以一起把它修好。

🔍 可能的原因

  1. 网络连接不畅 :这是最常见的原因。直接从官方源 download.docker.com 下载密钥有时会遇到网络问题,导致文件下载不完整。
  2. 前置步骤有误 :密钥存储目录 /etc/apt/keyrings 可能因权限问题未能正确创建,或是创建命令失败了。
  3. 命令执行偏差 :这通常是人为失误。比如,可能漏掉了 -fsSL 参数,或错误地把 -o 写成了 -O,甚至无意间重复运行了 gpg --dearmor 命令,把二进制数据错误地导入了文本文件。

🛠️ 推荐方案:使用国内镜像下载(成功率最高)

与其等待网络偶遇转机,不如主动切换路线。使用国内的镜像站下载密钥,往往能一步到位,避免网络问题。

第一步:下载密钥并正确存放

你可以从以下两种国内镜像源中选择一个下载密钥。无需纠结,任选一个即可。

  • 选项A:使用中科大镜像源

    bash 复制代码
    sudo curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
  • 选项B:使用网易镜像源

    bash 复制代码
    sudo 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
第三步:验证文件是否正常

这一步很关键,可以确保我们的操作生效了。

  1. 检查文件大小 :运行 ls -lh /etc/apt/keyrings/docker.asc。一个正常的密钥文件大小应该在 1~3 KB 左右,内容以 -----BEGIN PGP PUBLIC KEY BLOCK----- 开头。
  2. 清理潜在缓存 :为确保后续更新使用新密钥,建议运行 sudo apt-get clean 清除本地包缓存。
  3. 测试软件源 :运行 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的官方"商店"(即软件源)添加到系统里。

  1. 更新系统并安装必要依赖

    这一步是给系统安装一些基础工具,保证我们能安全地通过HTTPS协议下载和安装软件。

    bash 复制代码
    sudo apt update
    sudo apt install ca-certificates curl gnupg lsb-release -y
  2. 创建密钥目录

    为Docker的GPG密钥创建一个专门的存放目录。

    bash 复制代码
    sudo install -m 0755 -d /etc/apt/keyrings
  3. 添加Docker的官方GPG密钥

    GPG密钥就像一个防伪标签,用来验证我们接下来要安装的Docker软件包是官方出品,没有被篡改过。

    bash 复制代码
    curl -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
  4. 添加Docker的APT软件源

    这一步,就是把Docker官方"商店"的地址写入系统,并指向我们刚才导入的防伪标签(密钥)。

    bash 复制代码
    echo \
      "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引擎

"商店"配置好了,现在就可以正式"购物"了。

  1. 更新软件包索引

    让系统刷新一下软件源列表,这样它才能找到我们刚才添加的Docker商店里的软件包。

    bash 复制代码
    sudo apt update
  2. 安装Docker及核心组件

    这个命令会安装Docker社区版、命令行工具、容器运行时等一整套环境。

    bash 复制代码
    sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
  3. 启动并设置开机自启

    安装完成后,启动Docker后台服务,并确保它会在你每次开机时自动运行。

    bash 复制代码
    sudo 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官方源可能会很慢,配置国内的镜像加速器可以显著提升拉取镜像的速度。

  1. 编辑配置文件

    bash 复制代码
    sudo 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
  2. 重启Docker服务使配置生效

    bash 复制代码
    sudo systemctl daemon-reload
    sudo systemctl restart docker

配置完成后,可以用 docker info | grep -A 5 "Registry Mirrors" 来验证一下加速器是否已生效。如果能看到刚才配置的地址,就说明成功了。


至此,你的Docker就通过包管理器安装完成了。这样就可以继续使用这个新环境,来部署GPU版本的Milvus了。如果在安装过程中遇到任何问题,随时可以告诉我。

相关推荐
viva51723 小时前
Docker/历史演进,核心功能,相关工具
docker
江华森4 小时前
从零搭建 Kubernetes 集群并部署 Kuboard v3 管理面板 —— 国内环境完整实战教程
容器·kubernetes
友莘居士6 小时前
KingbaseES Docker速查表
运维·docker·容器
原来是猿6 小时前
Docker 【 技术架构(2)】
docker·架构
小肥君7 小时前
gpu安装milvus问题解决
java·eureka·milvus
小肥君7 小时前
docker镜像配置
运维·docker·容器
某林2128 小时前
Isaac Lab (v2.3.2) Docker 本地化部署与底层排障全解析
运维·docker·容器·架构·iassc
烟雨江南aabb9 小时前
Docker第四弹:Dockerfile
linux·运维·docker