コンテナを活用した「クリーンな」アプリケーション開発環境の構築

2024年1月26日(金)
石本 達也
第11回の今回は、アプリケーション開発の実行環境における、コンテナを活用した環境構築について解説します。

はじめに

開発サイクルを回していく中で中心的な役割を果たすのは「実行環境」です。実行環境はコーディングしたプログラムを実行するための環境ですが、実行環境の構築方法にはいくつか方法があります。中でもローカルマシン上に直接構築する方法には手軽な反面、ローカル環境が汚れやすい状態になりやすいです。

ローカル環境が汚れやすい状態とは、消し忘れた不要な設定や他プログラミング言語のツール、ライブラリなどが悪影響を与えてしまうことです。よく「ローカル環境を汚さない開発環境」という表現を聞いたことがあるのではないでしょうか。まさに、あれこれ試行錯誤を繰り返した結果、散らかった部屋のようになっている状態です。散らかった部屋を元の綺麗な状態に戻すのはとても大変な労力が必要になります。

そのような中で、最近では仮想化技術を活用した開発環境の構築が注目されています。仮想化技術を活用することでローカル環境と隔離された場所に構築できるため、必要に応じて簡単に環境を破棄して元の綺麗な状態に戻すことができます。また、依存関係ファイルやキャッシュファイルなどの一時的なファイルが残ってしまうことを心配する必要もなくなります。そのような開発環境のことを「クリーンな開発環境」と呼んでいます。

今回は、クリーンな開発環境を目指した実行環境の構築について学びましょう。

アプリケーションの実行環境

クリーンな開発環境について学ぶ前に、まずは実行環境の選択肢についておさらいします。

実行環境の種類と違い

実行環境を構築するための方法にはいくつかあり、最近では多様な選択肢が用意されています。ここでは、主な実行環境を紹介します。

・ローカルマシン
実行環境の定番と言えば、ローカルマシン上に直接インストールする方法です。これは、クラウドサービスや仮想化技術が普及する前から使われていた構築方法の1つです。セットアップは簡単ですが、開発環境とアプリケーションの実行環境の差異(例えばOSやバージョン、ライブラリー構成の違い)などで動作しないという懸念があります。また、最近では開発端末に使用するOSはMacやWindowsだけでなくLinuxを使用する人も増えてきています。そのため、自分が使用しているOSと異なる端末で開発しているメンバーをサポートできるとは限りません。使用するOSによっては、実行環境の構築に時間を要する場合もあります。

システムやサービスを開発するには、ある程度のマシンスペックが求められます。参加するプロジェクトの方針や考え方によって、どのような端末が支給されるかは異なります。しかし、開発に使用するマシンスペックが不足していると、アプリケーションを動かすことができなかったり、1つ1つの処理が遅くなり、開発者の待機時間が増えてしまうことにつながります。さらに、そのような問題が発覚しても、ハードウェア端末は容易に交換できない場合がほとんどです。

開発者それぞれがローカルマシン上に実行環境を構築することで、設定方法や構築テクニックなどが属人化してしまうことになります。そのため、構築時に詰まったポイントやノウハウの共有が難しく、新しく参加したメンバーが毎回同じところに時間と労力をかけることになり、組織全体として非効率的になってしまいます。

・仮想化技術
仮想化技術を用いることで、実際に近い環境でアプリケーションを動かすことができます。例えばWindows上でCentOSやUbuntuのOS上で動かすアプリケーション開発したい場合は、ローカルの開発環境にVirtualBoxのようなソフトウェアを導入して仮想マシンを構築し、そこにCentOSやUbuntuのOSとアプリケーションの実行環境を作ることで実現できます。その他にも、VMware vSphereやOpenStackのようなプライベートクラウド上で環境を作ってテストしたり、後述のクラウドサービスを用いた方法もあります。

仮想化技術を使えば、同時にCentOSとUbuntuの環境を立てて作業できます。ローカルマシン上でアプリケーションを実行している時とほとんど変わらないため、学習コストは他の方法と比べると小さいです。一方で、仮想化技術をアプリケーション開発の実行環境に使うためには、OSやライブラリー、プログラミング言語を用意する必要があります。環境構築にAnsibleのような自動化ツールで効率化しても、コンテナ技術に比べると手間がかかるというデメリットがあります。

