Successfully reported this slideshow.
Your SlideShare is downloading. ×

Dockerを活用したリクルートグループ開発基盤の構築

More Related Content

Viewers also liked

More from Recruit Technologies

Related Books

Free with a 30 day trial from Scribd

See all

Dockerを活用したリクルートグループ開発基盤の構築

  1. 1. Dockerを活用したリクルートグループ開発基盤の構築 February 7, 2015 ! Naohiro Yoshida Recruit Technologies Co.,Ltd. ∼基幹システム開発におけるDocker活用事例∼
  2. 2. 自己紹介 (def  me  {:name  "吉田  尚弘"                    :age  "33"                    :job  "アーキテクト"                    :company  {:name  "リクルートテクノロジーズ"                                        :joined-­‐at  "2014/03/01"}                    :favorite-­‐lang  ["Java"  "Clojure"  "Go"]})
  3. 3. 本日の内容 DockerとClojureを使って基幹システムの開発環境構築
 リードタイムを99%削減した話  
  4. 4. リクルートの事業領域 ■ 就職や結婚、出産/育児といったライフイベント領域 ■ 旅行やグルメ、美容などのライフスタイル領域
  5. 5. リクルートポイントとは ■ リクルートの各サイトで共通利用可能なIDとポイント ■ Pontaポイントとの相互交換も可能でリクルート外でも利用可能
  6. 6. リクルートポイントとは ■ リクルートの展開するサイトの会員数千万人のID/PWD等の重要情報を管理 ■ グループ内の多くのサイトと連携 ・・・
  7. 7. ミッションクリティカルなシステム
  8. 8. リクルートポイントの開発 ■ 基幹システムにも関わらず最低でも月に一回はリリース ■ サイト側のアプリ用の専用の環境を提供(40面以上) 内部環境 サイト向け開発環境 本番環境 2月リリース向け 1月リリース向け 3月リリース向け ・・ ・・ ・・ upgrade upgrade ここがカオス ・・・
  9. 9. 何が課題なのか ■ 専用の担当者が常時張り付き複数のチームが相互に連携し合っている ■ 環境をクリーニングしてアプリを入れ替えるのに10日程度のリードタイム 運用T DBA AP基盤T 開発T war war war war 10日後環境利用申請 WEB/APサーバ バッチサーバ DBサーバ
  10. 10. この問題を解決するシステムを作ることにした
  11. 11. 環境自動発艦システムakagi ■ 利用者が必要な情報を入力してLaunchボタン押すだけで環境提供 jobnet-­‐20141120.jar erd-­‐20141120.jar REPOSITORY    TAG                  IMAGE  ID                         app-­‐a              20141120        8534598b6795           app-­‐b              20141120        08f230efe1f0 exp UI Docker Agent Job Agent DB Agent コンテナ群 コンテナ 1 コンテナ 2 コンテナ ビルド時 利用者 環境利用時 開発者 SCM 10日かかっていた環境提供を10分程度まで短縮 構築にかかっていた人手を排除し90%のコストを削減
  12. 12. container container container container docker daemon Dockerとは ■ Linuxのコンテナ技術を利用して、隔離空間(コンテナ)を作成してプロセスを実行 ■ ファイルシステム/ネットワークなどはコンテナごとに独立している ■ ハイパーバイザと異なり、ゲストOSを起動するわけではないため高速に起動可能 環境をコンテナごと全て入れ替えたり 同じ設定の環境を複数高速に起動したり削除したりするのに向く OS 172.20.10.1 172.20.10.2 172.20.10.3 172.20.10.4 1コンテナ複数 プロセス可 プロセスごとにコンテナを分割しコンテナ間で連携することも可 参考
  13. 13. container container Dockerとは ■ Dockerfileを作成してコンテナのイメージを作成 ■ 作成したイメージはDockerがインストールされていれば動作可能 ■ インフラの専門的な知識がないアプリケーションエンジニアでも記述可 FROM  centos65   ! #  Java  8   RUN  yum  install  -­‐y  wget  unzip  curl   ADD  download.sh  download.sh   RUN  sh  download.sh   RUN  rpm  -­‐ivh  jdk-­‐8u20-­‐linux-­‐x64.rpm   RUN  export  JAVA_HOME=/usr/java/jdk1.8.0_20       #  Tocmat  7   ENV  CATALINA_HOME  /usr/local/tomcat   ENV  PATH  $CATALINA_HOME/bin:$PATH   RUN  mkdir  -­‐p  "$CATALINA_HOME"   WORKDIR  $CATALINA_HOME   ADD  tomcat  /usr/local/tomcat   ADD  start.sh  /usr/bin/start.sh       EXPOSE  8080   CMD  sh  /usr/bin/start.sh docker -d docker build Dockerfile 例)centos7の場合のimage保存先(default)   /var/lib/docker/     -­‐  devicemapper/devicemapper/     -­‐  graph/${image_id} image作成 docker run container コンテナ起動 アプリケーションエンジニアが開発作業としてコンテナを作成し 環境ごと構築することができる 参考
  14. 14. Clojureとは ■ Lich Hickyが開発したJVMで動作するLisp方言の関数型言語 ■ 動的型付け/Immutable 参考 ;指定した名字の最大年齢算出する関数   (defn  get-­‐max-­‐age      [name]      (-­‐>>   (repeatedly  100  new-­‐person)       ;Personを100個生成                 (filter  #(=  (:name  %)  name))       ;名字でフィルター           (map  #(:age  %))                             ;age属性のみ取得                 (apply  max)))                                     ;最大値取得   ! ;指定した名字に対応して部分適用   (def  灬╹ω╹灬  (partial  get-­‐max-­‐age  "sato"))   (def  ಠ_ಠ    (partial  get-­‐max-­‐age  "tanaka"))   ! ;それぞれ出力   (灬╹ω╹灬)       (ಠ_ಠ)
  15. 15. UI akagiのアプリケーションアーキテクチャ Java 8 Clojure 1.6 ring-server DB Agent Java 8 Clojure 1.6 core.async Batch Agent Java 8 Clojure 1.6 http-kit core.async Docker Agent Java 8 Clojure 1.6 http-kit core.async ■ 全面的にClojureで開発 ■ Web UIから環境構築に必要な命令をAgentに配信 ■ Agentは自分のタスクを終了すると次の処理を行うエージェントに命令送信 http http http http http http http-kit Web/App Batch DB
  16. 16. ! Container ! Container 全てをDockerにしないのか? ■ DBサーバはOracle EE RACが必要で大量環境のコンテナに向いていないと判断 ■ 加えてJP1はそもそも導入予定のOSに対応していないなどがネック ! Data Volume Container REDO CTRLSPFILE DATA INSTANCE ASM LISTENER INSTANCE ASM Node #1 Node #2 ・数GBのメモリ 環境数 ・インスタンス起動時間 JDBC LISTENER Oracle EE RAC JP1 JP1 Manager / Agentともに ホストOSがベンダー保証対象外 container Application Cent OS 6.5 Cent OS 7 HostのKernelが叩かれるのでリスクはある ※DockerのホストOSはKernel 3.8以上が推奨 #  uname  -­‐r   3.10.0-­‐123.6.3.el7.x86_64
  17. 17. 環境提供までの流れ (Docker部分) UI Docker Agent Repository docker -d Docker Registry docker contaiiner build/run ④Repositryからサイト別の設定情報を 取得してDockerfileを自動生成する ベースイメージはアプリビルド時に作っ ておいたものを使用 ②起動情報 ・アプリバージョン ・各種設定値 ③空き環境を判別してDocker操作用の エージェントにメッセージ送信 ⑤アプリ数分Dockerfileをビルドしてコンテナ起動 Dockerfile 利用者 docker contaiiner docker contaiiner ①ベースとなるイメージは作成しておく
  18. 18. アプリ1 Module Container Web/App Container App Server Web Server 今回のDockerコンテナの構成 ■ コンテナを役割ごとに複数に分割 ■ サービスを起動するコンテナとモジュール/ログ/設定を配備するコンテナを分割 ■ Web / Appは同一のコンテナ ■ モジュール、ログ、設定用コンテナはData Only Container Config Container Log Container volumes from 1環境あたりのコンテナセット アプリ2 Module Container Web/App Container App Server Web Server アプリN Module Container Web/App Container App Server Web Server
  19. 19. HOST Data Only Container(Pattern) ■ データのみを格納したコンテナで他のコンテナとデータ共有が可能 ■ サービス用コンテナと分割することで変更やバックアップが容易になる ■ Data Only Contianerが停止してもサービスには影響がない FROM  busybox   VOLUME  /var/log/   CMD  /bin/sh Data Volume Container Container docker  run  -­‐-­‐volumes-­‐from  data  service /var/lib/docker/vfs/dir/${volume-­‐id}   -­‐rw-­‐r-­‐-­‐r-­‐-­‐  1  root  root  4444    2月    1  23:34  catalina.log docker  build  -­‐t  log   docker  run  -­‐-­‐name  data  log Dockerfile 参考
  20. 20. アプリ1 アプリ2 この構成のメリット Web / App Container Module Container Config Container Log Container ミドルウェア
 パッチ当て ログ確認 緊急設定変更 ■ 変更頻度の異なるコンテナを別々にすることでコンテナ変更時の影響を局所化 ■ 関心のあるコンテナのみを操作すればよい 凡例 docker build / docker run docker attach / docker exec Web / App Container Module Container アプリ1のみ起動 App engineer アプリ バージョンアップ 設定変更 Infra engineer akagi
  21. 21. 他の構成も検討したが ■ 全部入りコンテナだと使い勝手はよいが再作成時の入れ替えなどが課題 ■ 1プロセス1コンテナだとコンテナ数が無駄に増えすぎる Container Web Server (アプリ1) App Server Web Server (アプリ2) App Server SSHD Monit 1環境1コンテナ 1プロセス1コンテナ アプリ1 Module Container App Server Container Config Container Web Server Container ○ 環境単位の移動は容易ではある △ 部分的な更新時の再作成 △ アプリ単位の提供が困難 ○ 原則の構成ではある △ 数が多いためコンテナが複雑になる Log Container link アプリ2 Module Container App Server Container Config Container Web Server Container Log Container link
  22. 22. ! ■ Dockerを活用して環境構築リードタイム99%削減 ■ 特定の人間に依存していた作業を撤廃し属人性排除 ■ コスト90%削減見込み ! まとめ 発見 ! ■ 重厚なシステムにおいてはDockerだけでは解決が困難な箇所がある ■ Docker内とDocker外の資産(ERD/JOBなど)の整合性の担保 ■ Dockerコンテナの構成は運用を考慮して最適な設計を
  23. 23. 最後に ■ リクルートは様々なサービスを持っている会社です ■ リクルートはビジネスの会社でリクルートテクノロジーズは技術の会社 ■ 様々なサービスを経験したり新しい技術を適用してみたい方募集中です !

×