Skip to Content
IoT アプリ開発ネットワーク共有

ネットワーク共有

多くの産業現場では、ファイルはローカルネットワーク上のNASやWindowsファイルサーバーに置かれています — スキャン結果は\\nas\productionに書き込まれ、レポートは共有フォルダから読み取られ、機械同士はSMBでファイルをやり取りします。IronFlockアプリはこうした共有をコンテナに直接マウントできるため、コードからはローカルディレクトリと同じように読み書きできます。

これはファイルストレージのオンプレミス側の対応物です:ファイルストレージがプラットフォームのマネージドオブジェクトストレージであるのに対し、ネットワーク共有は顧客自身のLAN上にある顧客自身のファイルサーバーです。ファイルを顧客の既存インフラに置く必要がある場合は、共有を使用してください。

サポートされるプロトコルは2つです:SMB/CIFS(Windowsファイルサーバー、ほぼすべてのNAS)とNFS(Linuxベースのサーバーで一般的)です。

仕組み

マウントは、Docker組み込みのlocalボリュームドライバーを使って、アプリのdocker-compose.ymlに名前付きボリュームとして宣言します。コンテナの起動時に、デバイス上のDockerエンジン自身がマウントを実行します — デバイスに何かをインストールする必要はなく、デバイスのユーザーがコマンドラインに触れることもありません。

共有のアドレスと資格情報は、Composeファイルには書き込みません。これらは${VARIABLE}プレースホルダーであり、アプリパラメータからデバイスごとに値が埋め込まれます — 他のあらゆるデバイスごとの設定と同じ仕組みです。ユーザーは各デバイスのアプリのパラメータフォームで共有を設定し(またはデバイスグループごとに一度だけ設定し)、アプリを再起動します。

ボリュームの宣言

docker-compose.ymldriver_opts付きの名前付きボリュームを追加し、必要とするサービスにマウントします:

services: app: build: . volumes: - netshare:/mnt/share restart: unless-stopped volumes: netshare: # Docker volumes keep the settings they were created with. Putting the # revision parameter into the volume name means: bump the revision, restart # the app, and a fresh volume with the current settings is created. name: "${APP_NAME}_share_r${SHARE_REV:-1}" driver: local driver_opts: type: cifs device: "//${SHARE_HOST}/${SHARE_NAME}" o: "username=${SHARE_USER},password=${SHARE_PASSWORD},vers=3.0,uid=1000,gid=1000"

これで、コードからは/mnt/shareを通常のディレクトリとして扱えます。

理解しておくべき要素は次のとおりです:

フィールド意味
device共有のアドレス。SMBでは//server/sharenameの形式です
oカンマ区切りのマウントオプション。vers=3.0はSMBプロトコルのバージョンを選択します。uid/gidはどのコンテナユーザーがファイルを所有するかを決めます — プロセスを実行するユーザーに合わせてください
nameデバイス上でのボリュームの識別名。Dockerは既存のボリュームを決して変更しないため、設定のリビジョンが名前の一部になっています — 下記を参照してください
${VAR:-fallback}デフォルト値付きのCompose変数展開。ファイルが常にパースできるよう、すべてのプレースホルダーにデフォルト値(空でも可)を与えてください

APP_NAMEはプラットフォームが自動的に提供する標準変数の1つで、ボリューム名をアプリのスコープに限定します。

設定可能にする

プレースホルダーを.ironflock/env-template.ymlで宣言すると、ユーザーには適切なフォームが提供されます — パスワードはシークレットとしてマスクされます:

SHARE_HOST: label: "File server (IP or hostname)" type: text defaultValue: "" description: "The SMB server or NAS on the device's local network." SHARE_NAME: label: "Share name" type: text defaultValue: "" SHARE_USER: label: "Username" type: text defaultValue: "" SHARE_PASSWORD: label: "Password" type: text secret: true defaultValue: "" SHARE_REV: label: "Storage settings revision" type: numeric defaultValue: 1 description: "Increase by 1 whenever you change one of the settings above, then restart the app."

