23
Dockerを活用したリクルートグループ開発基盤の構築 February 7, 2015 Naohiro Yoshida Recruit Technologies Co.,Ltd. ~基幹システム開発におけるDocker活用事例~

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

Embed Size (px)

Citation preview

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

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

February 7, 2015 !Naohiro Yoshida Recruit Technologies Co.,Ltd.

~基幹システム開発におけるDocker活用事例~

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

自己紹介

(def  me  {:name  "吉田  尚弘"                    :age  "33"                    :job  "アーキテクト"  

                 :company  {:name  "リクルートテクノロジーズ"                                        :joined-­‐at  "2014/03/01"}                    :favorite-­‐lang  ["Java"  "Clojure"  "Go"]})

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

本日の内容DockerとClojureを使って基幹システムの開発環境構築

リードタイムを99%削減した話  

×

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

リクルートの事業領域

+��

��������!��%���

����(��

������'%����� �'%�

���

*"�

�-�

#"�

&,��

�,��

���$)�

■ 就職や結婚、出産/育児といったライフイベント領域 ■ 旅行やグルメ、美容などのライフスタイル領域

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

リクルートポイントとは■ リクルートの各サイトで共通利用可能なIDとポイント ■ Pontaポイントとの相互交換も可能でリクルート外でも利用可能

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

リクルートポイントとは■ リクルートの展開するサイトの会員数千万人のID/PWD等の重要情報を管理 ■ グループ内の多くのサイトと連携

・・・

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

ミッションクリティカルなシステム

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

リクルートポイントの開発■ 基幹システムにも関わらず最低でも月に一回はリリース ■ サイト側のアプリ用の専用の環境を提供(40面以上)

内部環境 サイト向け開発環境 本番環境

2月リリース向け

1月リリース向け

3月リリース向け・・

・・

・・upgrade

upgrade

ここがカオス

・・・

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

何が課題なのか■ 専用の担当者が常時張り付き複数のチームが相互に連携し合っている ■ 環境をクリーニングしてアプリを入れ替えるのに10日程度のリードタイム

運用T

DBA

AP基盤T

開発T

war war war

war

10日後環境利用申請

WEB/APサーバ

バッチサーバ

DBサーバ

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

この問題を解決するシステムを作ることにした

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

環境自動発艦システムakagi■ 利用者が必要な情報を入力してLaunchボタン押すだけで環境提供

jobnet-­‐20141120.jarerd-­‐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%のコストを削減

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

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コンテナ複数 プロセス可 プロセスごとにコンテナを分割しコンテナ間で連携することも可

参考

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

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 buildDockerfile

例)centos7の場合のimage保存先(default)  /var/lib/docker/     -­‐  devicemapper/devicemapper/     -­‐  graph/${image_id}

image作成

docker run

container

コンテナ起動

アプリケーションエンジニアが開発作業としてコンテナを作成し 環境ごと構築することができる

参考

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

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"))  !;それぞれ出力  

(灬╹ω╹灬)      

(ಠ_ಠ)

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

UI

akagiのアプリケーションアーキテクチャ

Java 8Clojure 1.6ring-server

DB Agent

Java 8Clojure 1.6

core.async

Batch Agent

Java 8Clojure 1.6http-kitcore.async

Docker Agent

Java 8Clojure 1.6http-kitcore.async

■ 全面的にClojureで開発 ■ Web UIから環境構築に必要な命令をAgentに配信 ■ Agentは自分のタスクを終了すると次の処理を行うエージェントに命令送信

http

http

http

http http

http

http-kit

Web/App Batch

DB

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

!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

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

環境提供までの流れ (Docker部分)

UI Docker Agent

Repository

docker -d

Docker Registry

docker contaiiner

build/run

④Repositryからサイト別の設定情報を取得してDockerfileを自動生成する ベースイメージはアプリビルド時に作っておいたものを使用

②起動情報 ・アプリバージョン ・各種設定値

③空き環境を判別してDocker操作用のエージェントにメッセージ送信

⑤アプリ数分Dockerfileをビルドしてコンテナ起動

Dockerfile

利用者

docker contaiiner

docker contaiiner

①ベースとなるイメージは作成しておく

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

アプリ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

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

HOST

Data Only Container(Pattern)■ データのみを格納したコンテナで他のコンテナとデータ共有が可能 ■ サービス用コンテナと分割することで変更やバックアップが容易になる ■ Data Only Contianerが停止してもサービスには影響がない

FROM  busybox  VOLUME  /var/log/  CMD  /bin/sh

Data Volume Container

Containerdocker  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

参考

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

アプリ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

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

他の構成も検討したが■ 全部入りコンテナだと使い勝手はよいが再作成時の入れ替えなどが課題 ■ 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

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

!■ Dockerを活用して環境構築リードタイム99%削減 ■ 特定の人間に依存していた作業を撤廃し属人性排除 ■ コスト90%削減見込み !

まとめ

発見!■ 重厚なシステムにおいてはDockerだけでは解決が困難な箇所がある ■ Docker内とDocker外の資産(ERD/JOBなど)の整合性の担保 ■ Dockerコンテナの構成は運用を考慮して最適な設計を

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

×

最後に■ リクルートは様々なサービスを持っている会社です ■ リクルートはビジネスの会社でリクルートテクノロジーズは技術の会社 ■ 様々なサービスを経験したり新しい技術を適用してみたい方募集中です !