Docker と Docker Compose 完全ガイド:コマンドとベストプラクティス
Docker と Docker Compose 完全ガイド:コマンドとベストプラクティス
Docker の基本概念
Docker は コンテナ化 を通じてアプリケーションの開発、展開、実行を促進するオープンソースシステムです。アプリケーションとその依存関係を自己完結型で移植可能なユニットにパッケージ化することで互換性の問題を解決し、あらゆる環境で一貫した実行を保証します。
主要コンポーネント
-
イメージ(Images):コード、ランタイム、ライブラリ、設定を含む実行に必要なすべてを備えた軽量で自己完結型の実行可能ソフトウェアパッケージ。コンテナ作成のための仮想化テンプレート。
-
コンテナ(Containers):Docker イメージの ランタイムインスタンス。ソフトウェアを環境から分離し、ホスト上で多数を同時に実行可能。
-
Docker Hub:コンテナイメージの検索と共有を可能にする Docker 提供サービス。
Docker CLI コマンド(基本)
| タスク | CLI コマンド | 説明 |
|---|---|---|
| イメージ | ||
| イメージ構築 | docker build -t <image_name> . | 現在ディレクトリの Dockerfile からイメージを構築。 |
| キャッシュ無し構築 | docker build -t <image_name> . --no-cache | キャッシュを使用せず強制的に再構築。 |
| イメージ一覧 | docker images | すべてのローカルイメージを表示。 |
| イメージ削除 | docker rmi <image_name> | ローカルイメージを削除。 |
| 未使用イメージ削除 | docker image prune | 未使用のすべてのイメージを削除。 |
| Docker Hub へ公開 | docker push <user>/<image_name> | イメージを Docker Hub へアップロード。 |
| コンテナ | ||
| コンテナ実行(名前付き) | docker run --name <container_name> <image_name> | イメージからコンテナを作成・実行。 |
| バックグラウンド実行 | docker run -d <image_name> | 分離モード(バックグラウンド)でコンテナ実行。 |
| ポート公開付き実行 | docker run -p <host_port>:<container_port> <image_name> | コンテナポートをホストへマッピング。 |
| コンテナ一覧(実行中) | docker ps | 現在実行中のコンテナを表示。 |
| すべてのコンテナ一覧 | docker ps --all | 状態に関わらずすべてのコンテナを表示。 |
| 開始/停止/再起動 | docker start|stop|restart <container_name> | 既存コンテナの開始または停止。docker stop は SIGTERM シグナルを送り優雅にシャットダウン。 |
| コンテナ削除 | docker rm <container_name> | 停止したコンテナを削除。 |
| コンテナ内に入る | docker exec -it <container_name> sh | 実行中のコンテナ内にインタラクティブシェルを開く。 |
| ログ表示 | docker logs -f <container_name> | コンテナログを表示・追跡。 |
| コンテナ検査 | docker inspect <container_name> | コンテナ詳細を表示(通常 JSON 形式)。 |
| リソース監視 | docker stats | ランタイムリソース使用統計を表示。 |
高度な Docker:イメージとセキュリティのベストプラクティス
マルチステージビルド
マルチステージビルドは Dockerfile を最適化しつつ可読性を保ちます。開発ツールを含まず、必要なバイナリや成果物だけを含む小型で安全な本番イメージを作成可能。
- 使用法:複数の
FROM命令を使用、各命令が新しいステージを開始。 - 選択的コピー:
COPY --from=<stage>で前のステージから成果物をコピー。 - ステージ名付け:
FROM <image> AS <NAME>でステージに名前を付け、参照しやすくし、命令の並べ替えでコピーが壊れるのを防ぐ:COPY --from=build /bin/hello /bin/hello。 - デバッグ:
docker build --target <stage> -t hello .で特定ステージまでだけビルド可能。 - BuildKit:推奨ビルドツール。ターゲットに依存するステージだけを処理し、レガシービルダーのようにターゲットまでのすべてのステージを処理しない。
イメージとコンテナのセキュリティ
| プラクティス | 詳細 |
|---|---|
| ベースイメージ | 信頼できるソースの公式または検証済みイメージを使用。最小ベースイメージから始め、必須依存だけを含め脆弱性を最小化。 |
| スキャン | 定期的に既知脆弱性をスキャン(例:Trivy や Docker Scout などのツール使用)。 |
| 特権 | 最小特権原則 を遵守。root 以外のユーザー でコンテナを実行。 |
| ファイルシステム | 可能な限り 読み取り専用 ファイルシステムを使用。 |
| コンテンツ署名 | Docker Content Trust (DCT) を有効化し、署名済みイメージだけを使用することを保証。 |
Docker Compose(マルチコンテナアプリケーション管理)
Docker Compose はマルチコンテナアプリケーションの 管理を簡素化 するツール。単一 YAML ファイル(通常 docker-compose.yml)で複数コンテナ(サービス、ネットワーク、ボリューム)を 定義・オーケストレーション できる。
- Docker との主な違い:Docker は個別コンテナ管理、Docker Compose は協調動作する複数コンテナを調整。
- 理想的な用途:Web アプリ、データベース、フロントエンドなど複数サービスの迅速で柔軟な設定が必要な 開発・テスト 環境に特に有用。
- バージョン V2:最新バージョンの使用を推奨。V1(ハイフン付き:
docker-compose)は更新停止。V2 はdocker compose(ハイフン無し)を使用。
Compose 構造と基本コマンド
docker-compose.yml ファイルが構造を定義:
# 注:最新 Docker Compose バージョンではバージョン指定は不要
# version: '3.8' # 現代バージョンではオプション
services:
service1: # コンテナ/サービス定義
# サービス設定
networks:
network1: # カスタムネットワーク設定
# ネットワーク設定
volumes:
volume1: # 名前付きボリューム定義
# ボリューム設定| タスク | CLI コマンド(V2) | 説明 |
|---|---|---|
| 構築と展開 | docker compose up | yml で定義されたコンテナを構築・実行。 |
| バックグラウンド展開 | docker compose up -d | 展開しアプリをバックグラウンドで実行。 |
| アプリ停止 | docker compose stop | コンテナを停止。 |
| 停止と削除 | docker compose down | サービスとネットワークを停止・削除。デフォルトで名前付きボリュームは削除しない。 |
| ボリューム付き削除 | docker compose down --volumes または -v | サービス、ネットワーク、名前付きボリュームを強制削除。 |
| サービススケール | docker compose up --scale service=n | 特定サービスのコンテナ数(n)を増加。 |
| サービスステータス | docker compose ps | コンテナの現在ステータスを表示。 |
| ログ | docker compose logs | 定義コンテナのログを表示。 |
永続データ管理(ボリューム)
ボリューム はコンテナとホスト間でデータを永続化し、コンテナ停止・再起動時にデータが失われないよう保証する上で不可欠。
- 名前付きボリューム:ユーザー定義名を持ち、識別と管理を容易にする。
ymlのvolumesセクションで定義し、サービスでマウント。 - ホストマウント(バインドマウント):ホストディレクトリをコンテナと共有し、データアクセスと編集を促進。構文:
/path/on/host:/path/in/container。
| タスク | CLI コマンド(Docker、Compose ボリュームに適用) |
|---|---|
| ボリューム一覧 | docker volume ls |
| ボリューム検査 | docker volume inspect <volume_name> |
| ボリューム削除 | docker volume rm <volume_name> |
| 未使用ボリュームクリーン | docker volume prune |
Compose の高度な本番ベストプラクティス
シークレットと環境変数管理
データベース認証情報や API キーなどの重要な設定をアプリコードから分離することで、柔軟で安全な展開が可能。
- リスク:絶対にシークレット(パスワード、トークン)を
Dockerfilesにハードコードしたり、イメージレイヤーで誤って暴露したりしない。 - 環境ファイル(
env_file):環境変数を.envファイルに保存し、docker-compose.ymlでenv_file: .envディレクティブで参照することを推奨。 - セキュリティ:この
.envファイルはコードリポジトリから 除外 する必要がある(例:.gitignore使用)。バージョン管理で暴露せず、ランタイムでシークレットをロード可能。
ネットワークとアクセスセキュリティ
- 内部接続性:デフォルトで Compose で定義されたコンテナは内部で相互接続。
- データベース保護:
ymlでデータベースのポート公開を 削除 することは良いセキュリティプラクティス(ホストへのポートバインディングを行わない)。データベースプロセスはポートを要求するが、ホストにバインドされず、データベースを公開から保護。アクセスには SSH でトンネル接続可能。
リソース制限と再起動
共有環境では、他のアプリに影響を与えないようアプリが消費できるリソースを制限することが重要。
- リソース制限(
deploy: resources):サービスで メモリ、CPU、GPU の使用制限を指定可能。- 制限(
limits):アプリが持てる総使用量(例:cpus: 1、memory: 1GB)。 - 予約(
reservations):コンテナが独占的に操作に予約する RAM と CPU。
- 制限(
- 再起動ポリシー(
restart_policy):サーバ再起動時にアプリが 自動起動 するようrestart: alwaysを使用することは重要。- 詳細設定で条件(例:
on-failure)、遅延(delay)、最大試行回数(max_attempts)、再起動時間枠(window)を定義可能。
- 詳細設定で条件(例:
ヘルスチェック
コンテナに対して継続的にテストを発行し、実際に動作しているか検証し、失敗したら再起動する機能。
- 設定:
interval(テスト発行頻度)、retries(ダウンとみなす失敗回数)、timeout(リクエスト最大待機時間)、start_period(起動時アプリ開始の猶予時間)を定義可能。
ホストセキュリティと一般的ベストプラクティス
Docker Engine が動作する Linux サーバのセキュリティ向上:
- Root アクセス制限:ログイン用 Root アクセスを制限(Ubuntu Server ではデフォルトで無効)。
- RSA キー:パスワードではなく RSA(SSH キー) を使用してログインすることを推奨。
ssh-keygenで SSH キーを作成可能。ssh-copy-id <user>@<server>で公開鍵をサーバへコピー可能。
- ブルートフォース攻撃防止:Fail2Ban をインストール(
apt install fail2ban)。このアプリはファイアウォールルール(例:IP Tables)を使用し、SSH ポートへの失敗試行が多すぎる IP をブロック。 - メンテナンス:脆弱性緩和のため Docker Engine とその依存を頻繁に更新。
- 監視:アプリログを記録し、サーバのクラッシュやリソース不足を自動検出する監視システムを実装。さらに
docker statsでリソースを監視。
結論
Docker と Docker Compose は現代ソフトウェア開発の基本ツールです。それらのコマンドとベストプラクティスを習得すれば、開発効率が向上し、本番環境でより安全で保守可能な展開が保証されます。これらのプラクティスを正しく実装すれば、スケーラブルで移植可能、弾力性のあるアプリケーションを作成可能。
容器化学習の旅を続けるには、Kubernetes オーケストレーション戦略の探求や、アプリケーションのサイズと起動時間をさらに削減するイメージ最適化技術の深掘りを推奨します。