はじめに
1. なぜ今コンテナなのか
近年、マイクロサービスアーキテクチャやクラウドネイティブ開発が主流となり、従来の仮想マシン(VM)では以下のような課題が増えています。
- 起動時間の遅さ:VM は数十秒〜数分かかることが多く、開発サイクルが遅延しがち。
- リソースの非効率利用:OS ごと丸ごと隔離するためメモリ・ストレージの無駄が発生。
Docker は OS カーネルをホストと共有しつつ、プロセスを独立した「コンテナ」として隔離します。その結果、数秒以内で起動し、同一ホスト上で大量のコンテナを効率的に動かせるため、開発スピード・テスト自動化・本番移行のすべてで大きな恩恵があります。
2. 本記事の狙い
この記事では、以下を順に学びます。
- 基本概念:イメージとコンテナの違い、レイヤードFS のメリット
- 環境構築:Windows/Mac 向け Docker Desktop、Linux での Docker Engine 導入
- 実践操作:イメージのビルドからコンテナ起動・停止までのコマンドと注意点
- Compose 利用:複数コンテナ構成を一括管理する方法と環境別オーバーライド
- 運用ベストプラクティス:セキュリティ対策、リソース制限、モニタリング
手を動かしながら学ぶことで、学生エンジニアでも自分の開発環境を完全にコンテナ化し、CI/CD やチーム開発に組み込めるレベルを目指します。

