第1章:コンテナ技術入門

はじめに

Inceptionは、Docker環境でWebアプリケーションインフラを構築するプロジェクトです。本章では、仮想化からコンテナへの進化と、Dockerの基礎を学びます。

---

1. 仮想化の歴史

1.1 メインフレーム時代

1960年代:
IBM CP-67/CMS
- 最初の仮想マシン
- 時分割システム

目的:
- 高価なハードウェアの効率的利用
- 複数ユーザーの同時利用

1.2 x86仮想化

1990年代後半:
VMware(1998年設立)
- x86アーキテクチャの仮想化
- ソフトウェアエミュレーション

2000年代:
- Intel VT-x(2005)
- AMD-V(2006)
- ハードウェア支援仮想化

主要製品:
- VMware ESXi
- Microsoft Hyper-V
- KVM(Linux)
- VirtualBox

1.3 仮想マシンの課題

+----------------+  +----------------+
|   App A        |  |   App B        |
+----------------+  +----------------+
|   Bins/Libs    |  |   Bins/Libs    |
+----------------+  +----------------+
|   Guest OS     |  |   Guest OS     |
+----------------+  +----------------+
        ↓                  ↓
+----------------------------------+
|           Hypervisor             |
+----------------------------------+
|           Host OS                |
+----------------------------------+
|           Hardware               |
+----------------------------------+

問題:
1. オーバーヘッド(各VMにOS)
2. リソース消費大
3. 起動時間(分単位)
4. ディスク使用量大

---

2. コンテナの登場

2.1 chroot(1979)

chrootの概念:
- プロセスのルートディレクトリを変更
- ファイルシステムの分離

$ chroot /new_root /bin/bash

制限:
- プロセス分離なし
- ネットワーク分離なし
- セキュリティが弱い

2.2 Linux Containers

2000年代のLinux機能:

1. namespaces(2002〜)
   - プロセス空間の分離
   - ネットワーク分離
   - ユーザー分離

2. cgroups(2006)
   - リソース制限
   - CPU, メモリ, I/O

3. LXC(2008)
   - Linux Containers
   - 最初の実用的コンテナ技術

2.3 Dockerの誕生

2013年3月:
dotCloud社がDockerをオープンソースで公開
(後にDocker社に改名)

Dockerの革新:
1. 使いやすいAPI
2. イメージレイヤー
3. Dockerfile
4. Docker Hub

Solomon Hykes(創業者):
「アプリケーションのシッピングコンテナ」

---

3. コンテナ vs 仮想マシン

3.1 アーキテクチャ比較

仮想マシン:                  コンテナ:
+--------+ +--------+        +--------+ +--------+
| App A  | | App B  |        | App A  | | App B  |
+--------+ +--------+        +--------+ +--------+
| Libs   | | Libs   |        | Libs   | | Libs   |
+--------+ +--------+        +--------+ +--------+
|Guest OS| |Guest OS|               ↓
+--------+ +--------+        +------------------+
       ↓                     | Container Runtime |
+------------------+         +------------------+
|   Hypervisor     |         |     Host OS      |
+------------------+         +------------------+
|    Host OS       |         |    Hardware      |
+------------------+         +------------------+
|    Hardware      |
+------------------+

3.2 特性比較

             仮想マシン          コンテナ
起動時間     分単位              秒単位
サイズ       GB単位              MB単位
分離         完全                プロセスレベル
オーバーヘッド 大きい            小さい
密度         数十VM/ホスト       数百〜数千/ホスト
可搬性       イメージ大          軽量イメージ
セキュリティ より強い            カーネル共有

---

4. Dockerの基本概念

4.1 アーキテクチャ

+--------------------------------------------------+
|                Docker Client                      |
|  docker build, docker run, docker pull ...       |
+--------------------------------------------------+
                        ↓ REST API
+--------------------------------------------------+
|                Docker Daemon (dockerd)           |
+--------------------------------------------------+
        ↓              ↓               ↓
+----------+    +-----------+    +-----------+
| Images   |    | Containers|    | Networks  |
+----------+    +-----------+    +-----------+
                       ↓
              +----------------+
              | containerd     |
              +----------------+
                       ↓
              +----------------+
              | runc           |
              +----------------+

4.2 イメージとコンテナ

イメージ(Image):
- 読み取り専用テンプレート
- レイヤー構造
- 不変(immutable)

コンテナ(Container):
- イメージの実行インスタンス
- 書き込み可能レイヤー
- ライフサイクルあり

例え:
イメージ = クラス
コンテナ = インスタンス

イメージ = 設計図
コンテナ = 建物

4.3 レイヤー構造

+------------------------+
|   Writable Layer       | ← コンテナ固有
+------------------------+
|   Layer: App files     | ← FROM以降の命令
+------------------------+
|   Layer: Dependencies  |
+------------------------+
|   Layer: Base packages |
+------------------------+
|   Base Image (Alpine)  | ← FROM命令
+------------------------+