・コンテナ技術
本番環境やステージ環境、検証環境のように同じような構成の環境を統一的に管理するためにDockerなどのコンテナ技術を採用するケースが多くなってきており、最近では開発環境への導入も増えています。コンテナ技術を用いることで開発環境の構築をコード化できるため、構築に関わる方法や設定を共有しやすくなります。複数人での開発もコード化したソースを元に環境をセットアップするだけになるので、開発環境の差異による数々の問題が発生しにくくなり、開発を加速できます。

コード化されたファイルは、Gitなどのバージョン管理ツールを用いることで開発環境の変更を正確に把握できるようになります。他にも開発環境からコンテナ技術を用いることで、本番リリース時の単純な操作ミスや実行忘れなどのヒューマンエラーを防ぐことにも役立ちます。

また、コンテナ技術は開発しているアプリケーションのバージョンアップのテストや新しいツール・ライブラリーの導入を検証したいときにもメリットがあります。ローカルマシン上に構築した環境でアプリケーションのバージョンアップに向けた検証をするには、ローカルマシンの環境を変更する必要があります。アプリケーションのバージョンアップに伴って、使用するプログラミング言語のバージョン、依存するライブラリーのバージョンが変わってくる場合があるためです。複数のバージョンの実行環境を1つのローカルマシン上で維持するのは難しいといった理由もあり、コンテナの利用が一般化しつつあります。必要なときに必要な開発用コンテナを実行し、検証が終了したらコンテナを削除するだけで元の環境に戻すことができます。複数のバージョンの開発言語環境も実行可能なので、アプリケーション実行環境のバージョンアップのテストがしやすくなります。

・クラウドサービス
クラウドサービスを利用することで、クラウド上に開発環境を構築できます。開発者のローカルマシンのスペックに依存することなく、必要なスペックを割り当てることができます。実行環境の共有もしやすくなります。また、クラウドサービスにはTerraformやAWS独自のCDK、CloudFormationなどがあり、複雑な環境でも簡単に同じような環境が構築できるため、新しく参加したメンバー用の構築の準備する手間を減らすことができます。

クリーンな開発環境とは

クリーンな開発環境とは、ローカルマシン上に直接環境を構築せずに、クラウドサービスや仮想化技術を用いた再現性の高い環境のことです。同じ環境に複数のプログラミング言語やツールをインストールすることで競合などが発生することがあります。また、過去の環境設定に振り回されたりして余計な時間を費やしてしまうことにもなりかねません。そのようなことを防ぐために、クリーンな開発環境を構築することが重要なのです。

クリーンな開発環境を構築するには、ローカルマシン上に環境を構築するのではなく、仮想化技術やクラウドサービスを利用して構築することが重要です。お財布との相談にはなりますが、1番環境の柔軟性が高いのはクラウドサービスの活用です。しかし、毎日継続的に環境を使用することを考えると、コスト的にはかなり悩ましいところです。そこで、ローカルマシン上に仮想化技術を利用して開発環境を構築する方法がおすすめです。最近ではVisual Studio CodeがDockerコンテナを活用した開発環境をサポートしています。Dockerコンテナ上で開発環境を構築するためには、Dev Containersという拡張機能をインストールする必要があります。

コンテナ技術を活用することで、例えば、フロントエンドとバックエンドのそれぞれで使用するツールを別々のコンテナで実行できるようになります。また、メジャーバージョンアップに向けた影響調査や改修を進めていく際に、新しく専用のコンテナを立ち上げることで通常開発に影響を与えることなく並行して進めることもができます。

クリーンな開発環境を手に入れるにはツールや仕組みがまだ発展途上であるため、本格的に導入するには物足りない部分もありますが、今後の発展に期待したいところです。

開発環境におけるコンテナ

ここまでに何度か出てきたコンテナについて、開発環境における活用を考えていきましょう。開発環境におけるコンテナ活用には、大きく2つの方法があると考えています。1つ目は「アプリケーションの実行環境」です。開発環境からコンテナ技術を用いて構築することで、本番環境との差異をなくすことができます。そのため、開発環境では動いていたのに本番環境では動かないということを防ぐことができます。それ以外のメリットについては前述したので省略します。

