English

チュートリアル - DOCKER-CONTAINER

目次

1. 概要
2. 動作基盤の整備
2.1 Amazon AWSのEC2をホスト機材とする場合
2.1.1 EC2インスタンスの作成と起動
2.1.2 EC2インスタンスへのDocker Engineの導入
2.2 手元機材をホストとする場合
2.2.1 手元機材の調達
2.2.2 手元機材へのDocker Engineの導入
3. コンテナイメージの操作
3.1 brokerコンテナの導入と起動
3.2 brokerコンテナの停止と再起動
3.3 brokerコンテナの削除と再導入

1. 概要

本書では、アプリケーション仮想実行環境であるDockerコンテナ上にBrokerなどバックエンド機能を構築する方法について紹介します。

2. 動作基盤の整備

Docker EngineはLinuxやmacOS、Windowsなどさまざまな動作環境に対応しています。 まずは適当な機材にこれを導入するところから始めます。 次に、チュートリアル用に用意したコンテナイメージをインターネット経由でダウンロードし、上記Docker Engine環境で起動するという作業の流れとなります。

2.1 Amazon AWSのEC2をホスト機材とする場合

商用クラウドサービスの一つとして広く使われている仮想サーバ基盤 Amazon EC2 (OSに Amazon Linux 2 を採用)を利用します。この上に Dockerコンテナ を導入してBrokerなどバックエンド機能を載せるという構成です。

    [Android]-----(Celluar)-----(INTERNET)-----[Amazon AWS]

この場合、Android端末上のクライアントとAmazon AWSEC2とはインターネット経由で接続します。

2.1.1 EC2インスタンスの作成と起動

AWSコンソール上の操作により適当なEC2インスタンスを作成して起動すると、グローバルIPアドレスやSSHログイン認証鍵が払い出されます。 当該EC2インスタンスにSSHログインしてください。

[localUser@localPC]$ ssh ec2-user@aws-ipaddress

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/

EC2インスタンスのメモリ不足に注意!

筆者が動作試験をした際、当初はEC2インスタンスタイプとして最小 構成のt2.micro(メモリ2GB)を選択しました。 単純にMQTTブローカを置いて「受信メッセージを再配信する」には 問題ないのです。しかし「同ブローカからさらにKafkaブローカを 介してセンサー情報を可視化するバックエンドシステム」を構築しよ うとして動作不安定(グラフ表示されない)事象が発生しました。 Kafkaブローカがメモリ不足で異常終了し、supervisorがこれを自動 再起動するという状態を繰り返すことが原因でした。 結局、より容量の大きなt3.large(メモリ8GB)でEC2インスタンス を作り直したことで本事象を解消しました。

2.1.2 EC2インスタンスへのDocker Engineの導入

Amazon EC2へのDocker Engine導入方法に関してはAWSから当該文書 Amazon ECSにおけるDockerの基本 が用意されているので、こちらを適宜参照してください。 文中でDocker イメージの作成の手前までが該当します。

まずはシステムを最新化します。

[ec2-user@ip-172-29-2-12 ~]$ sudo yum update
[sudo] password for ec2-user:
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                               | 3.7 kB     00:00
No packages marked for update

AWSの案内に従い、所用のパッケージを導入します。

[ec2-user@ip-172-29-2-12 ~]$ sudo amazon-linux-extras install docker
Installing docker
[...]
Complete!

Dockerサービスを開始します。

[ec2-user@ip-172-29-2-12 ~]$ sudo service docker start
Redirecting to /bin/systemctl start docker.service

一旦ログアウトしてください。

[ec2-user@ip-172-29-2-12 ~]$ exit
logout
Connection to 172.29.2.12 closed.
Killed by signal 1.

AWSに再ログインし、導入されたDocker情報を確認してみます。

[localUser@localPC]$ ssh ec2-user@aws-ipaddress
...
[ec2-user@ip-172-30-2-88 ~]$ sudo docker info
...

Docker Engine導入直後なので、Dockerイメージは空です。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

コンテナ上のプロセスもありません。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

2.2 手元機材をホストとする場合

2.2.1 手元機材の調達

お手元の適当なPC機材(macOS/Windows/Linux)がDocker Engineの動作条件を満足し、 かつインターネットに接続可能であるなら、それをホスト機材として活用できます。

    [Android]-----[Wi-Fi_AP]-----(LAN)-----[Local PC]

