ブログ

DockerコンテナからUSBデバイスへのアクセス

at_takuma.fukuda
2019年11月5日 19時07分

先日、ArmadilloへのDockerのインストールについての記事を公開いたしました。
https://users.atmark-techno.com/blog/10899/4102
こちらで予告した通り、DockerコンテナからArmadillo上のデバイスにアクセスする方法についてご案内します。

通常、Dockerコンテナからは直接ホストのファイルにアクセスすることが出来ません。
そのため、Armadilloに何かデバイスを接続しても、
コンテナ上のアプリケーションからそのデバイスのデータにアクセスするには、
ホスト側にデバイスとやり取りするアプリケーションを実装し、
そのアプリケーションとコンテナ上のアプリケーションとをTCP/IP等で通信させるといった対応が必要となります。

しかし、これではアプリケーションの構造が複雑化してしまい、
Dockerコンテナを使用するメリットがあまりありません。

そこで、Dokcerコンテナ上から直接ホストのファイルにアクセスする方法を、
USBデバイスを例にとって説明します。

以下のいずれの方法も、
dockerイメージを新規のコンテナとして動作させる際に必要になります。
つまり、一旦コンテナとして動き始めるとこの設定は変更できないのでご注意ください。

1.特定のデバイスに対してのアクセスのみを許可する場合

①デバイスファイルへのアクセス許可

 docker runのオプションとして「--device=〇〇(ホスト上のデバイスファイル名):××(コンテナ上のファイル名)」と入力すると
 例えばUSBシリアル変換アダプタttyUSB0を使用する場合は以下のようになります。

docker run --device=/dev/ttyUSB0:/dev/ttyUSB0 --rm -it debian

 これによってコンテナ上にもデバイスファイル/dev/ttyUSB0が作成され、
 そのファイルにアクセスすると、ホスト上の/dev/ttyUSB0にアクセスしたのと同じ結果が得られます。
 上記ではホスト上のデバイスファイルとコンテナ上に作成するデバイスファイル名を同一にしていますが、
 それぞれの名前を変更することも可能です。
 下記は、ホスト上の「/dev/ttyUSB0」をコンテナ上では「/dev/usbdevice」というファイル名で扱うというものになります。

docker run --device=/dev/ttyUSB0:/dev/usbdevice --rm -it debian


②USBストレージ内のファイルへのアクセス許可

①の方法ではUSBストレージ内のファイルにアクセスすることは出来ません。
通常、Armadillo上でUSBストレージ内のファイルにアクセスするには、以下のようにディレクトリへのマウントが必要です。

mount /dev/sda1 /mnt

コンテナからアクセスする場合にも、まずはホスト上でマウントを実行しておく必要があります。
 その上で、下記のようにdocker runのオプションとして「-v 〇〇(ホスト上のディレクトリ名):××(コンテナ上のディレクトリ名)」と入力すると
ホストでマウントしたディレクトリをコンテナ上のディレクトリに再マウントすることが出来ます。

docker run -v /mnt:/root/usb -it debian

再マウントしたディレクトリにアクセスすれば、USBストレージ内のファイルにアクセス出来ます

2.コンテナに特権を与える場合

 コンテナからホスト上のファイルへアクセスする際に最も簡単なものがこちらです。
 コンテナに特権を付与することで、ホスト上のすべてのデバイスへのアクセスする権限が与えられます。
 以下のようにdocker runのオプションとして「--privileged」と入力すると特権が付与されます。

docker run --privileged -it debian

特権を与えると/dev以下のディレクトリがホスト上と同じように使用できます。