普段思ったことや、雑記。

Menu & Search

作り込まれたMeteorアプリのRocket.ChatをDockerでサクッと試す

2016年10月30日

Rocket.ChatはMeteorベースのマルチプラットフォーム・チャットアプリ

Rocket.Chatは、ざっくりいうとオープンソースのSlackクローンアプリケーションである。ここでは、MeteorとRocket.Chatの話をしたいので、Slackの実装の話は控えるが、Rocket.ChatはMeteorベースのアプリケーションである。

Meteorはざっくりいうと、フロントエンドもサーバサイドもJavaScriptでできているフルスタックフレームワークだ。Web開発でいうフルスタックフレームだと、Ruby on Railsが有名であるが、RailsとMeteorとで異なる点としては、MeteorはWebアプリケーションのみが作れるというわけではないことだ。Meteorは、iOS、Androidのモバイルアプリの作成にも対応している。また、Meteorはリアクティブプログラミングが設計思考の根本にある。何がリアクティブなのかという点では、実際のMeteorで実装されたサイトでの動作で視覚的に確認したほうが分かりやすいかと思うので、Meteorの公式パッケージ配布サイトのAtmosphereを参照する。Atmosphereを少しブラウジングすればリアクティブ動作がどういったものかが感覚的に分かると思う。要するに、画面表示に必要なデータのロードだったり、画面パーツの変更が同期的ではなく、ほとんど場合において非同期で実行されていくというものだ。

Meteorについての詳細は、本ブログ内の記事では、下記を参照して欲しい。

大注目のフルスタックフレームワーク「Meteor」を試してみた (1) – MMiyauchi Blog
http://mmiyauchi.com/?p=725

大注目のフルスタックフレームワーク「Meteor」を試してみた (2) – MMiyauchi Blog
http://mmiyauchi.com/?p=756

 

サクッとRocket.Chatを実行したいのでDockerを使用。もちろん、データは永続化して普通にそのまま運用できる状態で

さて、Meteorが少し面白いフレームワークのようだ、ということは少しくらいは伝わったことだろう。ここでは実際にDockerを使って作り込まれたMeteorアプリケーションである、Rocket.Chatを動かすことにする。もはや、Dockerが面倒だ!という人はRocket.Chat公式のデモ用にホスティングされているRocket.Chatを触ってみてほしい。自前でRocket.Chatをホスティングする本稿のチュートリアルよりは触れることのできる範囲に制限があるかもしれないが、雰囲気は伝わると思う。

 

Dockerについて

Dockerについては、根本的な部分までの説明を求められると辛い部分があるので、表層部のみ、概要程度になるが説明をする。Dokerは大前提として、Dockerコンテナと呼ばれる、Linuxアプリケーションが格納されている「イメージ」をDockerクライアント上で動作させることができる。Dockerは、Dockerコンテナと呼ばれるイメージをDockerクライアント上で走らせてアプリケーションを実行するものだということが理解できたと思うが、ポイントはこのDockerコンテナの中身である。コンテナには、なんらかのLinux OSイメージを必ず含まなければならない。よって、Dockerコンテナ内部は常にLinuxの実行環境がある状態であり、DockerコンテナのみでLinux OS+Linux アプリケーションという構成が必ずできることになる。このような、いわばアプリケーションが1つだけ入っているスタンドアロンのLinuxシステムをDocker上でつなぎ合わせることで、任意のアプリケーションを実行したり、構成を実現することができるというのがDockerの基本である(1コンテナ1アプリケーションというのが、Docker社の推奨構成である)。例えば、DockerでNginx+Apacheのリバースプロキシ構成をとろうとすると、NginxコンテナApacheコンテナの2つを組み合わせることになる。

 

Dockerのインストール、dockerコマンド実行

Dockerクライアントをまず、使用するマシンにインストールをする。ここでは、基本的には、Macのローカルマシンという条件を想定している。DockerクライアントのインストールはDocker公式サイトよりインストーラをダウンロードしておこなう。Docker公式サイトトップより、適切なプラットフォームのインストーラーをダウンロードし、インストールを実行する。インストール作業については割愛するが、英文であるが、ほとんど対話式で問題なく終了すると思う。

