序論:コンテナ技術の時代

現代のソフトウェア開発とデプロイ環境において、Dockerは今や必須の技術となりました。「私のコンピュータでは正常に動くのに...」という言葉は開発者の間で長らく冗談のように使われてきましたが、Dockerの登場によりこの問題は過去のものとなりました。

このシリーズでは、Dockerの基本概念からKubernetesを活用した大規模コンテナオーケストレーションまで体系的に学習します。第1編ではコンテナ技術の概念、Dockerのアーキテクチャ、インストール方法、そして最初のコンテナを実行する方法まで解説します。

1. コンテナ技術とは?

1.1 コンテナの定義

コンテナ(Container)とは、アプリケーションとその実行に必要なすべての依存関係(ライブラリ、設定ファイル、バイナリなど)を一つのパッケージにまとめ、隔離された環境で実行できるようにする技術です。

コンテナはホストオペレーティングシステムのカーネルを共有しながらも、それぞれ独立したファイルシステム、ネットワーク、プロセス空間を持ちます。これにより、アプリケーションはどの環境でも同一に動作することができます。

1.2 コンテナ技術の核心概念

  • 隔離(Isolation):各コンテナは独立した環境で実行され、他のコンテナやホストシステムに影響を与えません。
  • 移植性(Portability):コンテナはどこでも同一に実行されます。開発環境、テスト環境、本番環境間の差異がありません。
  • 軽量性(Lightweight):仮想マシンとは異なりOS全体を含まないため、高速な起動と少ないリソース使用が可能です。
  • 不変性(Immutability):コンテナイメージは一度作成されると変更されず、同一のイメージで常に同一の環境を再現できます。

2. 仮想マシン vs コンテナ比較

2.1 仮想マシン(VM)の構造

従来の仮想化技術である仮想マシンはハイパーバイザー(Hypervisor)の上にそれぞれ独立したオペレーティングシステム(ゲストOS)をインストールします:

┌─────────────────────────────────────────────────────────┐
│                      Applications                        │
├─────────────────────────────────────────────────────────┤
│   Guest OS  │   Guest OS  │   Guest OS  │   Guest OS    │
├─────────────────────────────────────────────────────────┤
│                     Hypervisor                           │
├─────────────────────────────────────────────────────────┤
│                      Host OS                             │
├─────────────────────────────────────────────────────────┤
│                      Hardware                            │
└─────────────────────────────────────────────────────────┘

2.2 コンテナの構造

コンテナはホストOSのカーネルを共有し、コンテナランタイム(Container Runtime)が隔離を担当します:

┌─────────────────────────────────────────────────────────┐
│  Container  │  Container  │  Container  │  Container    │
│   + App     │   + App     │   + App     │   + App       │
├─────────────────────────────────────────────────────────┤
│                   Container Runtime                      │
├─────────────────────────────────────────────────────────┤
│                       Host OS                            │
├─────────────────────────────────────────────────────────┤
│                       Hardware                           │
└─────────────────────────────────────────────────────────┘

2.3 比較表

項目 仮想マシン(VM) コンテナ(Container)
起動時間 分単位(OS起動が必要) 秒単位(プロセス起動)
リソース使用量 GB単位(OS全体を含む) MB単位(アプリ+依存関係)
隔離レベル 完全なハードウェアレベル隔離 プロセスレベル隔離
移植性 ハイパーバイザー依存 どこでも同一に実行
密度 1サーバーに数十個 1サーバーに数百個
使用ケース 異なるOS実行、完全隔離が必要な場合 マイクロサービス、CI/CD、開発環境

3. Dockerの歴史と利点

3.1 Dockerの誕生

Dockerは2013年にdotCloudというPaaS会社(現在Docker, Inc.)のSolomon Hykesが初めて公開しました。Linuxコンテナ(LXC)技術を基盤に始まりましたが、その後独自のコンテナランタイムであるlibcontainerを開発し、より独立したプラットフォームへと発展しました。

Dockerの登場以前にもコンテナ技術は存在していましたが(chroot、FreeBSD Jail、Solaris Zones、LXCなど)、Dockerはこれを簡単で標準化された方法で使用できるようにし、大衆化に成功しました。

3.2 Dockerの主な利点

  • 開発・運用環境の一致:「私のマシンでは動くのに」問題を解決。開発、テスト、本番環境が同一です。
  • 高速デプロイ:コンテナイメージを通じてアプリケーションを秒単位でデプロイできます。
  • 効率的なリソース使用:VMに比べてはるかに少ないリソースでより多くのアプリケーションを実行できます。
  • マイクロサービスアーキテクチャ対応:各サービスを独立したコンテナとして分離して管理できます。
  • バージョン管理:イメージタグを通じてアプリケーションの様々なバージョンを管理できます。
  • 拡張性:同一のイメージで複数のコンテナを簡単に作成して水平スケーリングが可能です。
  • コミュニティとエコシステム:Docker Hubを通じて数百万の公開イメージを活用できます。

4. Dockerアーキテクチャ

Dockerはクライアント・サーバーアーキテクチャを使用します。主要コンポーネントを見ていきましょう。

