上次我检查时,Docker没有任何方法让容器访问主机串行或USB端口。有什么技巧可以做到吗?
当前回答
如果你想在docker容器已经运行时动态地访问可以插入的USB设备,例如在/dev/video0上访问一个附加的USB摄像头,你可以在启动容器时添加一个cgroup规则。该选项不需要——特权容器,只允许访问特定类型的硬件。
步骤1
检查您想要添加的设备类型的设备主编号。您可以在linux内核文档中查找它。或者你可以检查你的设备。例如,要检查连接到/dev/video0的网络摄像头的设备主设备号,可以执行ls -la /dev/video0。结果如下:
crw-rw----+ 1 root video 81, 0 Jul 6 10:22 /dev/video0
其中第一个数字(81)是设备主设备号。一些常见的设备主号:
81: usb网络摄像头 188: usb到串行转换器
步骤2
在启动docker容器时添加规则:
添加——device-cgroup-rule='c major_number:* rmw'规则用于您想要访问的每种类型的设备 增加对udev信息的访问,这样docker容器就可以通过-v /run/udev:/run/udev:ro来获取usb设备上的更多信息 使用-v /dev:/dev将/dev卷映射到docker容器
总结
因此,要将所有usb网络摄像头和serial2usb设备添加到docker容器,请执行以下操作:
docker run -it -v /dev:/dev --device-cgroup-rule='c 188:* rmw' --device-cgroup-rule='c 81:* rmw' ubuntu bash
其他回答
我想扩展已经给出的答案,包括对未使用/dev/bus/usb捕获的动态连接设备的支持,以及在使用Windows主机和boot2docker VM时如何使其工作。
如果你正在使用Windows,你需要在VirtualBox管理器中为你想要Docker访问的设备添加任何USB规则。为此,您可以通过以下命令停止虚拟机:
host:~$ docker-machine stop default
打开VirtualBox管理器,根据需要添加带有过滤器的USB支持。
启动boot2docker虚拟机:
host:~$ docker-machine start default
由于USB设备连接到boot2docker虚拟机,因此需要从该机器运行命令。打开虚拟机的终端,运行docker run命令:
host:~$ docker-machine ssh
docker@default:~$ docker run -it --privileged ubuntu bash
注意,当命令像这样运行时,只有以前连接的USB设备将被捕获。只有当您希望在容器启动后连接的设备上工作时,才需要volumes标志。在这种情况下,你可以使用:
docker@default:~$ docker run -it --privileged -v /dev:/dev ubuntu bash
注意,在某些情况下,我必须使用/dev而不是/dev/bus/usb来捕获像/dev/sg2这样的设备我只能假设对于/dev/ttyACM0或/dev/ ttyusb0这样的设备也是如此。
docker运行命令也可以在Linux主机上运行。
在当前版本的Docker中,你可以使用——device标志来实现你想要的,而不需要访问所有的USB设备。
例如,如果你想在Docker容器中只使/dev/ttyUSB0可访问,你可以这样做:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
还有一种更简单的共享usb设备的方法,没有——privileged标志。这样做:
Docker运行…——device=/dev/bus/usb——device=/dev/usb <container> .使用实例
有几个选择。你可以使用——device标志,用户可以在没有——特权模式的情况下访问USB设备:
docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
或者,假设您的USB设备在主机/dev/bus/usb上可用,并且驱动程序正在工作等,您可以使用特权模式和volumes选项将其挂载到容器中。例如:
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb ubuntu bash
注意,顾名思义,——privileged是不安全的,应该小心处理。
对于最新版本的docker,这就足够了:
docker run -ti --privileged ubuntu bash
它将允许访问所有系统资源(例如/dev)
推荐文章
- 试图连接到https://index.docker.io时,网络超时
- 为每个Docker图像查找图层和图层大小
- 如何避免在为Python项目构建Docker映像时重新安装包?
- 如何用docker-compose更新现有图像?
- 如何在构建docker期间设置环境变量
- 拉访问拒绝存储库不存在或可能需要docker登录
- 如何在ENTRYPOINT数组中使用Docker环境变量?
- Docker:容器不断地重新启动
- Mac/OS X上的/var/lib/docker在哪里
- 如何用docker-compose标记docker图像
- 从环境文件中读入环境变量
- 禁用特定RUN命令的缓存
- 从Docker容器获取环境变量
- E: gnupg, gnupg2和gnupg1似乎没有安装,但是这个操作需要其中一个
- 如何从docker更改默认docker注册表。IO到我的私人注册表?