🐳

Docker コンテナイメージのビルド効率化を目指して 〜前編〜

2022/04/15に公開

こんにちは。エンジニアチームの山岸 (@yamagishihrd) です。

今回は、当社におけるプロダクト開発効率化のための取り組みの一つである「Docker コンテナイメージのビルド効率化」について、前編・後編に分けて解説させて頂きます。

目次

  1. SimpleCheck のアーキテクチャ概要
  2. Docker イメージビルドに対する課題感
  3. マルチフェーズビルド (MPB: Multi-Phase Build)
  4. マルチフェーズビルド自動化の要件【後編】
  5. AutoMPB の概要とアーキテクチャ【後編】

1. SimpleCheck のアーキテクチャ概要

『SimpleCheck』は当社のメインプロダクトです。プロダクトそのものに関する解説は別の機会に譲りますが、ここでは本記事の前提となる事項に絞って説明いたします。

SimpleCheck は Web ベースの SaaS アプリケーションとして、AWS 上に構築・デプロイされています。ユーザからのリクエストを受け取り、レスポンスを返すまでに様々な Lambda 関数を起動・実行しています。

SimpleCheck-Overview

Lambda 関数のパッケージタイプとして、「Zip 形式」または「コンテナイメージ」があります。前者は Zip 圧縮前のパッケージサイズが 250 MB までというクォータ上の制約があり、開発上の要件を満たしませんでした。そのため、SimpleCheck では後者の「コンテナイメージ」を採用しています。

コンテナイメージで Lambda 関数を開発する場合、それぞれの Docker イメージをビルドして ECR リポジトリ上にプッシュし、Lambda 関数からコンテナイメージ URL を指定することになります。

2. Docker イメージビルドに対する課題感

先に述べた通り、SimpleCheck は様々な Lambda 関数から構成されており、共通的な処理や必要となるライブラリも多数存在します。また、これらの関数は複数の開発者によって開発されており、開発者の数は今後さらに増加していく見込みです。

このような背景から、共通化できる・すべき所は共通化した上で、各開発者は関数ロジックの開発のみに注力させたいという想いがありました。これにより、開発生産性の向上や開発・運用ノウハウの属人化回避、ビルドプロセスの高速化など、様々なメリットを見込めます。

これを実現する上での課題として、例えば以下のようなものがありました。

  • ベースとして使用しているイメージが微妙に異なる
  • 各 Dockerfile の記述が揺れており、ローカルイメージキャッシュを有効活用できていない
  • 同じような処理を複数のファイルで記述している

Challenges

3. マルチフェーズビルド (MPB: Multi-Phase Build)

上記の課題を解決すべく、「マルチフェーズビルド (以下、"MPB")」という概念を適用しました。これは Docker イメージのビルドプロセスを複数のフェーズに分割し、各フェーズの中間イメージを生成して後続フェーズで利用することで、関数間共通のビルドプロセスを抽象化するものです。

MPB-Architecture

図に含まれる用語の定義について、以下に記します。

名称 英名 説明
ルートイメージ Root image コアイメージのベースとなる公開イメージ
コアイメージ Core image 基本的なコマンドや汎用ライブラリ、SimpleCheck コアモジュールなどを含むイメージ
特化イメージ Specialized image 特定用途で利用されるライブラリなどを含むイメージ
サービスイメージ Service image ハンドラスクリプト等、Lambda 関数実行に必要なファイルを含むイメージ

Lambda 関数の各開発者がビルドすべきイメージはサービスイメージということになり、その Dockerfile の FROM 句には適切な特化イメージを指定することになります。この特化イメージには基本的に開発に必要となるライブラリがすべて揃っており、開発者は関数ロジックの実装に注力できるようになりました。

また、ビルド自体に要する時間も大幅に圧縮されました。これは、ビルドの多く占めていたライブラリインストールなど共通的なプロセスが、ローカルイメージキャッシュを有効活用できるようになったことで不要になったためです。その他の工夫としては、マルチステージビルド の機能を利用することでイメージサイズの軽量化などを行っていますが、これについては機会があれば別の記事で扱いたいと思います。

まとめ

本記事では、SimpleCheck における開発効率向上のための取り組みの一つである「マルチフェーズビルド」についてご紹介しました。いかがでしたでしょうか。

似たような課題感をお持ちの方もいらっしゃるのではないかと思い、この度改めて概念的な整理をしてみました。読者の皆さんの参考になれば幸いです。後編の記事では MPB のビルド実行自動化について取り上げているので、ぜひ併せてご覧ください。

https://zenn.dev/simpleform/articles/20220418-01-automated-mpb

最後まで読んで頂き、ありがとうございました。

Discussion