上次我检查时,Docker没有办法让容器访问主机串口或USB端口.是否有允许这样做的技巧?
有几种选择.首先,正如下面的@Mark所述,Docker 1.2.0版(2014/08发布)添加了一个--device
标志,用于在没有--privileged
模式的情况下访问USB设备:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
或者,假设您的USB设备可用于主机上的驱动程序等/dev/bus/usb
,您可以使用特权模式和卷选项将其安装在容器中.例如:
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
我想扩展已经给出的答案,包括支持未捕获的动态连接设备/dev/bus/usb
以及如何在使用Windows主机和boot2docker VM时使其工作.
如果您使用的是Windows,则需要为希望Docker在VirtualBox管理器中访问的设备添加任何USB规则.为此,您可以通过运行以下命令来停止VM:
host:~$ docker-machine stop default
打开VirtualBox Manager并根据需要添加带有过滤器的USB支持.
启动boot2docker VM:
host:~$ docker-machine start default
由于USB设备连接到boot2docker VM,因此需要从该计算机运行命令.使用VM打开终端并运行docker run命令:
host:~$ docker-machine ssh docker@default:~$ docker run -it --privileged ubuntu bash
注意,当命令像这样运行时,只会捕获以前连接的USB设备.只有在您希望在启动容器后才能使用连接的设备时,才需要使用卷标志.在这种情况下,您可以使用:
docker@default:~$ docker run -it --privileged -v /dev:/dev ubuntu bash
注意,我不得不使用/dev
而不是/dev/bus/usb
在某些情况下捕获像这样的设备/dev/sg2
.我只能假设像/dev/ttyACM0
或或类似的设备也是如此/dev/ttyUSB0
.
docker run命令也适用于Linux主机.
使用当前版本的Docker,您可以使用该--device
标志来实现您想要的功能,而无需访问所有USB设备.
例如,如果您只想/dev/ttyUSB0
在Docker容器中访问,则可以执行以下操作:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
--device
直到您的USB设备拔出/重新插入,然后停止工作。您必须使用cgroup devices.allow解决它。
您可以使用-v /dev:/dev
它,但这是不安全的,因为它会将主机中的所有设备(包括原始磁盘设备等)映射到容器中。基本上,这允许容器在主机上获得root权限,这通常不是您想要的。
在这方面,使用cgroups方法更好,并且可以在容器启动后添加的设备上使用。
在此处查看详细信息:在不使用--privileged的情况下访问Docker中的USB设备
粘贴起来有点困难,但是简而言之,您需要获取字符设备的主要编号并将其发送给cgroup:
189是/ dev / ttyUSB *的主要号码,您可以通过'ls -l'获得。您的系统上的系统可能与我的系统上的系统不同:
root@server:~# echo 'c 189:* rwm' > /sys/fs/cgroup/devices/docker/$A*/devices.allow (A contains the docker containerID)
然后像这样启动您的容器:
docker run -v /dev/bus:/dev/bus:ro -v /dev/serial:/dev/serial:ro -i -t --entrypoint /bin/bash debian:amd64
否则,容器启动后任何新插入或重新启动的设备都将获得新的总线ID,并且将不允许在容器中访问它。