4.1 Docker Engine

Docker EngineはDockerの核心コンポーネントで、コンテナを作成して実行する役割を担います。3つの主要コンポーネントで構成されています:

  • Docker Daemon (dockerd):バックグラウンドで実行され、Dockerオブジェクト(イメージ、コンテナ、ネットワーク、ボリューム)を管理します。
  • REST API:Daemonと通信するためのインターフェースを提供します。
  • Docker CLI (docker):ユーザーがDockerを制御するためのコマンドラインインターフェースです。

4.2 Docker Client

Docker ClientはユーザーがDockerと相互作用する主要な方法です。dockerコマンドを使用すると、クライアントがこのコマンドをDocker Daemonに送信し、Daemonがこれを実行します。

# ユーザーがコマンドを入力
docker run nginx

# Docker ClientがDocker Daemonにリクエストを送信
# Docker Daemonがnginxイメージをダウンロードしてコンテナを実行

4.3 Docker Daemon

Docker Daemon (dockerd)はDocker APIリクエストを受信し、Dockerオブジェクトを管理します。複数のDaemonが相互通信してDockerサービスを管理することもできます。

4.4 Dockerオブジェクト

  • イメージ(Image):コンテナを作成するための読み取り専用テンプレートです。
  • コンテナ(Container):イメージの実行可能なインスタンスです。
  • ネットワーク(Network):コンテナ間通信のための隔離されたネットワークです。
  • ボリューム(Volume):コンテナのデータを永続的に保存するための空間です。

4.5 Dockerアーキテクチャ図

┌──────────────────────────────────────────────────────────────┐
│                        Docker Host                           │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │                    Docker Daemon                        │ │
│  │  ┌───────────┐  ┌───────────┐  ┌───────────────────┐   │ │
│  │  │  Images   │  │ Containers│  │ Networks/Volumes │   │ │
│  │  └───────────┘  └───────────┘  └───────────────────┘   │ │
│  └─────────────────────────────────────────────────────────┘ │
│                            ▲                                  │
│                            │ REST API                         │
│                            ▼                                  │
│  ┌─────────────────────────────────────────────────────────┐ │
│  │                    Docker CLI                           │ │
│  └─────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
                            ▲
                            │
                            ▼
             ┌──────────────────────────┐
             │      Docker Registry     │
             │      (Docker Hub)        │
             └──────────────────────────┘

5. Dockerインストール

DockerはWindows、macOS、Linuxすべてのプラットフォームでインストールできます。各オペレーティングシステム別のインストール方法を見ていきましょう。

5.1 WindowsでDockerをインストール

要件:

  • Windows 10 64bit: Pro、Enterprise、Education(Build 19041以上)
  • Windows 11 64bit: Home、Pro、Enterprise、Education
  • WSL 2(Windows Subsystem for Linux 2)有効化
  • ハードウェア仮想化対応(BIOSで有効化)

インストール手順:

  1. Docker公式ウェブサイトからDocker Desktop for Windowsをダウンロードします。
  2. ダウンロードしたDocker Desktop Installer.exeを実行します。
  3. インストール中に「Use WSL 2 instead of Hyper-V」オプションを選択します。
  4. インストール完了後、システムを再起動します。
  5. Docker Desktopを実行し、サービス利用規約に同意します。
# インストール確認(PowerShellで)
docker --version
docker run hello-world

5.2 macOSでDockerをインストール

要件:

  • macOS 12.0(Monterey)以上
  • Apple Silicon(M1/M2/M3)またはIntelプロセッサ
  • 最小4GB RAM

インストール手順:

  1. Docker公式ウェブサイトからDocker Desktop for Macをダウンロードします。
  2. ダウンロードしたDocker.dmgファイルを開き、DockerをApplicationsフォルダにドラッグします。
  3. ApplicationsからDockerを実行します。
  4. システム権限リクエストを承認します。
# Homebrewを使用したインストール(代替方法)
brew install --cask docker

# インストール確認
docker --version
docker run hello-world

5.3 Linux(Ubuntu/Debian)でDockerをインストール

LinuxではDocker Engineを直接インストールします:

# 既存Dockerパッケージの削除
sudo apt-get remove docker docker-engine docker.io containerd runc

# 必要なパッケージのインストール
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# Docker公式GPGキーの追加
sudo mkdir -m 0755 -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# Dockerリポジトリの追加
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Docker Engineのインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# 現在のユーザーをdockerグループに追加(sudoなしでdocker使用)
sudo usermod -aG docker $USER

# 変更を適用(ログアウト後再ログインまたは)
newgrp docker

# インストール確認
docker --version
docker run hello-world

5.4 Linux(CentOS/RHEL)でDockerをインストール

# 必要なパッケージのインストール
sudo yum install -y yum-utils

# Dockerリポジトリの追加
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

# Docker Engineのインストール
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Dockerサービスの開始と有効化
sudo systemctl start docker
sudo systemctl enable docker

# 現在のユーザーをdockerグループに追加
sudo usermod -aG docker $USER

# インストール確認
docker --version
docker run hello-world

6. 最初のコンテナ実行

