冪等性まえふり久し振りに連絡を取り合った天文観測クラスタの先輩が講習会に講師で呼ばれるレベルになっていたのでfacebookを覗いたらラヴジョイ彗星というのを知ったy_yamadaです。Q2」が昨年末から今年年初にかけて現在手軽に観測できているようです。最近の発見にしては地球に最接近した時には等級4という比較的明るいので首都圏在住の方でも郊外へ出かければ肉眼で観測できるかもしれません。ところで、天体観測クラスタで話題なのは彗星ですがIT業界でここ最近話題といえば冪等性でしょう。何度試しても同じ結果が得られる冪等性はテストやデプロイの再現性にとても役立ちます。冪等性で注目が集まっているのがDockerです。視点の問題ですが厳密に言えば冪等ではないなどなど議論はあるようです。Dockerがどういうものか極論すると、XenやVirtualBoxのような仮想化された環境を提供するミドルウェアです。詳細な話として、Dockerはコンテナという単位で仮想化(のようなもの)を行います。XenやVirtualBoxのように仮想化の対象をハードウェア丸ごとエミュレートしてそこにOSをインストールする訳ではなくコンテナのプロセスを他のコンテナから排他、隠蔽します。ハードウェアをエミュレートする訳ではなく実際はただのプロセスだというこの特徴により他の仮想化/エミュレーターとは違って実行の無駄が無く軽く速く動作します。この仕組みはFreeBSDに昔からあるJailという仕組みによく似ています。DockerではUnionFS(AUFSなど)のファイルシステムを採用しており、これによって親ファイルシステムにレイヤーを提供して親のファイルシステムにあるファイルはそのまま利用できてなおかつ新規のファイル作成は親や他のコンテナからは独立して存在することができます。親の特定のディレクトリをマウントして通常通り上書きすることもできます。サービス構成という訳でDockerを使ってサービスを作ってみます。twitterでピーチクパーチクしゃべっているのをslackへさらにしゃべるということでピーチク(peachiku)としゃべる(speech)の語感が良かったのでpeachbotにしました。・内容twitterから特定のツイートを取得してslackへ投稿する。土台のサーバーはこうです。(Final)Dockerの準備Dockerを利用するために土台のサーバーに色々用意します。/etc/yum.repos.d/epel.repoDockerをインストールするDockerをインストールします。7.xではrpm名がdockerだった気がします。5行目でコンテナの起動、OSの名前&バージョンを表示しています。6行目で次の項目以降で必要なファイルを置く場所を作成しています。~/docker-filesDBコンテナ今回はPostgreSQLを提供する「DBコンテナ」、Rubyとその他を提供する「rubyコンテナ」を作ります。DBコンテナを作成します。Dockerのコンテナイメージをすべて自前で作成することもできますが今回提供するPostgreSQLは特殊な設定はないのでCentOSが提供している設定をgithubから取得して使っています。5~18行:twitterからどこまでのツイートを取得したのかの保存するためのテーブルを準備しています。19~21行:上記のSQLを実行する手順を追加しています。22~24行:コンテナイメージの作成、コンテナの実行、テーブルの作成を行っています。/create_table.shrubyコンテナ次はrubyコンテナイメージを作成します。細かく言うと以下の環境を構築しています。2.1系のインストール・rsyslogのインストール・crondのインストール・cronの登録ベースのコンテナイメージはtcnksmさんのものを利用させていただきました。ありがとうございます。ベースのイメージを取得rubyコンテナ用のDockerfileを書く前にベースのコンテナイメージを先に取得しておきます。コンテナイメージをビルドする時に自動で取得してはくれますが、サイズ/履歴の多いコンテナイメージは取得に時間がかかることが多いので先に取得しておきます。tcnksm/centos-ruby:2.1Dockerfile定義rubyコンテナ用の定義ファイルです。内容はコメントの通りで難しくないと思います。ある意味一番重要なのはsupervisordを使わずにベタで動かすところでしょうか。そのentrypoint.shについての項目でも記載しますがサービスの複数実行はそれでいいかなあと最近は思っています。Gemfile.lock_EOT_crontab.peachbotの中身10分ごとにツイートを取得します。最近のtwitterはAPI上限を超えるとすぐにAPI利用停止されるので、ごめんなさいメールを送るのが嫌な方は大人のマナーに従って抑え目に使いましょう。パスワードをベタに書くのは好ましくないですが今回は作り込む時間が無かったのでここはそのまま書いています。ruby.shと同じ方法でできるはずです。/home/peachbot/bin/err_EOT_実アプリ本体ツイートの取得、slackへの投稿を行う処理の本体です。今回はわれらがカリスマtwitter-erであるヤナティのツイートを取得して自分のチームのslackチャンネルへ投稿しています。これでヤナティのツイートをしっかり追えますね。ツイート取得、slack投稿自体は簡単な処理なので公式やもろもろのサイトのものと比較してご理解いただけると思います。注目点は取得したツイートの場所の取得、更新です。DBコンテナを使うのもこのためです。twitterでは検索APIも利用制限があります。同じ条件の検索を何度も行うと利用回数制限内であってもAPI利用が停止されてしまいます。取得したツイートのIDを保存し次回にその場所からの検索で利用しています。処理は67,86-87行目です。twi_crawler.rb')exit(0)entrypoint.shの中身Dockerfileの定義でも少し触れた内容を掘り下げます。Dockerではコンテナの起動時に1つのプロセスしか実行できません。プロセス1つのためにコンテナを複数用意するのはしんどいのでもろもろ詰め込んだコンテナを作成するのが多いと思います。いう要望のためにマルチプロセス起動のためにpythonアプリであるsupervisordがよく利用されていると思います。今回もsupervisordを利用する予定だったのですが、以下のブログを見つけてあまりにもお手軽だったのでこういう記載になりました。runで渡された変数を一般ユーザーでも使えるように/etc/profile.dに初期化スクリプトで保存しています。10done_EOT_ビルド長々と書いてきましたがやっとビルドです。.実行できあがったコンテナイメージから実行します。-eで環境変数でDB情報を渡しています。y_yamada/ruby:2.1あとがきざっくりとDockerでサービスを作りました。本番で使うためにはPostgreSQLのデータをDBコンテナに貯めずに外だしするためにVOLUMEで土台のサーバーのディレクトリをマウントするとか、cronが定期的にちゃんと動いているのか、twitter/slackのサービスが止まっている時にどうするかなどなど必要な処理があると思います。chefやansibleでサーバーを構成するのが実績もあって手堅いですが、Dockerのように動いた実績のあるものをそのまま持ち運べたり手軽にコピーできるのはDockerにしかない魅力です。自社サービスをオレオレサービス化や秘伝のタレ化させずに共有するところから始めると最初の一歩が踏み出せるかもしれません。Hacking!※アイキャッチ画像はDockerのサイトからお借りしました。17:00Tweet関連記事2015-03-06Cassandraクラスタを作成してみましたこんにちは、t_endoです。EC...2014-07-29MongoDBとHiveでごにょごにょ事始めこんにちは、s_mamedaifukuです。...2014-03-28MuninでELBのメトリクスをモニタリングするこんにちは、t_oookaです。その2こんにちは、ADN事業部のt_oookaです。こんにちは、k_oomoriです。Are青山のアドテク会社。アドネットワークやDSPを開発・運用。サーバを止めてみたよ。インターン:実業務体験編インターンでCTR予測をしましたSearchArchiveスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。