（検証不足）AWSの仮想マシンでJETSON nanoのDockerコンテナを快適にBuildしたい（２回目）

#やりたいこと
+ AWSの仮想マシンでJETSON nanoと同じ環境を作る
+ Dockerを仮想マシンでBuildする
+ 仮想マシンからコンテナをローカルマシンにコピーする
+ Jetson nano 実機でコンテナを動かす

ローカルとクラウドの繋がりはこのように
![仮想マシンとJETSON連携.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/509b8515-ff00-0f75-3d60-0b3be7d8b5c9.png)


#より快適な方法
前の記事よりも快適な方法をQiitaで発見しました。
これは自分用のメモです。

こちらが詳しいので、私は補足事項だけ。
[64bit ARM チップを積んだ Edge device 用に Docker image をビルドする](https://qiita.com/seiro/items/64e9c06cca0c5a33c38c)

#仮想マシンを起動
AWSでa1.4xlargeのマシン（課金されます）を選択して起動。
Ubuntu16.04とします。

#DockerCEをインストール
http://docs.docker.jp/engine/installation/linux/docker-ce/ubuntu.html

こんな感じでstableなDockerCEを入れる

```
sudo apt-get update

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

curl -sSL https://get.docker.com/ | sh

sudo usermod -aG docker ubuntu

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

sudo apt update

sudo docker run hello-world

```

正常に動くことを確認しました。

以上で準備完了。
Dockerfileを用意する。

```PHP:Dockerfile
FROM multiarch/ubuntu-core:arm64-xenial

RUN apt-get update && \
    apt-get install -y vim
```

buildして実行する。

```
sudo docker build -t arm64-xenial-vim -f Dockerfile .
sudo docker run -it --rm arm64-xenial-vim:latest bash
```

dockerに入ったら、以下のコマンドで確認

```
uname -m
file /bin/bash
```

#重量級のBuildを試してみる(本日2回目)

問題なさそうなので、2019/5にビルドで大変苦労した、産総研のOpenVSRAMをDockerでBuildします。
※無課金のマシンを使うと、CPUコアを複数使ったBuild(make -j4)で止まってしまったので、有償のxlargeマシンを使っています
※さらに、QEMUではなく仮想マシンそのものがARMなので、もう少し早いはず

```
git clone https://github.com/xdspacelab/openvslam
nano Dockerfile.desktop 
```
同梱のDockerfile.desktopを編集して、仮想マシンを追加します。
追加したのは先頭のみで、ubuntu:18:04は従来通り。

```php:Dockerfile.desktop
FROM multiarch/ubuntu-core:arm64-xenial
FROM ubuntu:18.04
ENV DEBIAN_FRONTEND noninteractive
<続く>
```

build実行します。
この時、make -j4でのbuildがあちらこちらに記載されていた為、Jetson nanoでは12%くらいまでの進捗で固まってしまい、マシンを落とすこととなりました。
十分な数のコアとメモリを用意します。（仮想マシンはa1.4xlarge）

```
sudo docker build -t openvslam-desktop -f Dockerfile.desktop . --build-arg NUM_THREADS=4
```

名前登録したはずなんだけど、sudoつけないとdocker動かないのが謎。

ビルドしてみると30分くらいで終わりました。
（単純に仮想マシンのスペックの差？前回はt2.xlargeを使用）

それでも圧倒的な速さと、全くトラブルを起こさずに実行できていました。
JETSON nanoに移動させて、動くかどうかの確認をしなければ。

Amazonからどんな額の請求書が送られてくるが、震えながら待ちます。

#出来上がったファイルをsftpで取り出し

色々考えてあれこれやってたのですが、いつも使っているCyberduckに設定して動かしました。
超簡単でした。

>sftpを選択
>仮想マシンのsshアクセスのパス
>ユーザー名
>sshの公開鍵

設定はこれだけで、仮想マシンの中身が見れます。
![スクリーンショット 2019-07-21 13.53.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328520/49d08fe4-c44e-732f-501e-1f85d12df675.png)

#Dockerのコンテナ？イメージ？をファイルにして取り出す
docker save IMAGE_ID > IMAGE_ID.tar
で、イメージを保存。CyberDuckでローカルに保存。

#JETSON nanoとローカル接続
いちいちIPを確認しながら繋ぐのが面倒になってきたので、mDNSとかで固定してアクセスしたい。
>car /etc/hostname

でhostnameを確認。
これに接続。

>ssh name@hostname.local
>docker load < IMAGE_ID.tar

Dockerのsudoを打つのが面倒なので、設定を入れてみる

```
sudo groupadd docker

sudo gpasswd -a $USER docker

sudo systemctl restart docker

exit
```

再度ログインして実行する。
docker run -it IMAGE_ID
docker attach xxxxx

などして、コンテナを扱う。

#できるようになったこと
+ クラウドでDockerイメージをビルドする
+ クラウドからDockerイメージをローカルにダウンロード
+ ローカルPCから基板にイメージを転送
+ 基板にログインしてDockerイメージを展開
+ 基板でDockerコンテナを実行する

まだ、実家の確認が不十分。
open cv のビルドはミスしているようだ。