2つ目は「ツールの実行環境」です。コンテナには、常時立ち上げ続けるような使い方と、必要な処理が終わったら、その都度破棄するような使い方があります。例えば、フロントエンドとバックエンド分離型で、バックエンドとの通信にはRESTを使った開発をしているとします。フロントエンド側ではバックエンドと通信するためのAPIクライアントを生成する必要があります。その際にバックエンド側で公開しているOpenAPIの定義ファイルなどを用いて自動生成することがありますが、その際に使用するジェネレートツールを実行するためにコンテナを使うこともあります。このようにすることで、ローカル環境を汚さずにツールを実行できます。

主なコンテナ実行ツール

コンテナを実行するためのデスクトップツールには様々ありますが、その中から主なツールを紹介します。

・Docker Desktop
コンテナ技術の中で最もよく知られているものがDockerです。Dockerを操作しやすくるためのグラフィカルインターフェースとしてDocker Desktopがありますが、2021年9月から一部ユーザーを対象に有料化されました。そのため、所属する団体や組織規模によっては、有料化に伴い他のツールに移行するかどうかが一時期話題にもなりました。これから導入を検討される際には、有料プランの契約対象になるか事前に確認しておきましょう。もし、有料プランに該当しない場合には、基本的にDocker Desktopを利用することを筆者はおすすめします。利用者と書籍やインターネット上から得られる情報量が多いため、問題が発生した際の解決策に関する情報を得やすいです。

【︎Docker Desktop】
https://www.docker.com/products/docker-desktop/

・Rancher Desktop
Rancher Desktopは、Docker Desktop有料化の話が出た際に代替ツール候補として弊社のテックブログなどで紹介したものの1つです。全く同じ機能とまではいきませんが、基本的な機能はDocker Desktopと同じです。そのため、Docker Desktopからの移行先としての最有力候補に名前が挙がっていました。

【︎Rancher Desktop】
https://rancherdesktop.io/

なお、上記の2つ以外にも様々なツールがありますが、詳しくは弊社テックブログでも紹介していますので、ぜひそちらを参考にしてください。

【︎Docker Desktopと代替ソフトウェア大集合】
https://devops-blog.virtualtech.jp/entry/20230104/1672800265

おわりに

今回は、あまり聞きなれない言葉だと思われる「クリーンな開発環境」について学びました。仮想化技術を活用して開発環境を構築することで、環境の取り扱いがしやすくなったように感じるのではないでしょうか。また、仮想化技術を活用するとインフラ構築に関わる手順が自動でコード化され、Gitによるバージョン管理もできるようになります。

散らかったローカル環境を綺麗にして、いつでもスタートラインに戻れる安心感は、これから開発環境をより良くしていくために挑戦するハードルを下げてくれます。今回の記事をきっかけに、クリーンな開発環境の構築を始めてみませんか。

日本仮想化技術株式会社
Sierやベンチャー企業を経て、現在は日本仮想化技術でDevOps支援サービス「かんたんDevOps」のDev側を担当。「DevOpsを通じて開発者体験を最大化する」をミッションに理想的な開発環境の実現を目指して技術調査や仕組み作りを行っている。

連載バックナンバー

設計/手法/テスト技術解説
第25回

AWSの監視サービス「CloudWatch」でサーバー監視を試してみよう

2024/8/9
本連載も今回で最終回となります。今回は、AWSの監視サービス「CloudWatch」を使って、簡単なサーバー監視を試してみましょう。
設計/手法/テスト技術解説
第24回

CI環境を構築して「ESLint」で静的解析を実行してみよう

2024/7/26
実践編第8回の今回は、「Dev Containers」でCI環境を構築し、静的解析ツール「ESLint」で静的解析を実行するまでの流れを解説します。
設計/手法/テスト技術解説
第23回

テストコードを書いて「GitHub Actions」でCIを実行してみよう

2024/7/12
実践編第7回の今回は、Webフロントエンド開発を例に、テストコードを書いて「GitHub Actions」でCIを実行するまでの流れを解説します。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています