Zademy

Docker と Docker Compose 完全ガイド:コマンドとベストプラクティス

Docker; DevOps; コンテナ; ガイド; CLI
2077 単語

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 upyml で定義されたコンテナを構築・実行。
バックグラウンド展開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定義コンテナのログを表示。

永続データ管理(ボリューム)

ボリューム はコンテナとホスト間でデータを永続化し、コンテナ停止・再起動時にデータが失われないよう保証する上で不可欠。

  • 名前付きボリューム:ユーザー定義名を持ち、識別と管理を容易にする。ymlvolumes セクションで定義し、サービスでマウント。
  • ホストマウント(バインドマウント):ホストディレクトリをコンテナと共有し、データアクセスと編集を促進。構文:/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.ymlenv_file: .env ディレクティブで参照することを推奨。
  • セキュリティ:この .env ファイルはコードリポジトリから 除外 する必要がある(例:.gitignore 使用)。バージョン管理で暴露せず、ランタイムでシークレットをロード可能。

ネットワークとアクセスセキュリティ

  • 内部接続性:デフォルトで Compose で定義されたコンテナは内部で相互接続。
  • データベース保護yml でデータベースのポート公開を 削除 することは良いセキュリティプラクティス(ホストへのポートバインディングを行わない)。データベースプロセスはポートを要求するが、ホストにバインドされず、データベースを公開から保護。アクセスには SSH でトンネル接続可能。

リソース制限と再起動

共有環境では、他のアプリに影響を与えないようアプリが消費できるリソースを制限することが重要。

  • リソース制限(deploy: resources:サービスで メモリ、CPU、GPU の使用制限を指定可能。
    • 制限(limits:アプリが持てる総使用量(例:cpus: 1memory: 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 オーケストレーション戦略の探求や、アプリケーションのサイズと起動時間をさらに削減するイメージ最適化技術の深掘りを推奨します。