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

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のバージョン情報が表示されたらインストール完了である。

 

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

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

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

 

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

rocket_chat

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

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

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

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

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

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 stopコマンドは対象のDockerコンテナのプロセスを停止するコマンドである。docker rm コマンドは対象のDockerコンテナのプロセスを削除するコマンドである。

 

こちらもどうぞ

Article Tags
mmiyauchi

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

Related article

Meteorのブームが来るか来ないと言われれば、来ないと思ってしまった件

2016年秋頃から、…

Meteorアプリケーション(Blaze)の運用をしてみてハマったこと

※前提…Meteor…

DockerでJavaScriptシェル(Node.js実行環境)をつくる

JavaScript…

Discussion about this post

コメントを残す

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

Type your search keyword, and press enter to search