第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)を学びます。