Edited at

開発環境から始めるdocker環境の浸透

dockerによるCIと、コンテナクラスタリング構築の記録を残していきます。

スマートフォンベースのECサイトのプロジェクトへ配属になりました。

プロジェクトはオーソドックスなLAMP構成+jQueryによるインタラクションが付与されたものですが、中〜大規模のPVを持っており、決済機能も存在する事から

品質管理やリリース手順などは整備されていました。

ライフサイクルとしては成熟期を過ぎた印象があり、プロダクトとしては一定の完成度に達していたので

バックエンドより、ユーザが直接関わるUI部分の改修に比重が置かれ

インフラ部分については、現状動いているのだから、コストを掛けて改修するほど優先度は高くない、といった状況でした。

そんな中で、合間を見てdocker環境を構築し、現場に浸透させて行った記録です。

docker環境の構築の助けになれば幸いです。

(記録になるので、ベストプラクティスから外れている部分も多いかと思いますが、ご容赦下さい)


当時の開発環境

dev.jpg

開発環境は、VirtualBox(Vagrant)でCentOSベースのイメージを一つ起動し

一つのOSの内に

・サービス内で展開している、三種類の2層webアプリケーション(VirtuaHostによる統合)

・上記3アプリケーションから参照するmysql

・DB負荷軽減の為のRedisサーバ

が同居しています。

その他、CDNとしてAWS S3を採用している為、擬似S3となるminoサーバを

ホストマシン上で起動しています。

ホストマシン上のGitHubのリポジトリを、Vagrantのイメージにマウントし、エディタで開発を行なっていました。


開発環境の問題点

前述の通りインフラ構築は逆風の雰囲気でしたが

開発チームからは、開発環境の問題の指摘が挙げられていました。


1.Virtualboxの起動速度

Virtualboxは、仮想環境内でOSを起動する為起動にリソースを消費しますが

dockerはホストOSの機能を共有して、docker仮想環境内で

アプリケーションが格納されたコンテナを起動する為、

「OSを起動する」部分のオーバーヘッドが無く、起動が高速になります。

docker導入のメリットとして訴求しました。


2.サービス環境と開発環境で、構成が異なり、健全ではない

■開発環境は、3つの2層webアプリケーションを1つのEC2インスタンスに集約していましたが

商用環境は、AWS EC2を3台に分け(別途、multi-AZも実施している)

それぞれのアプリケーションを分けて配置していました。

■開発環境はCentOS6(何故かOSのメッセージ全般がドイツ語)でしたが、

商用はAmazonLinuxでした。

dockerでコンテナ毎にサーバを構築する事で、商用と同じ3サーバ構成にする事で、解決を試みました。

OS差分の問題は、AmazonLinuxのDockerイメージを使うことも考えましたが

開発陣からの、「商用と同じ環境」をより納得させる為に、

商用で稼働しているAmazonLinuxを、Dockerイメージとして使うことで、心理的安全性を担保する事にしました。

将来的にAWS ECSによる、コンテナクラスタのデプロイを想定し

その際は、alpineで再構築する予定だったので、この対応は繋ぎという形でした。

(正直、そのままalpineで構築しておけばよかった)


3.Githubリポジトリが2つ存在し、連携しにくい

配属以前は、SASS/JS/HTMLが別リポジトリで管理されていました。

フロントのリポジトリで、gulpを使用したhtml+SASS+JSのモックを作成し

バックエンドのリポジトリに(ZIPか何かで)移植、viewファイルへ反映を行なっていましたが

・2つのリポジトリとのバージョン整合が大変

・移植コストが大きい。大規模なフロントエンド開発がもう無さそう

という事を考慮し、リポジトリをバックエンドに統合する事にしました。

統合により

・バックエンドのJSやSASSの変更をgulpで検知しコンパイル、ブラウザに即時(又はリロード)で反映

・PHPソースとJS/CSSが正しくバージョン管理されているので、将来的には継続的デプロイとして、GitHubへのPUSH時、JS・SASSを自動でコンパイルし、dockerimageの自動デプロイと、JSやCSS,画像ファイルのS3への自動反映

(AWS codebuildを想定)

が可能だと見積りました。


プロトタイプ作成

プロトタイプを見せる事が説得力に繋がると感じたので、業務の合間にdockerの構築を進めていくことになりました。