チュートリアル - 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 AWSのEC2とはインターネット経由で接続します。
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導入方法を示します。
- macOS
- Microsoft Windows 10
- CentOS(x86_64)
その他の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