この場合、Android端末上のクライアントと当該機材とはLANで接続します。

2.2.2 手元機材へのDocker Engineの導入

代表的なプラットフォームにおけるDocker Engine導入方法を示します。

その他のOSについてはDocker公式サイトの Supported platforms に記載されているリンク先などを参照してください。

3. コンテナイメージの操作

3.1 brokerコンテナの導入と起動

このチュートリアル用のコンテナイメージを用意してあります。

以下のコマンドにより導入してください。 手元になければリポジトリからダウンロードするため数分かかります。 イメージを取得すだけならdocker pull、 コンテナ起動はdocker startとそれぞれ単独コマンドがあるのですが、 docker runによりこの2つの操作をまとめて実施することになります。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker run -d --name broker -p 1883:1883 -p 80:80 harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial:latest
Unable to find image 'harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial:latest' locally
latest: Pulling from sinetstream/android-tutorial
[...]
Status: Downloaded newer image for harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial:latest
b1020bcf10fa4d20971db247c12e7a9d3b4803ea0ee4dd11d14ea6bd1bc95c3a

上記docker runコマンドの引数で、コンテナ名称をbroker、TCPポート 1883(mqtt)と80(http)の2つを開くように指定しています。

サービスの待ち受けポート番号を変更する場合は-pオプションの値を 変更してください。例えばMQTTブローカーのポート番号を11883に 変更する場合は-p 11883:1883と指定してください。 -p引数の詳細については Docker run referenceを参照してください。

導入したbrokerコンテナイメージを見てみます。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker images
REPOSITORY                                             TAG                 IMAGE ID            CREATED             SIZE
harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial   latest              1b697be85b10        2 months ago        1.22GB

Dockerプロセスを参照して、状態(STATUS)がUPであれば成功です。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS              PORTS                                        NAMES
b1020bcf10fa        harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial:latest   "/usr/local/bin/supe…"   4 minutes ago       Up 4 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:1883->1883/tcp   broker

brokerコンテナ上で所用のTCPポートを開いていることを確認します。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker exec -t broker ss -an | grep LISTEN
u_str  LISTEN     0      128    /var/run/supervisor/supervisor.sock.1 30266                 * 0
tcp    LISTEN     0      128       *:80                    *:*    <--(!)
tcp    LISTEN     0      50        *:45521                 *:*
tcp    LISTEN     0      50        *:8083                  *:*
tcp    LISTEN     0      100       *:1883                  *:*    <--(!)
tcp    LISTEN     0      50        *:34147                 *:*
tcp    LISTEN     0      50        *:9092                  *:*
tcp    LISTEN     0      50        *:2181                  *:*
tcp    LISTEN     0      50        *:36551                 *:*
tcp    LISTEN     0      100    [::]:1883               [::]:*
tcp    LISTEN     0      128    [::]:9000               [::]:*

3.2 brokerコンテナの停止と再起動

以下のコマンドによりbrokerコンテナを停止します。 コマンド完了までしばらく時間がかかるかもしれません。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker stop broker
broker

Dockerプロセスを参照して、状態(STATUS)がExitedであれば成功です。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker ps -a
CONTAINER ID        IMAGE                                                         COMMAND                  CREATED             STATUS                        PORTS               NAMES
b1020bcf10fa        harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial:latest   "/usr/local/bin/supe…"   10 hours ago        Exited (137) 38 seconds ago                       broker

また、以下のコマンドによりbrokerコンテナを再起動できます。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker start broker
broker

3.3 brokerコンテナの削除と再導入

不要になったbrokerコンテナは、以下のコマンドにより削除してください。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker rm broker
broker

なお、手元のホスト環境にはコンテナイメージは残ります。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker images
REPOSITORY                                             TAG                 IMAGE ID            CREATED             SIZE
harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial   latest              1b697be85b10        2 months ago        1.22GB

初期導入時と同じdocker runコマンドを実行しても、 リポジトリからの取得はスキップされ、そのままbrokerコンテナが再起動されます。

[ec2-user@ip-172-29-2-12 ~]$ sudo docker run -d --name broker -p 1883:1883 -p 80:80   harbor.vcloud.nii.ac.jp/sinetstream/android-tutorial:latest
[sudo] password for ec2-user:
5f183700ea81ffe2118fe5117f306bd9897ac27d28d5dce124ad391993db7782