特徴:
- 各レイヤーは読み取り専用
- 共有可能(ディスク節約)
- キャッシュによるビルド高速化

---

5. Dockerコマンド基礎

5.1 イメージ操作

# イメージの取得
docker pull alpine:3.18
docker pull nginx:alpine

# イメージの一覧
docker images
docker image ls

# イメージの削除
docker rmi <image_id>
docker image rm <image_name>

# イメージのビルド
docker build -t myapp:1.0 .
docker build -t myapp:1.0 -f Dockerfile.dev .

# イメージの検査
docker inspect <image_id>
docker history <image_id>

5.2 コンテナ操作

# コンテナの実行
docker run nginx:alpine
docker run -d nginx:alpine          # バックグラウンド
docker run -p 8080:80 nginx:alpine  # ポートマッピング
docker run -v ./data:/data alpine   # ボリュームマウント
docker run --name web nginx:alpine  # 名前指定
docker run -it alpine /bin/sh       # インタラクティブ

# コンテナの一覧
docker ps         # 実行中
docker ps -a      # すべて

# コンテナの操作
docker stop <container_id>
docker start <container_id>
docker restart <container_id>
docker rm <container_id>

# コンテナへの接続
docker exec -it <container_id> /bin/sh
docker attach <container_id>

# ログの確認
docker logs <container_id>
docker logs -f <container_id>  # フォロー

5.3 ネットワーク

# ネットワークの一覧
docker network ls

# ネットワークの作成
docker network create mynet
docker network create --driver bridge mynet

# ネットワークへの接続
docker run --network mynet nginx:alpine
docker network connect mynet <container_id>

# ネットワークの検査
docker network inspect mynet

5.4 ボリューム

# ボリュームの一覧
docker volume ls

# ボリュームの作成
docker volume create mydata

# ボリュームの使用
docker run -v mydata:/data alpine

# ボリュームの削除
docker volume rm mydata

# 未使用リソースの削除
docker system prune
docker volume prune

---

6. Inceptionプロジェクト構成

6.1 要件

必須サービス:
1. Nginx(TLSv1.2/1.3のみ)
2. WordPress + php-fpm
3. MariaDB

ボリューム:
- WordPressファイル
- MariaDBデータ

ネットワーク:
- サービス間のDocker network

禁止事項:
- docker run 禁止(docker-compose使用)
- --link 禁止
- network: host 禁止
- :latest タグ禁止

6.2 ディレクトリ構造

inception/
├── Makefile
├── docker-compose.yml
├── .env
└── srcs/
    ├── docker-compose.yml
    ├── .env
    └── requirements/
        ├── nginx/
        │   ├── Dockerfile
        │   ├── conf/
        │   │   └── nginx.conf
        │   └── tools/
        ├── wordpress/
        │   ├── Dockerfile
        │   ├── conf/
        │   └── tools/
        │       └── setup.sh
        └── mariadb/
            ├── Dockerfile
            ├── conf/
            └── tools/
                └── init.sh

6.3 全体構成図

                        +--------+
                        | Client |
                        +--------+
                             |
                          :443 (HTTPS)
                             ↓
+----------------------------------------------------+
|                    Docker Network                   |
|  +----------+     +-----------+     +----------+   |
|  |  Nginx   | --> | WordPress | --> | MariaDB  |   |
|  | (TLS)    |     | (php-fpm) |     |          |   |
|  +----------+     +-----------+     +----------+   |
|       ↓                 ↓                ↓         |
|  +----------+     +-----------+     +----------+   |
|  | /etc/    |     | /var/www  |     | /var/lib |   |
|  | nginx    |     | /html     |     | /mysql   |   |
|  +----------+     +-----------+     +----------+   |
+----------------------------------------------------+
        ↓                 ↓                ↓
   [Config]         [WP Volume]       [DB Volume]

---

7. 開発環境セットアップ

7.1 Docker インストール

# Ubuntu
sudo apt update
sudo apt install docker.io docker-compose

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

# 動作確認
docker run hello-world

7.2 42 VM での注意

# VirtualBox の場合、ネストした仮想化が必要な場合あり

# Docker のディスク使用場所
# デフォルト: /var/lib/docker
# sgoinfre を使う場合:
sudo systemctl stop docker
sudo mv /var/lib/docker /sgoinfre/$USER/docker
sudo ln -s /sgoinfre/$USER/docker /var/lib/docker
sudo systemctl start docker

---

まとめ

本章で学んだこと:

  • 仮想化の歴史: メインフレームからx86へ
  • コンテナの登場: chroot, LXC, Docker
  • Docker vs VM: 特性比較
  • Dockerの基本: イメージ、コンテナ、レイヤー
  • 基本コマンド: run, build, ps, exec
  • プロジェクト構成: Inceptionの全体像

次章では、コンテナの理論(namespaces, cgroups)を学びます。