各デバイスで、ユーザーはアプリのパラメータにあるフォームに入力して保存し、アプリを再起動します。パラメータをデバイスグループのレベルで設定すれば、フリート全体を同じファイルサーバーに対して一度の操作で設定できます。

後から設定を変更する

Dockerはボリュームを最初に使用されたときに作成し、その時点の設定をそのまま保持し続けます — パラメータを編集するだけでは、既存のボリュームの向き先は変わりません。リビジョンパラメータはそのためにあります:共有のいずれかの設定を変更したら、ユーザーはリビジョンを1増やしてアプリを再起動します。ボリューム名が新しくなることで、Dockerは現在の値でマウントを新規に作成します。

これらの操作がファイルサーバー側に影響することはありません:ボリュームは単なるマウント定義です。ボリュームの作成、新しいリビジョンでの再作成、アプリのアンインストールのいずれによっても、共有上のファイルが削除されることはありません。

NFS

NFSサーバーの場合は、同じパターンでdriver_optsだけが異なります:

volumes: netshare: name: "${APP_NAME}_share_r${SHARE_REV:-1}" driver: local driver_opts: type: nfs device: ":${SHARE_PATH}" o: "addr=${SHARE_HOST},nfsvers=4"

SHARE_PATHはエクスポートされたパス(例:/exports/production)、addrはサーバーです。NFSv4(nfsvers=4)を推奨します — 必要なオプションはこの1つだけで、デバイス上に追加のサービスも不要です。

デバイスのサポート状況

デバイスタイプSMB/CIFSNFS
Linuxデバイス(カスタムLinuxインストール)
Windowsデバイス(Docker Desktop)
FlockOSデバイスまだ利用できませんまだ利用できません

Windowsデバイスでは、マウントはDocker DesktopのLinux環境の内部で行われます。この環境には両プロトコルのクライアントが同梱されているため、デバイスのLAN上のSMBサーバーへの到達を含め、そのままで動作します。Linuxデバイスでは、標準的なディストリビューションのカーネルがプロトコルサポートを備えており、パッケージのインストールは不要です。FlockOSでのサポートには、まだリリースされていないオペレーティングシステムのアップデートが必要です — FlockOSでこの機能が必要な場合はご相談ください。

マウントには最新のデバイスエージェントが必要です。エージェントは自動的に自己更新されます。

知っておくべきこと

  • 未設定のデバイス:パラメータが入力されるまで、アプリは起動に失敗し、ライブログにマウントエラーが表示されます。共有なしでも動作すべきアプリの場合は、無条件にマウントしないでください — 代わりにコード内でパラメータを読み取り、共有に依存する機能をスキップしてください。
  • 資格情報:ファイルサーバー上に、この共有だけにアクセスできる専用アカウントを作成し、それをパラメータに使用してください。パスワードはプラットフォームのUIではマスクされますが、マウントを実行するデバイスには渡されます — グローバルな管理者資格情報ではなく、デバイスローカルな情報として扱ってください。
  • パスワードにカンマは不可:SMBのオプションはカンマ区切りの文字列として渡されるため、カンマを含むパスワードはマウントを壊します。共有アカウントのパスワードは、それを踏まえて選んでください。
  • サーバーアドレス:IPアドレスか、現場のDNSで解決できる名前を使用してください。nas.localのようなmDNS名は、Dockerエンジンの内部からは解決できないことがよくあります。
  • ファイアウォール:デバイスはTCP 445(SMB)またはTCP 2049(NFS)でファイルサーバーに接続します。セグメント化された工場ネットワークでは、この経路が開いていることを確認してください。
  • ファイルの所有権(SMB):コンテナ内では、ファイルはマウントオプションのuid/gidが所有するものとして見えます。プロセスをroot以外のユーザーで実行している場合は、uid/gidをそのユーザーに合わせて設定してください。さもないと書き込みが失敗します。
Last updated on