能否在Docker容器内运行VirtualBox?

34
我尝试以特权模式运行容器,但仍然无法加载vboxdrv。
我得到
WARNING: The vboxdrv kernel module is not loaded. Either there is no module
     available for the current kernel (3.11.0-22-generic) or it failed to
     load. Please recompile the kernel module and install it by

       sudo /etc/init.d/vboxdrv setup

     You will not be able to start VMs until this problem is fixed.

你在主机系统上安装了内核模块吗? - Regan
我已经尝试过了,但仍然出现相同的错误。 - babbata
您能提供更多关于以下内容的信息吗:您的系统、您的 Docker 版本,以及您如何将 vbox 启动到容器中? - Regan
4个回答

18

可以。您需要确保主机系统上有内核模块。我正在运行Ubuntu,但我相信其他发行版会类似:

sudo apt-get install linux-headers-generic virtualbox-dkms

确保内核模块已加载:

sudo /etc/init.d/virtualbox status
VirtualBox kernel modules are loaded.
现在,运行Docker容器,并将/dev/vboxdrv挂载为卷:

现在,运行Docker容器,并将/dev/vboxdrv作为一个卷挂载:

docker run -it -v /dev/vboxdrv:/dev/vboxdrv your/container-image

1
你确定这是-v而不是--device(设备)吗?我收到了Failed to open "/dev/vboxdrvu", errno=1, rc=VERR_VM_DRIVER_NOT_ACCESSIBLE错误。此外,在特权模式下,我的Windows计算机只使用100%的CPU,从来没有做任何事情,但我认为这是另一个问题。 - fommil
在RHEL上,运行以下命令:sudo dnf -y install dkms kernel-devel - Grace Thompson

12

编辑于 2016-03-27 12:54 UTC

我遇到了完全相同的问题,并且可以在CentOS 7上成功地使用扩展包和phpvirtualbox将最新版本的VirtualBox docker化。

您需要安装大量依赖项,例如kernel-devel、make、gcc和dkms。完成docker构建后,您必须使用这些标志--privileged=true -v /dev/:/dev/运行docker镜像。 您需要使用标志--privileged=true来运行1.10.3版本的docker镜像。

详细信息,请参见我的Dockerfilerun.sh

详细信息,请查看我的存储库,特别是Makefilevirtualbox.Dockerfilevboxwebsrv.Dockerfilephpvirtualbox.Dockerfile


1
如果您指定了“--privileged=true”,是否需要“-v”?我认为这是暗示的。 - fommil
1
需要继续进行翻译。在容器内运行/etc/init.d/vboxdrv setup命令会出现错误。VirtualBox内核模块启动失败,提示无法创建主设备号为10、次设备号为57u58的/dev/vboxdrv设备。 - ATNASGDWNGTH
顺便提一下,你绝对不应该在客户机内运行/etc/init.d/vboxdrv!那是用于安装内核模块的,主机需要这样做。 - fommil
我花了过去的两个星期试图让这个工作起来,我终于让我的 CI 在 Linux / Windows 跨平台构建中正常运行了,但最终不得不放弃,因为我的 CI 服务器是一个 KVM 虚拟专用服务器,不幸的是,在 KVM 下 VirtualBox 运行效率不高。 - fommil
如果您不是第一次运行容器,那么您的发现将是正确的。第一次使用标志--privileged -v /dev/:/dev//etc/init.d/vboxdrv setup 运行容器时,这将在主机上创建/dev/vboxdrv。一旦您停止容器,/dev/vboxdrv仍然存在于主机上。 因此,您只需要在第二次运行时使用标志 --device=[/dev/vboxdrv]来运行容器即可。/etc/init.d/vboxdrv 不会在 VM Guest中运行,而是在 Docker Containter 中运行。否则,您将无法在容器内运行VirtualBox。 - ATNASGDWNGTH
显示剩余5条评论

7

2019:

  • Virtualbox版本:6.0
  • Docker版本:18.09.6
  • Ubuntu 18.04

关键是使用运行systemd的docker镜像。 我选择了jrei/systemd-ubuntu,请参见这里

    docker run -d --privileged \
    --name systemd-ubuntu --network=host \
    --device /dev/vboxdrv:/dev/vboxdrv \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -v /tmp:/tmp -it jrei/systemd-ubuntu

在容器内运行的命令是:
    apt update
    apt -y install wget
    apt -y install gnupg2
    apt -y install systemd
    apt -y install software-properties-common
    wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | apt-key add -
    wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | apt-key add -
    add-apt-repository "deb https://download.virtualbox.org/virtualbox/debian bionic contrib"
    apt update
    apt -y install virtualbox-6.0

祝愉快 :-)


4
在运行VBoxManage时,使用您的方法尝试安装时,出现以下警告:```警告:vboxdrv内核模块未加载。当前内核(4.15.0-1032-gcp)可能没有此模块或加载失败。请重新编译内核模块并通过以下命令进行安装:sudo /sbin/vboxconfig``` - thekucays

4

2021:

请查看我的git仓库,了解我如何在基于Ubuntu 20.04的VirtualBox 6.1上完成此操作。

只需运行:docker run -d --rm --network=host --device /dev/vboxdrv:/dev/vboxdrv -e DISPLAY=unix:0 garo/docker-virtualbox即可。

不要忘记,正如其他回复中提到的那样,您需要在主机系统上安装虚拟机内核模块。在主机上安装VirtualBox是最简单的方法。(安装后可以立即删除)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接