1. ホーム
  2. 記事一覧
  3. 初心者からステップアップ!Docker Compose応用ハンズオン

2024.03.19

初心者からステップアップ!Docker Compose応用ハンズオン

前回は「初心者でもサクッとできるDocker Composeハンズオン」でDocker Composeの基本を学びました。今回はさらに一歩踏み込み、Docker Composeを使った応用技術に目を向けます。ログの確認からデバッグ方法まで、効率的なトラブルシューティング技術を身に付けましょう。前回の記事をまだ読んでいない方は、是非チェックしてからこの記事を進めてください。

https://envader.plus/article/327

注記: この記事で使用されているDocker Composeのコマンドは、docker compose(ハイフンなし)の形式で記述されています。これはDocker Composeのバージョン2以降で導入された新しいコマンドラインインターフェイスです。一方、Docker Composeのバージョン1ではdocker-compose(ハイフンあり)の形式が使用されます。ご使用の環境やDocker Composeのバージョンに応じて、コマンドの形式を適宜変更してください。

ログの確認とデバッグ

Docker Compose で開発を行う際、サービスの動作状況を把握し、問題を解決するためにはログ確認が不可欠です。docker compose logs コマンドは、すべてのコンテナのログをまとめて表示したり、特定のサービスのログだけを表示したりと、デバッグをスムーズに行うための強力なツールです。

コンテナのログを表示するコマンド

すべてのコンテナのログを表示

docker compose logs

特定のサービスのログを表示

docker compose logs [サービス名]

リアルタイムでログをフォロー

docker compose logs -f

特定のサービスのリアルタイムログを表示

docker compose logs -f [サービス名]

基本的なトラブルシューティング

  1. エラーメッセージを確認

    ログに errorfailedexception などのキーワードが含まれていないか確認し、問題の根本原因を探ります。

  2. 起動順序を確認

    依存関係のあるサービスが正しい順序で起動していない場合、エラーが発生することがあります。depends_on オプションの設定を確認してください。

  3. 環境変数を検証

    環境変数が正しく設定されていない、または予期せぬ値が設定されている場合、サービスが正常に動作しないことがあります。.env ファイルや docker compose.yml ファイルの設定を確認してください。

  4. リソース制限を見直す

    コンテナに割り当てられたリソース(CPU やメモリなど)が不足している場合、パフォーマンスに影響する可能性があります。docker compose.yml ファイルでリソース制限を調整することを検討してください。

ネットワークとボリュームの管理

Docker Compose では、複数のコンテナ間でネットワークとボリュームを簡単に管理できます。これらのコンポーネントは、アプリケーションのパフォーマンスとデータの永続性を左右する重要な要素です。

ネットワークの管理

  • 複数のコンテナ間で独自のネットワークを構成
  • コンテナは名前で相互参照
  • 外部ネットワークへのアクセス制御
  • 内部ネットワークの分離

ボリュームの管理

  • コンテナ間でデータを共有
  • コンテナのデータを永続化
  • データの保持しながらコンテナの更新・再起動

利点

  • 可搬性

    ネットワークとボリュームの設定を docker compose.yml ファイルに記述することで、どの環境でも一貫した設定でデプロイできます。

  • 簡便性

    複数のサービス間のネットワーク接続やデータ共有を、docker compose.yml ファイル一つで設定できます。

  • セキュリティ

    ネットワークを分離することで、サービス間のアクセスを制御し、セキュリティリスクを軽減できます。

  • データの永続化

    ボリュームを利用することで、アプリケーションのデータをコンテナのライフサイクルから独立させ、データの安全性を高めることができます。

サンプルコード

version: '3.8'
services:
  web:
    image: my-web-app:latest
    networks:
      - app-network
    ports:
      - "8080:80"
    volumes:
      - web-data:/var/www/html
  db:
    image: postgres:latest
    environment:
      POSTGRES_PASSWORD: example
    networks:
      - app-network
    volumes:
      - db-data:/var/lib/postgresql/data
networks:
  app-network:
volumes:
  web-data:
  db-data:

サンプルコードの解説

  • version

    version: '3.8'は、このdocker compose.ymlファイルが使用するDocker Composeのバージョンを指定します。互換性のために適切なバージョンを選択してください。

  • services

    アプリケーションを構成する各コンテナ(この例ではwebとdb)に関する設定を行います。

  • networks

    コンテナ間のネットワーク接続を定義します。ここではapp-networkネットワークを作成し、webとdbサービスがこのネットワーク上で通信できるようにしています。

  • ports

    コンテナのポートをホストマシンのポートにマッピングします。この例では、webサービスの8080番ポートをホストの80番ポートにマッピングしています。

  • volumes

    データの永続化と共有に使用するボリュームを定義します。web-dataボリュームはwebサービスの/var/www/htmlディレクトリに、db-dataボリュームはdbサービスの/var/lib/postgresql/dataディレクトリにそれぞれマウントされます。

