このブログ記事では、Dockerを始めるために必要な基本的な概念を紹介します。

このDevOpsシリーズをフォローしてきた方は、Dockerと呼ばれる不思議なツールを使用してUbuntuの環境をセットアップしたはずです。 実は、Dockerは世界で最も重要で広く使用されている開発者ツールの1つであり、それが何であり、どのように使用するかを知ることは、 事実上すべての人にとって不可欠です。前回の記事で取り上げたGitHub actionsでさえ、ワークフローを実行するためにDockerを使用しています。 そこでこの短い記事シリーズは、Dockerを明確な方法で紹介し、基本的な使い方を習得することを目的とします。
Dockerとは何か?
具体的な内容に入る前に、Dockerとは何か、そして現代の開発とデプロイメントにおいてDockerが不可欠である理由について説明します。 過去には、アプリケーション間のリソース分離を確保するために、1サーバーにつき1アプリを使用するアプローチを採用していました。 アプリが複雑化するにつれて、 垂直スケーリング を通じてメモリを増やしCPUを強化することでサーバーをアップグレードし、容量制限に達すると、 ロードバランサーを使用する 水平スケーリング に切り替えていました。しかし、この戦略はしばしばリソースの低利用とサーバースペースの非効率的な使用をもたらしました。

これらの制限に対処するため、1台のサーバー上で異なるオペレーティングシステム、 仮想マシン をエミュレートするハードウェアの仮想化を検討しました。 これにより、各アプリケーションに対して独立した環境を作成します。このアプローチは、シミュレートされたオペレーティングシステム間のリソース割り当てを管理する ハイパーバイザー を活用します。 異なるオペレーティングシステムを実行できるため、クロスプラットフォーム互換ソフトウェアのテストやレガシーアプリケーションの実行など、多くの場合で有用です。 しかし、完全なオペレーティングシステムをシミュレートすることは、多くのユースケースにおいて通常、不当に計算コストが高く、起動が遅いです。
そこで、ホストOS上で実行される コンテナエンジン を用いて、ランタイム環境、ソースコード、依存関係など、 アプリケーションの実行に不可欠な要素のみを含む軽量な コンテナ 間でリソースを効率的に管理するようになりました。 このコンテナ化のアプローチは、起動時間の短縮、リソース利用の改善、水平スケーリング機能の強化など、従来の仮想化に比べて利点が大きい場合が多いです。 さらに、コンテナを用いると、開発者が異なる環境間で一貫した環境を素早く構築し作業できるようになり、同一のローカル設定を構築したり、 リソースを大量に消費する仮想マシンを実行したりする必要性を排除できます。
Dockerは、このようなコンテナ化ソリューションを提供する主要な非商用オープンソースプロジェクトで、ソフトウェアの開発とデプロイメントに革命をもたらしました。 これが、Dockerが最も使用されている開発者ツールの1つであり、私たちが学ぶべき理由です。DockerはDocker Engineと呼ばれるコンテナエンジンと、 デスクトップでDockerを操作する開発者向けGUIであるDocker Desktopを提供しています。以前にDockerをインストールしていない場合は、 このリンクの手順に従ってインストールできます。
Dockerイメージとコンテナ
Dockerの使用には、初心者をしばしば混乱させる複数の用語と概念が含まれており、イメージとコンテナという中核的な概念が主な混乱の源です。 Dockerイメージは、ランタイム環境、ソースコード、依存関係、コマンドなど、必要なすべての要素を含むコンテナのための設計図として機能します。 Dockerコンテナは、Dockerイメージの実行中のインスタンスです。したがって、コンテナを設定するには、まずそれらのイメージを作成する必要があります。
イメージの概念があることで、コンテナの必要なコンポーネントをすべて事前にインストールおよび設定でき、コンテナはプロセスを起動するために、 イメージで設定された既定のコマンドを実行するだけで済むため、コンテナの起動を高速化できます。これにより、必要に応じて同じコンテナを複製することも容易になります。 コンテナが既に実行中の状態でイメージを変更すると不整合が生じるため、イメージは作成後は読み取り専用になります。したがって、異なる設定を使用したい場合は、 新しいイメージを設定する必要があります。
イメージレイヤー
もう1つ重要な点は、イメージが異なるレベルでタスクを実行する複数のレイヤーで構成されていることです。通常、オペレーティングシステムまたはランタイムの設定から始まり、 ソースコードをイメージにコピーし、ソースコードで設定された依存関係をインストールし、コマンドを設定します(通常これらのタスクを逆順に実行することはできません。 例えば、インストールする依存関係を指定するソースコードをコピーする前に、依存関係をインストールすることはできません)。 まずオペレーティングシステムまたはランタイムを設定する標準的な方法は、Docker Hubで公開されているイメージを使用することです。
Docker Hubのウェブサイトこちらにアクセスすると、ダウンロードして使用できるイメージのリストが表示されます。
例えば、"ubuntu"を検索し、公式のubuntuイメージにアクセスし、サイトに記載のあるdocker pull ubuntu
コマンドを実行すると、イメージがインストールされます。
イメージをインストールした後、単純にそのコンテナを実行したり(Linuxシリーズで行ったこと)、より多くのレイヤーを追加して私たちのアプリケーションを実行するための親イメージとして使用したりできます。
イメージの作成方法の詳細は次の記事で説明します。
結論
この記事では、他の選択肢と比較してDockerとは何か、Dockerが有用な理由、そしてDockerを始めるために必要な基本的な概念について説明しました。 次の記事では、Dockerをどのように使用できるかについて、より詳細な概念を説明し実演します。
リソース
- IBM Technology. 2024. Virtual Machine (VM) vs Docker. YouTube.
- Net Ninja. 2022. Docker Crash Course #3 - Images & Containers. YouTube.
- Net Ninja. 2022. Docker Crash Course #4 - Parent Images & Docker Hub. YouTube.