Dockerを活用したリクルートグループ開発基盤の構築
February 7, 2015 !Naohiro Yoshida Recruit Technologies Co.,Ltd.
~基幹システム開発におけるDocker活用事例~
自己紹介
(def me {:name "吉田 尚弘" :age "33" :job "アーキテクト"
:company {:name "リクルートテクノロジーズ" :joined-‐at "2014/03/01"} :favorite-‐lang ["Java" "Clojure" "Go"]})
本日の内容DockerとClojureを使って基幹システムの開発環境構築
リードタイムを99%削減した話
×
リクルートの事業領域
+��
��������!��%���
����(��
������'%����� �'%�
���
*"�
�-�
#"�
&,��
�,��
���$)�
■ 就職や結婚、出産/育児といったライフイベント領域 ■ 旅行やグルメ、美容などのライフスタイル領域
リクルートポイントとは■ リクルートの各サイトで共通利用可能なIDとポイント ■ Pontaポイントとの相互交換も可能でリクルート外でも利用可能
リクルートポイントとは■ リクルートの展開するサイトの会員数千万人のID/PWD等の重要情報を管理 ■ グループ内の多くのサイトと連携
・・・
ミッションクリティカルなシステム
リクルートポイントの開発■ 基幹システムにも関わらず最低でも月に一回はリリース ■ サイト側のアプリ用の専用の環境を提供(40面以上)
内部環境 サイト向け開発環境 本番環境
2月リリース向け
1月リリース向け
3月リリース向け・・
・・
・・upgrade
upgrade
ここがカオス
・・・
何が課題なのか■ 専用の担当者が常時張り付き複数のチームが相互に連携し合っている ■ 環境をクリーニングしてアプリを入れ替えるのに10日程度のリードタイム
運用T
DBA
AP基盤T
開発T
war war war
war
10日後環境利用申請
WEB/APサーバ
バッチサーバ
DBサーバ
この問題を解決するシステムを作ることにした
環境自動発艦システム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%のコストを削減
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コンテナ複数 プロセス可 プロセスごとにコンテナを分割しコンテナ間で連携することも可
参考
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
コンテナ起動
アプリケーションエンジニアが開発作業としてコンテナを作成し 環境ごと構築することができる
参考
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")) !;それぞれ出力
(灬╹ω╹灬)
(ಠ_ಠ)
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
!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
環境提供までの流れ (Docker部分)
UI Docker Agent
Repository
docker -d
Docker Registry
docker contaiiner
build/run
④Repositryからサイト別の設定情報を取得してDockerfileを自動生成する ベースイメージはアプリビルド時に作っておいたものを使用
②起動情報 ・アプリバージョン ・各種設定値
③空き環境を判別してDocker操作用のエージェントにメッセージ送信
⑤アプリ数分Dockerfileをビルドしてコンテナ起動
Dockerfile
利用者
docker contaiiner
docker contaiiner
①ベースとなるイメージは作成しておく
アプリ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
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
参考
アプリ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
他の構成も検討したが■ 全部入りコンテナだと使い勝手はよいが再作成時の入れ替えなどが課題 ■ 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
!■ Dockerを活用して環境構築リードタイム99%削減 ■ 特定の人間に依存していた作業を撤廃し属人性排除 ■ コスト90%削減見込み !
まとめ
発見!■ 重厚なシステムにおいてはDockerだけでは解決が困難な箇所がある ■ Docker内とDocker外の資産(ERD/JOBなど)の整合性の担保 ■ Dockerコンテナの構成は運用を考慮して最適な設計を
×
最後に■ リクルートは様々なサービスを持っている会社です ■ リクルートはビジネスの会社でリクルートテクノロジーズは技術の会社 ■ 様々なサービスを経験したり新しい技術を適用してみたい方募集中です !