PLCNextへDocker(balena-engine)を導入するまで

## **はじめに**

PHOENIX CONTACT社製PLCNextへdocker(balena-engine)を導入するまでの手順です。
IoTのエッジコンピューティングできる機器を模索しており、今回のPLCNextにてエッジ処理を
Node-redにて実現する事を想定しています。

balena-engineが推奨らしく、コマンドはdockerコマンドと同じっぽいです。

PLCNextの基本設定は省略します。

## **前提**

- sshが使えること(windowsならputtyやteratermなど)
- PLCnext firmware 2020.6　であること
- PLCNextのIPアドレス設定が済み、インターネット接続が可能なこと
- ssh接続ができる状態であること
- PLCNextのsu -になれること
- 時刻が正しいこと
  - 時刻がずれていると、docker hubよりイメージをダウンロードする際にx５０９証明書の有効期限が切れていると言われ、docker pullができません。

## **balena-engineのインストール**

[参考：PLCnext Technology compatible container runtimes - Docker, Moby, balenaEngine](https://github.com/PLCnext/Docker_GettingStarted)

[参考：Installation of Balena Engine](https://github.com/PLCnext/Docker_GettingStarted/tree/master/getting-started/Part-01)

- ssh接続

  ```
  ssh admin@192.168.xxx.xxx
  
  Warning: This device is for authorized use only!
  This device is for the use of authorized users only.
  Individuals using it and all user actions on this device may be,
  monitored, recorded, copied and audited.
  Unauthorized use, without authority, or in excess of authority, is prohibited.
  By continuing to use this device you indicate your
  awareness of and consent to these terms of use.
  
  Warnung: Dieses Gerät ist nur für den autorisierten Gebrauch!
  Dieses Gerät darf nur von autorisierten Benutzern verwendet werden.
  Personen, die es verwenden, und alle Benutzeraktionen auf diesem Gerät können,
  überwacht, aufgezeichnet, kopiert, und auditiert werden.
  Die unautorisierte Verwendung ist nicht erlaubt.
  Durch die weitere Verwendung dieses Geräts erklären
  admin:b0e95e76@192.168.xxx.xxx's password: {パスワード入力}
  
  ```

  パスワードを聞かれるので、{機器のデフォルトパスワード}と入力

- balena-engin関連のディレクトリをgitより cloneする

  SSL認証エラーが出る場合があるので、gitの設定を変更しておく。

  ```
  root@axcf2152:git config --global http.sslVerify false
  ```

  .gitconfigの内容が下記となっていればOK

  ```bash
  root@axcf2152:~# cat .gitconfig
  [http]
    sslVerify = false
  ```

  - 関連ファイルをclone

    ```
    # Download the Project
    root@axcf2152:git clone https://github.com/PLCnext/Docker_GettingStarted.git
    ```

  - balena-engineをインストール

    ```
    # Execute Setup.sh in archive
    root@axcf2152:cd Docker_GettingStarted
    # setup.shに実行権限付与
    root@axcf2152:~/Docker_GettingStarted# chmod +x setup.sh
    ```

  - セットアップ用のshell実行

    ```
    # セットアップ実行
    root@axcf2152:~/Docker_GettingStarted#./setup.sh
    ```

    ```
    Install balenaEngine(recommend): 1
    Install Docker: 2
    ```

    ```
    Version xx.xx.xx (let empty for default balenaEngine 18.9.7, Docker 19.03.8): 
    ```

  - 再起動する

    ```
    shutdown -r now
    ```

  - 開発においては、firewallは不要なので削除する

    ```
    update-rc.d -f firewall remove
    ```

  - balena-engineの起動

    ```
    root@axcf2152:~# /etc/init.d/balena start
    ```

  - balena-engineの終了

    ```
    root@axcf2152:~# /etc/init.d/balena stop
    ```

  - pullしたdockerイメージの確認

    ```
    root@axcf2152:~# balena-engine images
    Result:
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    ```

  - 稼働中のコンテナの確認

    ```
    root@axcf2152:~# balena-engine ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS                    NAMES
    b86e0eb602c7        nodered/node-red    "npm --no-update-not…"   About an hour ago   Up About an hour (healthy)   0.0.0.0:1880->1880/tcp   mynodered
    ```

    ```
    balena-engine pull nodered/node-red
    ```

    ```
    balena-engine run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red
    ```

    [https://docs.docker.com/engine/reference/commandline/cli/](https://docs.docker.com/engine/reference/commandline/cli/)

    基本的なコマンドはdockerコマンドと同じなので、以下を参照のこと

    [Running under Docker](https://nodered.org/docs/getting-started/docker)

    [nodered/node-red](https://hub.docker.com/r/nodered/node-red/)

    balena-engineでもdocker-hubからdockerイメージをpullできる。作成したFLOWsデータは、dockerコンテナが停止すると消えてしまうので、ホストのディレクトリと関連づけしておく必要あり。