6.1 Hello Worldコンテナ

Dockerが正常にインストールされたか確認する最も簡単な方法はhello-worldイメージを実行することです:

docker run hello-world

実行結果:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
c1ec31eb5944: Pull complete
Digest: sha256:53641cd209a4fecfc68e21a99871ce8c6920b2e7502df0a20671c6fccc73a7c6
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.
...

6.2 nginx Webサーバーコンテナ

次に実際に使用できるnginx Webサーバーをコンテナで実行してみましょう:

# nginxコンテナ実行
docker run -d -p 8080:80 --name my-nginx nginx

# オプション説明:
# -d: バックグラウンドで実行(detached mode)
# -p 8080:80: ホストの8080ポートをコンテナの80ポートに接続
# --name my-nginx: コンテナに名前を付与
# nginx: 使用するイメージ名

ブラウザでhttp://localhost:8080にアクセスするとnginxウェルカムページが表示されます。

# 実行中のコンテナ確認
docker ps

# 結果例:
CONTAINER ID   IMAGE   COMMAND                  CREATED          STATUS          PORTS                  NAMES
a1b2c3d4e5f6   nginx   "/docker-entrypoint..."  10 seconds ago   Up 9 seconds    0.0.0.0:8080->80/tcp   my-nginx

# コンテナログ確認
docker logs my-nginx

# コンテナ停止
docker stop my-nginx

# コンテナ開始
docker start my-nginx

# コンテナ削除(停止後)
docker stop my-nginx
docker rm my-nginx

6.3 対話型コンテナ実行

コンテナ内部に直接アクセスしてコマンドを実行することもできます:

# Ubuntuコンテナに対話型でアクセス
docker run -it ubuntu bash

# オプション説明:
# -i: 対話型モード(interactive)
# -t: TTY割り当て(ターミナル)
# ubuntu: 使用するイメージ
# bash: 実行するコマンド

# コンテナ内部でコマンド実行
root@container_id:/# cat /etc/os-release
root@container_id:/# apt update
root@container_id:/# exit  # コンテナ終了

7. Docker Hub紹介

7.1 Docker Hubとは?

Docker HubはDockerイメージを保存して共有するクラウドベースのレジストリサービスです。GitHubがソースコードのためのものであるように、Docker HubはDockerイメージのためのものです。

  • 公開リポジトリ:無料で無制限の公開イメージを保存できます。
  • 非公開リポジトリ:有料プランで非公開イメージを保存できます。
  • 公式イメージ:Dockerが検証した公式イメージを提供します。
  • 自動ビルド:GitHub/Bitbucketと連携して自動イメージビルドが可能です。

7.2 Docker Hubの使用方法

# Docker Hubでイメージ検索
docker search nginx

# 結果例:
NAME                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                             Official build of Nginx.                        19000     [OK]
linuxserver/nginx                 An Nginx container...                           200

# イメージダウンロード(pull)
docker pull nginx
docker pull nginx:1.25  # 特定バージョン指定

# Docker Hubログイン(イメージpushのため)
docker login

# 自分のイメージにタグ付け
docker tag my-image:latest username/my-image:latest

# Docker Hubにイメージアップロード(push)
docker push username/my-image:latest

7.3 主要公式イメージ

イメージ 説明 コマンド例
nginx 高性能Webサーバー docker run -d -p 80:80 nginx
mysql MySQLデータベース docker run -d -e MYSQL_ROOT_PASSWORD=pass mysql
postgres PostgreSQLデータベース docker run -d -e POSTGRES_PASSWORD=pass postgres
redis インメモリデータストア docker run -d -p 6379:6379 redis
node Node.jsランタイム docker run -it node
python Pythonランタイム docker run -it python:3.11
ubuntu Ubuntu Linux docker run -it ubuntu bash
alpine 軽量Linux(5MB) docker run -it alpine sh

8. 結論と次のステップ

この第1編ではコンテナ技術の基本概念、Dockerのアーキテクチャ、インストール方法、そして最初のコンテナを実行する方法まで解説しました。

核心ポイントまとめ

  • コンテナはアプリケーションと依存関係をパッケージにまとめて隔離された環境で実行する技術です。
  • VMとの違い:コンテナはホストOSカーネルを共有してより軽量で高速です。
  • Dockerアーキテクチャ:Client-Server構造でDocker CLI、Docker Daemon、Docker Registryで構成されます。
  • 基本コマンドdocker rundocker psdocker stopdocker rm
  • Docker Hub:Dockerイメージを保存して共有するレジストリサービスです。

次回予告

第2編ではDockerイメージとコンテナ管理についてより深く解説します:

  • イメージとコンテナの違い
  • イメージレイヤーの概念
  • docker pull/push/images/rmiコマンド
  • コンテナライフサイクル管理
  • docker runオプション詳細(-d、-p、-v、-e、--name)
  • docker execとattach
  • コンテナログ確認とリソース制限

コンテナ技術は現代ソフトウェア開発の核心です。Dockerをマスターすればより効率的な開発環境とデプロイパイプラインを構築できます。次回はより実用的なDocker活用法を学びましょう!