Docker - 一种访问主机USB或串行设备的方法?

 sasame 发布于 2023-01-09 11:23

上次我检查时,Docker没有办法让容器访问主机串口或USB端口.是否有允许这样做的技巧?

4 个回答
  • 有几种选择.首先,正如下面的@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
    

    2023-01-09 11:24 回答
  • 我想扩展已经给出的答案,包括支持未捕获的动态连接设备/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主机.

    2023-01-09 11:25 回答
  • 使用当前版本的Docker,您可以使用该--device标志来实现您想要的功能,而无需访问所有USB设备.

    例如,如果您只想/dev/ttyUSB0在Docker容器中访问,则可以执行以下操作:

    docker run -t -i --device=/dev/ttyUSB0 ubuntu bash
    

    2023-01-09 11:27 回答
  • --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,并且将不允许在容器中访问它。

    2023-01-09 11:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有