こんにちは、EC事業部カラーミーショップグループのたかぴー(@takapi86)です。
カラーミーショップの開発環境を刷新し、すべてDockerに移行しました。 移行前と移行後の構成、Dockerに移行した理由、工夫したポイントなどをご紹介します。
これまでの開発環境
ECプラットフォームサービスであるカラーミーショップは、ショップページ、カートページ、ショップ管理者ページなど複数のロールで構成され、それぞれ言語やバージョンは異なったものとなっています。
カラーミーショップの中核を担うページはPHPで動作しており、その開発環境はこれまでVagrantが使用されておりました。 一部すでにDockerを使用しているロールもありましたが、Vagrant内のデータを参照するようになっているなど、Vagrant依存の構成となっておりました。
ロール | 言語・フレームワーク | 動作環境 |
---|---|---|
ショップ管理者ページ | PHP | Vagrant |
ショップページ | PHP | Vagrant |
ランディングページ | PHP | Vagrant |
カートページ(旧) | PHP | Vagrant |
API | Ruby | Docker(Vagrantのデータベースを参照) |
カートページ(新) | AngularJS | Docker(Vagrantのデータベースを参照) |
社内用顧客管理ページ | PHP | Docker(Vagrantのデータベースを参照) |
データベース | PHP | Vagrant |
メルマガページ | PHP | Docker |
なぜDockerへ移行しようと思ったのか
以下3点の理由により開発環境をすべてDockerへ移行することにしました。
これまでpuppetのメンテナンスをしていた開発メンバーがいなくなってしまった
これまでは、Vagrantで立ち上げたイメージに対してpuppetでプロビジョニングを行い環境構築を行ってきましたが、これまでpuppetをメンテナンスしていた開発メンバーが全員人事異動や転職などでチームから外れてしまいました。 残ったメンバーでpuppetを覚えていくか別に新しく開発環境を作るかといったときに、puppetに比べ開発環境を構築するレベルでは学習コストの低いDockerへ切り替えることにしたというのが1点目です。
バージョンを維持するのが難しくなってきた
1つのVagrantイメージ上に複数のPHPのロールが動作しており、すべて同じバージョン・設定が使われていました。これまでは、ほぼバージョン・設定が近いものになっていたため、ローカルのバージョンや設定はあまり気にせず開発ができておりましたが、PHPのバージョンアップなどを行うことによって、各ロールの構成が大きく乖離してきてしまいました。 その結果、これまでのVagrantでの構成では開発を継続するのが難しくなってきたというのが2点目です。
将来のクラウドネイティブ化に向けて
ペパボのサービスでは、開発環境含めたクラウドネイティブ化が進んでいます。
カラーミーショップもこの流れに乗っていこうと思っておりますが、既存のアプリケーションをコンテナ上で動かすためにはどういった構成にすべきかというのが見えていなかったので、最初のステップとして手元で既存のアプリケーションが動いているコンテナを検証できる環境が必要だと思ったのが3点目です。
これからの開発環境
Vagrant上で動作していたロールをすべてDockerで動作するように置き換えました。
意識して取り組んだポイントとしては以下です。
hub.docker.comに公開されている言語処理系の公式イメージをベースにする
プライベートな社内のDockerRegistryにDockerイメージを作成し、それを開発メンバーにダウンロードし使ってもらう方式が多く採用されておりますが、今回はhub.docker.comに公開されている言語処理系の公式イメージをベースにDockerfileで各自buildしてもらうようにしました。 これには次の理由があるためです。
- セキュリティの関係で社外のメンバーが社内のDocker Registryサーバへアクセスすることができないため
- 開発メンバーが検証用途など手元でDockerイメージの内容を柔軟に変更できるようにするため
Docker環境で使用するポートは1つ
以前のDocker環境から引き続き行っている方法ですが、各ロールへproxyするようなリバースプロキシのコンテナを起動させるようにし、名前ベースで各ロールにリクエストを振り分けるようにしました。 これによって、Docker環境で使用するポートは1つで良くなるため、ローカル環境のポート番号をいくつも管理をすることがなくなりました。
成果
- メンテナンスするファイルがpuppetマニフェストからDockerfile, docker-compose.ymlになったことで、現在の開発メンバーが、これまでより変更を加えやすくなりメンテンナス性が向上しました。
- Vagrant上で動作していたロールのPHPのバージョン・設定を分けることができるようになり、PHPのバージョンアップの検証作業が行いやすくなりました。
- 開発環境をDockerに移行していく中で、コンテナを最小構成で動かすための精査を行うことができました。また継続して精査を行いやすい環境になりました。
最後に
今回はこれまでVagrantで動作していた5ロール、既存のDocker環境のリプレイス2ロール、合計7ロールリプレイスを行いました。業務のスキマ時間で行なっていたものの、7ロール分作業を行うのは少々根気が必要でした。 Developer Experienceの改善と将来のクラウドネイティブ化に向けて、これからも環境の整備に努めていきたいと思います。