[はじめてのRDBOX(6)]rdbox使ってみました：DockerImage 作成編

# はじめに
ROS の初心者が、とっても簡単なROSアプリを作ってみました。（連載記事です）


# 今回の記事の概要
1. 前回までに構築したアプリ３つを RDBOX で利用可能な状態にするため、以下の４つの DockerImage を作成する
  1. ros-raspbian (arm)
  2. picam_pub_photo (arm)
  3. picam_sub_photo (amd64)
  4. picam_view_photo (amd64)
1. 作成した DockerImage(2～4)を DockerHub に登録する

- 今回使用した Dockerfile などの説明は長くなりそうなので別記事にする予定（時期未定）

# 事前準備
- 一部の ROS アプリは、Raspberry PI で稼働することを想定しています
- ARM アーキテクチャ向けのクロスbuild環境が必要になります
- 以下の情報を参照して、事前にクロスbuild環境を準備してください
  - https://github.com/rdbox-intec/rdbox/wiki/tutorials-en#tutorials

# 構築手順
## GitHub からソースファイル一式を clone
- DockerImage を作成するためには、Dockerfile を記述する必要がありますが、今回は GitHub より clone して使用します
- clone 後、example-picam/dockerfiles 内のファイルを使用します
- 以下(↓)は具体的な手順

```
$ mkdir -p ${HOME}/git
$ cd ${HOME}/git
$ git clone https://github.com/higuchi-toshio-intec/example-picam.git
```

## 環境変数などを設定し DockerHub へログイン
- DockerHub アカウントを持たない方は、事前に作成してください
- DockerHub へのログインに失敗する場合は、アカウントや認証情報を確認し再実行してください
- 以下(↓)は具体的な手順
  - ↓ '**YourDockerHubAccount**' は実際のアカウント情報に置き換える

```
$ BUILD_OPTS="--no-cache"
$ export HOCKERHUB_ACCOUNT="YourDockerHubAccount"
$ sudo docker login --username "${HOCKERHUB_ACCOUNT}"
```
### [参考]ログイン成功時の表示
```
Password:
Login Succeeded
```

### [参考]ログイン失敗時の表示
```
Password:
Error response from daemon: Get https://registry-1.docker.io/v2/: unauthorized: incorrect username or password
```


## ros-raspbian
- DockerHubにて公開されている公式の raspbian/stretch をベースとした ROS 環境の DockerImage を作る
  - なぜなら、Raspbian をベースとした ROS DockerImage を見つけることができなかった（2019/08上旬ころ）
  - また、ros.org から提供されているパッケージを用いた ROS 環境のinstallが成功しない（パッケージ群の取得エラー）
  - よって、Raspbian DockerImage をベースに ROS 環境を build する
- @dyson8910 さんの記事「[Raspberry Pi 3 にROS kinetic をインストールしてみました。](https://qiita.com/dyson8910/items/3aadcc13601fa6e501e1)」を参考にしています
- この DockerImage は、他者利用を想定していないため、DockerHubには登録(push)していない
- 以下(↓)は具体的な手順

```
$ cd ${HOME}/git/example-picam/dockerfiles/ros-raspbian
$ sudo docker build -t "ros-raspbian" .
```
https://github.com/higuchi-toshio-intec/example-picam/tree/master/dockerfiles/ros-raspbian

## picam_pub_photo
- 静止画撮影し画像ファイルを Publish する ROS アプリの DockerImage を作る
  - Raspberry PI (arm) での稼働を想定しており、前手順で作成した ros-raspbian DockerImage をベースに構築する
  - 画像処理ツールとして OpenCV をインストールする
  - 画像撮影は、OS の cron 機能を使い一定間隔で実施する
     - https://github.com/higuchi-toshio-intec/example-picam/blob/master/picam_ros/docker/pub/crontab.user
- この DockerImage は、RDBOX(k8s)からの利用を想定しており、公開されているDockerRepositoryである DockerHub に登録(push)する
- 以下(↓)は具体的な手順

```
$ cd ${HOME}/git/example-picam/dockerfiles/pub_photo
$ sudo docker build -t "${HOCKERHUB_ACCOUNT}/picam_pub_photo" ${BUILD_OPTS} .
$ sudo docker push "${HOCKERHUB_ACCOUNT}/picam_pub_photo"
```
https://github.com/higuchi-toshio-intec/example-picam/tree/master/dockerfiles/pub_photo

## picam_sub_photo
- 画像ファイルを Subscribe する ROS アプリの DockerImage を作る
  - DockerHubにて公開されている公式の ROS DockerImage をベースに構築する
  - 画像処理ツールとして OpenCV をインストール
- この DockerImage は、RDBOX(k8s)からの利用を想定しており、公開されているDockerRepositoryである DockerHub に登録(push)する
- 以下(↓)は具体的な手順

```
$ cd ${HOME}/git/example-picam/dockerfiles/sub_photo
$ sudo docker build -t "${HOCKERHUB_ACCOUNT}/picam_sub_photo" ${BUILD_OPTS} .
$ sudo docker push "${HOCKERHUB_ACCOUNT}/picam_sub_photo"
```
https://github.com/higuchi-toshio-intec/example-picam/tree/master/dockerfiles/sub_photo

## picam_view_photo
- 画像ファイルを参照する Flask アプリの DockerImage を作る
  - DockerHubにて公開されている公式の Ubuntu DockerImageをベースに構築する
- この DockerImage は、RDBOX(k8s)からの利用を想定しており、公開されているDockerRepositoryである DockerHub に登録(push)する
- 以下(↓)は具体的な手順

```
$ cd ${HOME}/git/example-picam/dockerfiles/view_photo
$ sudo docker build -t "${HOCKERHUB_ACCOUNT}/picam_view_photo" ${BUILD_OPTS} .
$ sudo docker push "${HOCKERHUB_ACCOUNT}/picam_view_photo"
```
https://github.com/higuchi-toshio-intec/example-picam/tree/master/dockerfiles/view_photo

# DockerHub repository の確認
- ブラウザを起動し以下のアドレスに接続する
  - https://cloud.docker.com/u/YourDockerHubAccount/repository/list
  - ↑ '**YourDockerHubAccount**' は実際のアカウント情報に置き換える

---
# 記事リスト
1. [概要編](https://qiita.com/higuchi-toshio-intec/items/5d5499447d667e339b87)
2. [画像参照アプリの構築編](https://qiita.com/higuchi-toshio-intec/items/1deae0d03a74bafec8af)
3. [ROSパッケージ作成編](https://qiita.com/higuchi-toshio-intec/items/44f1377c171738d9b49b)
4. [ROS Subscriber編](https://qiita.com/higuchi-toshio-intec/items/3d62bbfc5e520de9dce1)
5. [ROS Publisher編](https://qiita.com/higuchi-toshio-intec/items/0c136f4d90e70983a8a3)
6. [DockerImage 作成編](https://qiita.com/higuchi-toshio-intec/items/826b4c5407b05372b78c)（← 今回の記事）
7. [RDBOX(k8s) ポート転送編](https://qiita.com/higuchi-toshio-intec/items/b3b79da5ca160ee418b0)
8. [RDBOX(k8s) Subscriber アプリ編](https://qiita.com/higuchi-toshio-intec/items/765d7ef1b6baf85d9f02)
9. [RDBOX(k8s) Publisher アプリ編](https://qiita.com/higuchi-toshio-intec/items/9c43e001d8098a6c7a40)
10. [雑記](https://qiita.com/higuchi-toshio-intec/items/5d80fd647514dfbd2938)