Dockerくのインストールが完了したら、dockerコマンドが発行できるかを確認する。下記のようなコマンドを実行し、Docker Versionが正常に表示されるかを確認する。

$ docker -v
Docker version 1.12.1, build 6f9534c

上記のようにDockerのバージョン情報が表示されたらインストール完了である。

 

たったの4コマンドでデータが永続化されたRocket.Chatアプリケーションを作成する

とりあえず、何も考えずに下記のようなコマンドを打つ(各コマンドの説明は後述)。下記のコマンドはローカルマシンでの実行、特にMacでの環境を想定している。4コマンド目の「–env ROOT_URL」オプションのIPアドレスだったり、ホストネームだったりは、リモートサーバの場合は適宜サーバを指すものに変更をする。

$ mkdir -p ~/Development/docker_volume/mongo_db
$ chmod -R 777 ~/Development/docker_volume/mongo_db
$ docker run --name db -v ~/Development/docker_volume/mongo_db:/data/db -d mongo:latest
$ docker run --name rocketchat -p 80:3000 --env ROOT_URL=http://0.0.0.0 --link db -d rocket.chat

念のため、自分の環境での実行ログを掲載しておく。

$ mkdir -p ~/Development/docker_volume/mongo_db
$ chmod -R 777 ~/Development/docker_volume/mongo_db
$ docker run --name db -v ~/Development/docker_volume/mongo_db:/data/db -d mongo:latest
Unable to find image 'mongo:latest' locally
latest: Pulling from library/mongo

43c265008fae: Pull complete
679a27ed88fa: Pull complete
480a2b7cac89: Pull complete
ab47cdcec495: Pull complete
9256de55cd57: Pull complete
ad5d4320ea8f: Pull complete
210ffc04e209: Pull complete
984cf767cb30: Pull complete
7b184e5ab3fa: Pull complete
Digest: sha256:61f688fbbca59038805d7dab094a6fe523beddb2a3ccffd119047a5d2d00511a
Status: Downloaded newer image for mongo:latest
4ba74dd6bfd81c1ac20cab2f6a9de4754511a1af35eca32476c0b044f3a89a17
$ docker run --name rocketchat -p 80:3000 --env ROOT_URL=http://0.0.0.0 --link db -d rocket.chat
Unable to find image 'rocket.chat:latest' locally
latest: Pulling from library/rocket.chat
43c265008fae: Already exists
af36d2c7a148: Pull complete
e1ee3d5412f7: Pull complete
85d7d74abfa1: Pull complete
2298887e5cf0: Pull complete
ec2bbd695376: Pull complete
a5a8d5ff85d8: Pull complete
Digest: sha256:60486a6fda50ccbd4491650b4cff6eeed5cfd923d757dddf8d9c9a80649e4337
Status: Downloaded newer image for rocket.chat:latest
5c75a5ed79a15a0f6b2a6f8901222b4404725d191ec86714b9ce01d6bdd67d77

 

あとは、ブラウザからhttp://0.0.0.0にアクセスすればOKである。下記のようなRocket.Chatの画面が出てくるはずだ。普段Slackを使っている人には、日本語表記で少し驚きがあるかもしれない。

rocket_chat

なお、マシンスペックよっては、4コマンド目を打ってから少し待たないとRocket.Chatアプリケーションコンテナが立ち上がりきっていないこともあるので(自分のマシンは非力だったので、少しラグがあった)、HTTPアクセスがうまくいってなさそうなら少し待ってからアクセスしてやると良い。

それでは、各コマンドの意味を説明する。

$ mkdir -p ~/Development/docker_volume/mongo_db

上記は、ユーザホームディレクトリ配下に「Development/docker_volume/mongo_db」という階層構造のディレクトリを一気に作成している。

$ chmod -R 777 ~/Development/docker_volume/mongo_db

1つ前のコマンドで作成したmongo_dbディレクトリのパーミッションを777に変更している(もしかしたら緩過ぎるかも。それから、これはMac, Windows環境向け)。

$ docker run --name db -v ~/Development/docker_volume/mongo_db:/
data/db -d mongo:latest

Docker Hubから、mongoという名称のイメージで、かつlatest(最新)というタグのイメージをローカルにダウンロードし、実行する。その際、このコンテナの名称はdbとし、dbコンテナのデータの保存場所は1,2コマンド目で設定したmongo_dbディレクトリとする。もし、mongo:latestのイメージがローカルにあれば、docker runはローカルの取得済みイメージを単に実行するだけである。

