Dockerの基本と実践的なコンテナ化手法

Dockerとは

Dockerは、アプリケーションの開発、出荷、実行を行うためのプラットフォームです。コード、ライブラリ、依存関係、設定ファイルなどを含む「コンテナ」と呼ばれる軽量なパッケージを作成することで、どのような環境でも一貫した動作を保証します。これにより、「私のマシンでは動くのに本番環境では動かない」という古典的な問題を解決し、CI/CDパイプラインの効率を大幅に向上させます。

仮想マシンとコンテナの違い

従来の仮想マシン(VM)はハイパーバイザーを使用してハードウェアレベルで仮想化を行い、各VMが独自のOS(ゲストOS)を持つため、リソース消費が大きく起動に時間がかかります。一方、Dockerなどのコンテナ技術はホストOSのカーネルを共有し、プロセスレベルで分離を行います。これにより、VMと比較してリソース消費が大幅に削減され、秒単位での起動が可能になります。一般的なWebサーバーやマイクロサービスの実行においては、完全なOS機能よりもアプリケーションの実行環境のみが必要な場合が多く、コンテナ化は効率的な選択肢となります。

主要な概念

Dockerを理解する上で、以下の3つの要素は不可欠です。

  • イメージ (Image): コンテナを作成するための読み取り専用のテンプレートです。プログラミング言語のクラスのように、実行環境の定義を含みます。
  • コンテナ (Container): イメージから作成された実行インスタンスです。クラスのインスタンスオブジェクトのように、実際に動作する分離された環境を提供します。
  • レジストリ (Registry): イメージを保存・配信するための倉庫です。Docker Hubが代表的なパブリックレジストリとして広く利用されています。

アーキテクチャと環境構築

Dockerはクライアント・サーバ型(C/S)アーキテクチャを採用しており、Docker CLI(クライアント)とDocker Daemon(サーバー)がREST APIやソケットを通じて通信します。ユーザーはCLIからコマンドを送信し、Daemonがコンテナの作成や実行などの処理を行います。

Windows環境ではWSL2 (Windows Subsystem for Linux 2) を利用することで、Hyper-Vを使用せずにDocker Desktopを動作させることが可能です。インストール後、Linuxシステム内でsudo systemctl start dockerコマンドを実行してサービスを開始し、docker versionで正常に動作しているか確認します。

WSL2環境でsystemdを有効にするには、/etc/wsl.confファイルに以下の設定を追加し、WSLを再起動します。

[boot]
systemd=true

これにより、Linux標準のサービス管理機能が利用可能になり、Dockerサービスの自動起動設定も円滑に行えます。

アプリケーションのコンテナ化

アプリケーションをDocker化するプロセスは主に3つのステップで構成されます。

  1. Dockerfileの作成: イメージのビルド手順を定義するテキストファイルを作成します。
  2. イメージのビルド: Dockerfileをもとにイメージを作成します。
  3. コンテナの実行: 作成したイメージからコンテナを起動します。

実践例:Node.jsアプリケーションのコンテナ化

以下に、簡単なNode.jsスクリプトを実行するための環境構築例を示します。まず、プロジェクトディレクトリを作成し、アプリケーションファイルを作成します。

1. アプリケーションファイル (main.js)

const initializeApp = () => {
  console.log("Starting application container...");
  const currentTime = new Date().toISOString();
  console.log(`Current timestamp: ${currentTime}`);
  console.log("Application is running successfully.");
};

initializeApp();

2. Dockerfileの作成

同じディレクトリにDockerfile(拡張子なし)を作成し、以下の内容を記述します。ここではベースイメージに軽量なAlpine Linuxを使用し、作業ディレクトリを設定してからファイルをコピーします。

# Node.js 18のAlpine版イメージをベースにする
FROM node:18-alpine

# コンテナ内の作業ディレクトリを設定
WORKDIR /usr/src/app

# ホストのファイルを作業ディレクトリにコピー
COPY main.js .

# コンテナ起動時に実行するコマンド
CMD ["node", "main.js"]

3. イメージのビルドと実行

ターミナルでDockerfileがあるディレクトリに移動し、以下のコマンドを実行してイメージをビルドします。-tオプションはイメージ名を指定するためのものです。

docker build -t my-node-app .

ビルドが完了したら、docker imagesコマンドで作成されたイメージを確認できます。続いて、以下のコマンドでコンテナを実行します。

docker run my-node-app

正常に実行されると、定義したログメッセージがターミナルに出力されます。これにより、Node.jsの実行環境がインストールされていないマシンでも、Dockerがあれば同一の動作を再現できます。

タグ: Docker containerization Virtualization Dockerfile DevOps

7月9日 00:33 投稿