web-dev-qa-db-ja.com

Dockerコンテナ間の仮想シリアルポート

Linuxシステム上にsocatを使用して2つのリンクされた仮想シリアルポートを作成できます。一方の端がシリアルデバイスで、もう一方の端がデバイスを使用するコードであると偽ります。 socatコマンドは次のようになります。

socat -d -d pty,raw,echo=1 pty,raw,echo=0

また、システム上に2つのポートを作成します。 /dev/pts/3および/dev/pts/4

ここで、さらに一歩進んで、システムを表す2つのDockerコンテナーを作成します。1つはシリアルデバイスを装ったコンテナーで、もう1つはそのデバイスを使用するコードです。目標は、本番環境で仮想デバイスコンテナーを削除し、実際のセンサーを使用できるようにすることです。

問題は、2つのコンテナ間でdevptsを共有する方法が見つからないようで、どういうわけかそれは良いことではないと感じていることです。

Ptyの代わりに名前付きパイプを使用してまったく同じ動作(仮想シリアルポート)を実現する方法はありますか?次に、コンテナ間でファイル(たとえば、「/ home/user/folder/my_pipe」)を共有できます(実際には、両方に「/ home/user/folder」をマウントすると、両方がmy_pipeにアクセスします)。

それとも、dockerでそれをすべて行うための別のより良い方法はありますか?

2
JonasVautherin

(ところで、「仮想シリアルポート」はWindowsの用語であり、Unixではこれらは「(疑似)tty」と呼ばれます。)

Ctrl-alt-delorの意味するところは、デバイスを使用して、「シリアルデバイスコンテナ」で1つのsocatを実行し、「コードコンテナ」で1つのsocatを実行できるということです。これらはネットワーク接続を介して通信するため、一方のコンテナはもう一方のコンテナのIPアドレスとポートを知っている必要があり、それだけです(そして、どのコンテナがもう一方のコンテナに接続するかを選択できます)。また、「コードコンテナ」で実行されているコードは、ttyのみを使用します。したがって、ttyのパス(とにかく、パラメーター/コマンドライン引数などである必要があります)以外には依存しません。

socat呼び出しの詳細は、実行したいことの他の詳細によって異なります。おそらくtcp-listentcpを使用するのが最も単純な変形です。 socatの例はたくさんあります。 ここ

編集

命名を説明するために:Atty(teletype)は、特定のシリアルポートパラメータの抽象化であり、文字の翻訳と解釈(行末など)を伴います。ライン規律のような他のもの。疑似ttyは、実際のハードウェアがないttyです。 ttyは、ioctlsがこれらすべてのパラメータを設定できるという点でファイルとは異なります。

したがって、プログラムにボーレートなどを設定する機能がある場合は、ttyが必要です。そうでない場合は、名前付きパイプを使用することもできます。

ただし、コンテナ間の共有に関して名前付きパイプまたはttyを使用しても、違いはありません。どちらかを配置できる共通のファイルシステムをどこかに設定する必要があります。そして、それは必ずしも(docker)コンテナーが通常どのように機能するかではありません。

OTOH、(docker)コンテナーは通常、ネットワーキングの準備ができています。したがって、コンテナに共有ファイルシステムを持たせるよりも、ネットワークを介してコンテナを接続する方が簡単な場合があります。また、コンテナーを同じホストで実行する必要がないという追加の利点があります(Dockerコンテナーは想定していません)。したがって、より自然にフィットします。

もちろん、好きなようにできます。

1
dirkt