Windows下Ubuntu容器重启Docker报chroot、socket资源忙问题
问题根因
所有报错的核心是架构逻辑错误:你通过挂载宿主机/var/run/docker.sock的方式在Ubuntu容器内操作Docker,本质是调用宿主机的Docker服务,而容器本身是轻量隔离运行环境,并非完整独立操作系统,无法支持你安装NVIDIA Container Toolkit后重启Docker服务的操作:
- 出现
Running in chroot, ignoring command报错,是因为常规容器默认不启动systemd init进程,不支持通过systemctl命令管理服务,即使添加--pid host、特权模式参数也无法解决该基础环境限制 - 出现
can't create unix socket /var/run/docker.sock: device or resource busy报错,是因为你启动容器时已经将宿主机的docker.sock挂载到容器内同路径,该套接字被挂载点占用,容器内启动dockerd进程时无法绑定该路径,导致服务启动失败 - 尝试
/etc/init.d/docker start启动无效、执行exit退出chroot无效,本质是你始终处于容器隔离环境内,没有独立的系统服务管理权限,既无法在容器内正常运行systemd管理的Docker服务,也无法操作重启宿主机上的Docker服务,你在容器内安装的NVIDIA Container Toolkit也无法生效到宿主机的Docker runtime上。
对应Docker日志截图:
标准解决方案
你不需要在Ubuntu容器内嵌套安装Docker来启用GPU支持,Windows环境运行GPU加速的Ubuntu容器正确流程如下:
- 在Windows宿主机安装对应型号的NVIDIA官方显卡驱动,开启WSL2的GPU透传能力
- 打开Docker Desktop设置,确认已启用WSL2集成,GPU支持会随WSL2集成自动生效,无需在容器内单独安装NVIDIA Container Toolkit
- 直接启动带GPU权限的Ubuntu容器即可,启动命令参考:
docker run --gpus all -ti ubuntu
- 进入容器后执行
nvidia-smi,若能正常输出显卡型号、显存、驱动版本信息,即代表GPU支持已正常启用。
嵌套Docker场景方案
如果有Docker in Docker强需求,必须在外层Ubuntu容器内再启动GPU容器,不要使用挂载宿主机docker.sock的方案,按以下步骤操作:
- 启动外层容器时不要挂载宿主机
/var/run/docker.sock路径,同时添加GPU透传、特权参数:
docker run --gpus all --privileged -ti ubuntu
- 进入外层容器后正常安装Docker环境、NVIDIA Container Toolkit,安装完成后无需执行systemctl相关命令,直接指定独立套接字路径启动容器内的dockerd进程,避免和宿主机路径冲突:
dockerd -H unix:///var/run/docker-inner.sock &
- 后续启动内层容器时,通过指定的独立套接字操作Docker即可,GPU能力会通过外层容器自动透传到内层容器。
内容的提问来源于stack exchange,提问作者Alessandro
相关产品推荐
相关产品推荐

