はじめに
開発環境の分離やセキュリティ向上のため、多くの開発者がDockerを使用していますが、用途によってはより適した技術があります。この記事では、Docker以外の主要な仮想化・コンテナ技術を実際の使用例と共に比較します。
比較対象技術
今回比較する技術:
- Docker(基準)
- LXC/LXD/Incus(システムコンテナ)
- systemd-nspawn(軽量システムコンテナ)
- Firejail(アプリケーションサンドボックス)
- chroot jail(従来技術)
各技術の特徴
Docker
アプリケーションコンテナの王様
# 典型的な使用例
docker run -d -p 8080:80 nginx
docker-compose up -d
特徴
- イメージベースの軽量コンテナ
- 単一プロセス中心の設計
- 豊富なエコシステム(Docker Hub)
- 開発・本番環境の一致
LXC/LXD/Incus
システムコンテナのスタンダード
# LXD/Incusの使用例
lxc launch ubuntu:22.04 dev-env
lxc exec dev-env -- bash
lxc config set dev-env limits.cpu 2
lxc config set dev-env limits.memory 4GB
特徴
- フルOS環境を提供
- systemdや複数サービスの実行が可能
- VM的な使用感でコンテナの軽量性
- ライブマイグレーション対応
注意点
- LXD:Canonical製(現在は独立)
- Incus:LXDのコミュニティフォーク
- どちらも活発に開発中
systemd-nspawn
systemd統合の軽量コンテナ
# 基本的な使用例
sudo systemd-nspawn -D /var/lib/machines/mycontainer
sudo machinectl start mycontainer
sudo machinectl login mycontainer
特徴
- systemdに標準搭載
- 設定ファイル不要で即座に利用可能
- systemdサービスとして管理
- LXCより軽量だが機能は限定的
Firejail
既存アプリケーションの分離実行
# アプリケーション分離の例
firejail firefox
firejail --private-home --private-tmp code
firejail --net=none --whitelist=~/projects gcc main.c
特徴
- 既存アプリケーションをそのまま分離実行
- 非常に軽量なオーバーヘッド
- デスクトップアプリケーションに特化
- セキュリティプロファイル豊富
chroot jail
古典的だが軽量な分離技術
# chrootの基本例
sudo chroot /jail /bin/bash
特徴
- 最も軽量
- ファイルシステムのみ分離
- 簡単な設定
- セキュリティは限定的
実用例による比較
Web開発環境の構築
Docker
# docker-compose.yml
version: '3.8'
services:
app:
image: node:18
ports:
- "3000:3000"
volumes:
- ./src:/app
LXD/Incus
lxc launch ubuntu:22.04 webdev
lxc config device add webdev myport proxy listen=tcp:0.0.0.0:3000 connect=tcp:127.0.0.1:3000
lxc exec webdev -- apt install nodejs npm nginx
systemd-nspawn
sudo systemd-nspawn -D /var/lib/machines/webdev \
--bind=/home/user/project:/project \
--port=3000
セキュリティを重視したブラウジング
Docker
docker run -it --rm \
-e DISPLAY=$DISPLAY \
-v /tmp/.X11-unix:/tmp/.X11-unix \
jess/firefox
Firejail
firejail --private --private-dev --private-tmp \
--netfilter --seccomp firefox
パフォーマンス比較
| 技術 | 起動速度 | メモリ使用量 | ファイルI/O | ネットワーク |
|---|---|---|---|---|
| Docker | ◎ | ○ | △ | ◎ |
| LXD/Incus | ○ | △ | ○ | ○ |
| systemd-nspawn | ◎ | ◎ | ◎ | △ |
| Firejail | ◎ | ◎ | ◎ | ○ |
| chroot | ◎ | ◎ | ◎ | × |
セキュリティ比較
| 技術 | プロセス分離 | ネットワーク分離 | ファイルシステム分離 | 脱出困難度 |
|---|---|---|---|---|
| Docker | ◎ | ◎ | ◎ | 高 |
| LXD/Incus | ◎ | ◎ | ◎ | 高 |
| systemd-nspawn | ◎ | ○ | ◎ | 中 |
| Firejail | ◎ | ○ | ○ | 中 |
| chroot | × | × | ○ | 低 |
用途別推奨技術
アプリケーション開発
- 推奨: Docker
- 代替: LXD/Incus(複雑な環境の場合)
システム管理・検証
- 推奨: LXD/Incus
- 代替: systemd-nspawn(軽量用途)
デスクトップアプリケーション分離
- 推奨: Firejail
- 代替: Docker(GUI設定が複雑)
一時的なテスト環境
- 推奨: systemd-nspawn
- 代替: chroot(最軽量)
Ubuntuでのインストール方法
# Docker
curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
# LXD
sudo snap install lxd
sudo usermod -aG lxd $USER
# Incus
sudo apt install incus
# systemd-nspawn
sudo apt install systemd-container
# Firejail
sudo apt install firejail
# または最新版
sudo add-apt-repository ppa:deki/firejail
sudo apt update && sudo apt install firejail
開発状況(2025年現在)
| 技術 | 開発状況 | 最新リリース | LTSサポート |
|---|---|---|---|
| Docker | 活発 | 2024年継続 | あり |
| LXD | 活発 | 5.21 LTS | 2029年まで |
| Incus | 活発 | 6.0 LTS | 2029年まで |
| systemd-nspawn | 活発 | systemdと連動 | あり |
| Firejail | 活発 | 0.9.76 | コミュニティ |
まとめ
各技術には明確な得意分野があります:
- Docker: アプリケーション開発の標準
- LXD/Incus: システム全体の仮想化
- systemd-nspawn: 軽量なシステムコンテナ
- Firejail: デスクトップアプリケーション分離
- chroot: 最軽量の分離環境
用途に応じて適切な技術を選択することで、より効率的で安全な開発環境を構築できます。特に、セキュリティを重視する場面や、複雑なシステム構成が必要な場合は、Docker以外の選択肢も検討する価値があります。
参考リンク
この記事が、適切な仮想化技術選択の参考になれば幸いです。