$ docker run --name rocketchat -p 80:3000 --env ROOT_URL=http://0.0.0.0 --link db -d rocket.chat

Docker Hubから、rocket.chatという名をローカルにダウンロードし、実行する。その際、このコンテナの名前はrocketchatする。rocketchatコンテナ内の3000番ポートを、ローカルマシンの80番ポートにフォワーディングする。アプリケーションのルートとなるURLを「http://0.0.0.0」とする。dbという名称のコンテナと接続する。もし、rocket.chatのイメージがローカルにあれば、docker runはローカルの取得済みイメージを単に実行するだけである。

 

Rocket.Chatは、Slackよりもところどころで優れていそう

Rocket.ChatはDocker環境で自分のために立ち上げて触ったことしかないので、全容やすべての仕様は知らないが、ざっと見Slackと比較した場合に、Rocket.Chatにも強みはありそう。具体的なSlackに対する強みは下記だ。

  • リアクティブ動作
  • 日本語(他言語?)対応
  • ビデオ通話に対応している
  • UIがリッチ

Slackは基本的にRocket.Chatほどシームレスな感じはせず、要所要所で明らかに同期的な動きでデータをロードしている感覚がある。Slackはリアクティブ動作を謳っているアプリケーションではないので当然だが、一度Rocket.Chatを触ってみるとRocket.Chatのが良いな、と単純に思えてしまった。あとはRocket.Chatは標準で日本語対応なのが嬉しい。Slackが英語表記なことに抵抗があり、他のチャットツールであるSkypeを併用する環境もあると思うが、Rocket.Chatであれば、日本語に対応している。おまけに、Slackが現状対応していないビデオ通話にまで対応している(2016年10月29日現在)。あとは、これは好みの問題にもなってくるかもしれないが、UIのパーツや挙動が、SlackよりもRocket.Chatのほうが優れたユーザ体験を演出していると感じた。このように、Rocket.ChatはSlackのクローンアプリとはいえ、本家を凌ぐような一面も見せている。

 

Rocket.Chatを触ってみて、Meteorを学習したくなった…

今回、このチュートリアルを書くにあたり、一番感じたのは、あらためてMeteorを学習したくなったということだ(本当はDockerの勉強のためにやっていた)。Meteorは現状RDBMSを使用するケースには向かないという認識だ(2016年10月29日現在)。だがその反面、リアクティブ動作により、優れたユーザビリティを提供できるという強みは、他フレームワークに対する大きなアドバンテージだと思う。もし、Meteorの標準データベースである、Mongo DBベースでアプリケーションの開発を考えているのであれば、Meteorの採用を検討するのも良いかもしれない。

 

チュートリアルが終わったら

チュートリアルが終わり、使わなくなったDockerコンテナは破棄する必要がある。Dockerコンテナの基本的なライフサイクルは、使用時以外は、基本的にはコンテナを破棄するというのが一般的となっている。下記のコマンドを実行し、使わなくなったdb, rocketchatコンテナを破棄する。

お急ぎの方はこちら。

$ docker rm -f `docker ps -aq`

それほど急ぎではない方はこちら。

$ docker stop rocketchat db
$ docker rm rocketchat db

docker stopコマンドは対象のDockerコンテナのプロセスを停止するコマンドである。docker rm コマンドは対象のDockerコンテナのプロセスを削除するコマンドである。

 

こちらもどうぞ

Article Tags
mmiyauchi

プログラムを書きながらTranceを聴くのが良いですね。みなさんも聴いたほうがいいですよ、Trance。EDMよりハードトランスでしょ。

Related article

Redux(react-redux)における適切な配列要素の更新

2021年8月23日…

CloudFlareの『SSL/TLS 暗号化モード(HTTPS通信設定)』を使用したとき、『ERR SSL VERSION OR CIPHER MISMATCH』のエラーでChromeで発生し、接続できない場合の対処

英語の記事は見当たっ…

Dart(Flutter)についての所見

Dart(Flutter)についての所見

第一印象では、クロス…

Discussion about this post

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

Type your search keyword, and press enter to search