3. 読者の前提スキル
- ターミナル操作:基本的なコマンド(ls・cd・cat・vim など)
- バージョン管理:Git でリポジトリのクローン・コミット・プッシュが可能
- 簡単な開発経験:HTML/CSS/JavaScript や Python/Node.js で Hello World が書けること
Dockerの基本概念
Dockerの基本概念や歴史、メリットデメリットについては、弊サイトのこちらの記事もご参照ください。
1. イメージとコンテナの違い
- イメージ
- 実行環境の「設計図」に相当し、OS レイヤーからアプリケーション依存ライブラリまでをスナップショット化。
- Dockerfile を記述し、バージョン管理可能。
- コンテナ
- その設計図(イメージ)を実行した「実体」で、プロセス単位で隔離された環境。
- 起動時にイメージを読み込み、メモリ・CPU を割り当てて動作。 補足:イメージは使い回し可能で、同じイメージから複数のコンテナを同時起動できるため、水平スケールも容易です。
2. レイヤードファイルシステム
Docker イメージは複数のレイヤーで構成され、各 Dockerfile 命令ごとに新しいレイヤーが積み重なります。
- キャッシュ再利用:下層レイヤーが変わらなければ再ビルドをスキップし、高速化。
- 共有ストレージ:異なるイメージ間で同じレイヤーを共有し、ディスク容量を節約。 何を行うか:Dockerfile の書き方を工夫し、インストールやCOPY の順序を最適化すると、CI 環境でのビルド時間を大幅に短縮できます。
3. Docker Hubとプライベートレジストリ
- Docker Hub
- 公開イメージの中心的リポジトリで、公式イメージやコミュニティ提供イメージが多数。
- イメージのタグ付け(バージョン管理)やスター数の確認が可能。
- プライベートレジストリ
- 企業内限定でイメージを管理するための仕組み。
- 認証方式:Basic 認証や OAuth2/JWT 対応が一般的。
- 運用方法:アクセス制御やスキャン機能(脆弱性検出)を組み込むことで、セキュアに配布できます。 補足:AWS ECR、Azure Container Registry、Google Container Registry などクラウドサービス利用も増えています。
Dockerのインストールとセットアップ
1. Windows/MacでのDocker Desktop導入
- 公式サイトからインストーラーをダウンロード。
- インストールウィザードに従い、WSL2(Windows)や HyperKit(Mac)のコンポーネントを許可。
- 設定画面で CPU・メモリ・ディスクの割り当て量を調整し、ネットワークやプロキシ設定を行う。
- GUI ダッシュボードから イメージ一覧 や コンテナ一覧 を視覚的に管理可能。
何を行うか:初回起動時に「hello-world」を実行し、画面上のログで動作確認と環境情報のチェックをしましょう。
2. Linux環境へのDocker Engine導入
Ubuntu を例に、公式リポジトリを利用して最新版をインストールします。
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 公式 GPG キー追加
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg |
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# リポジトリ登録
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
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
sudo systemctl enable --now docker
注意点:各ディストリビューションの公式ドキュメントでパッケージ名や手順が異なる場合があるため、必ず最新版を確認してください。
3. 初期設定と権限管理
- 動作確認
docker run hello-world
が成功すればインストール完了。
- 非rootユーザー実行
sudo usermod -aG docker $USER
を実行後、再ログインすることでdocker
コマンドが sudo なしで使えます。
- CLI 設定
~/.docker/config.json
に認証情報や CLI プロファイルを保存。docker login
でレジストリへの認証情報を管理します。
Dockerイメージとコンテナの操作
1. イメージのビルド
Dockerfile を作成し、以下を記述します。
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install --production
COPY . .
ENV NODE_ENV=production
EXPOSE 3000
CMD ["node", "index.js"]
- ベースイメージ選定:最小サイズの
alpine
を利用し、攻撃面とサイズを削減。 - キャッシュ最適化:
COPY package*.json
→RUN npm install
の順にして、依存関係変更時のみ再ビルド。 - 環境変数設定:
ENV
で動作モードを指定し、複数環境に対応。
ビルドコマンド:
docker build -t myapp:latest .
ビルドログを確認し、警告やエラーがあれば Dockerfile を修正して再度ビルドしましょう。
2. コンテナの起動・停止
# 起動
docker run -d \
--name web \
-p 8080:3000 \
--restart=unless-stopped \
myapp:latest
# 状態確認
docker ps -a
# ログ確認
docker logs -f web
# 停止
docker stop web
# 削除
docker rm web
--restart=unless-stopped
:ホスト再起動時も自動で立ち上がる便利オプション。docker logs -f
:リアルタイムでログを追跡し、トラブルシューティングに活用。
3. ボリュームとネットワーク
- ボリューム
docker run -d \
-v ~/data:/app/data \
myapp:latest
ホストの ~/data
とコンテナ内の /app/data
をマウントし、データ永続化。
- ネットワーク
docker network create mynet
docker run --network mynet ...
独自ネットワークを作成して、コンテナ間通信を分離・制御。
補足:Docker Compose と組み合わせると、ネットワーク定義も YAML で一元管理できます。
Docker Composeによるマルチコンテナ環境
1. docker-compose.ymlの基本構造
version: '3.8'
services:
app:
build: .
ports:
- "3000:3000"
environment:
NODE_ENV: production
depends_on:
- db
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
volumes:
- db_data:/var/lib/postgresql/data
volumes:
db_data:
networks:
default:
driver: bridge
- services:複数コンテナをまとめて定義
- depends_on:起動順序を保証
- volumes/networks:永続化とネットワークを YAML 内で宣言
起動コマンド:
docker-compose up -d
複数インスタンススケールは
docker-compose up --scale app=3
で実現できます。
2. オーバーライドと環境別設定
docker-compose.override.yml
に開発用のボリュームマウントやデバッグポートを記述。- 本番用は別ファイル(例:
docker-compose.prod.yml
)を用意し、-f
オプションで切り替え。
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
何を行うか:同一定義から複数環境を管理し、設定漏れや重複を防ぎます。
Dockerセキュリティとベストプラクティス
1. 最小権限の原則
- 軽量ベースイメージ:Alpine や Scratch を選択し、不要パッケージをカット。
- 非root実行:
USER node
などで一般ユーザーに切り替え、コンテナ侵害リスクを減少。
2. イメージスキャンと署名
- 脆弱性スキャン:Trivy や Clair を CI に組み込み、自動でレポート生成・しきい値超過でビルド停止。
- 署名:Notary や Cosign でイメージにデジタル署名し、改ざん検知を行う。
3. リソース制限と監視
docker run
時に
--memory 512m --cpus 1.0
でコンテナごとにリソース上限を設定。
- モニタリング:Prometheus+cAdvisor でメトリクス収集、Grafana で可視化。
アラートルールを設定し、異常状況を通知します。
まとめ
本記事では以下を実践的に解説しました:
- Dockerの基本概念(イメージ/コンテナ、レイヤー)
- インストールと初期設定
- イメージビルドとコンテナ操作の詳細手順
- Composeを使ったマルチコンテナ構成と環境別管理
- セキュリティおよび運用管理のベストプラクティス
まずはローカルで hello-world
やサンプルWebアプリをコンテナ化し、手を動かして理解を深めましょう。
次に Docker Compose で複数サービスを連携させ、最終的にプライベートレジストリやCI/CD と統合することで、本番環境運用に耐えるコンテナ基盤を構築できます。