ネットワークとボリュームの適切な管理は、効率性と安全性の高い開発環境を実現します。

スケーリングと更新

Docker Composeは、複数のコンテナをまとめて管理するツールです。サービスのスケーリングと更新は、Docker Composeを使ったアプリケーション開発において重要な役割を果たします。スケーリングを行うことで、アプリケーションの負荷に応じてリソースを動的に調整することができます。また、定期的な更新はセキュリティの維持と機能改善に不可欠です。このセクションでは、docker compose upコマンドの--scaleオプションを使用したサービスのスケーリング方法と、サービス更新時のベストプラクティスを紹介します。

サービスのスケーリング

Docker Composeでは、--scaleオプションを使用して特定のサービスのインスタンス数を動的に調整することができます。例えば、webアプリケーションのトラフィックが増加した場合、追加のインスタンスをデプロイして負荷を分散させることが可能です。

サンプルコード

docker compose up -d --scale web=3

このコマンドは、webサービスのインスタンスを3つにスケーリングします。-dオプションは、バックグラウンドで実行するために使用されます。

サービスの更新

サービスを更新する際には、最小限のダウンタイムで変更を適用することが望ましいです。Docker Composeを使用すると、サービスのイメージを更新して、変更をコンテナに適用することが簡単にできます。

ベストプラクティス

  1. イメージのビルド

    変更を加えた後、新しいバージョンのDockerイメージをビルドします。タグを使用してバージョンを管理すると、後で特定のバージョンに戻すことが容易になります。

  2. ローリングアップデート

    更新を行う際は、ローリングアップデートを使用して、一度に一つのインスタンスのみを更新し、サービスの可用性を保ちます。

  3. 環境の分離

    本番環境に適用する前に、変更を開発またはステージング環境でテストすることを推奨します。

サンプルコマンド

docker compose build web
docker compose up -d

最初のコマンドはwebサービスのイメージをビルドし、二番目のコマンドは更新されたサービスをデプロイします。

サービスのスケーリングと更新は、アプリケーションの成長と進化に伴う自然なプロセスです。Docker Composeを効果的に活用することで、これらのプロセスを簡単かつ効率的に管理することができます。

クリーンアップ

Docker Composeプロジェクトで作業を行うと、時間の経過と共に不要になったコンテナ、ネットワーク、ボリュームなどが蓄積していきます。これらはディスクスペースを無駄に消費するだけでなく、環境の整理整頓を困難にし、新しいプロジェクトやアップデートの際に問題を引き起こす可能性があります。ここでは、Docker Composeを使用してこれらのリソースを効率的にクリーンアップする方法について説明します。

コンテナの削除

プロジェクトに関連するコンテナを停止して削除する最も簡単な方法は、docker compose downコマンドを使用することです。このコマンドは、指定されたDocker Composeファイルに基づいて起動されたすべてのサービスを停止し、コンテナを削除します。

サンプルコマンド

docker compose down

ネットワークの削除

docker compose downコマンドは、デフォルトでDocker Composeによって作成されたネットワークも削除します。特定のネットワークのみを削除したい場合は、docker network rmコマンドを使用する必要があります。

サンプルコマンド

docker network rm <network_name>

ボリュームのクリーンアップ

ボリュームは、docker compose downコマンドを実行してもデフォルトでは削除されません。データの永続性を確保するために設計されているため、明示的に削除する必要があります。ボリュームを削除するには、-vオプションを付けてdocker compose downコマンドを実行します。

サンプルコマンド

docker compose down -v

このコマンドは、関連するボリュームも含めてすべてのリソースを削除します。プロジェクトで再利用しないデータのみをこの方法で削除してください。

プロジェクトのクリーンアップは、リソースを効率的に管理し、開発環境を整頓するための重要なプロセスです。定期的なクリーンアップを行うことで、環境の問題を未然に防ぎ、作業効率を高めることができます。

この記事のまとめ

この記事では、Docker Composeを使いこなすための応用テクニックを幅広く紹介しました。

  • ログの確認とデバッグ
  • ネットワークとボリュームの管理
  • スケーリングと更新
  • 不要リソースのクリーンアップ

これらのテクニックを活用することで、Docker Composeを使用した開発をより効率的かつ効果的に行うことができます。

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事