前回は「初心者でもサクッとできる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 [サービス名]
基本的なトラブルシューティング
-
エラーメッセージを確認
ログに
error
、failed
、exception
などのキーワードが含まれていないか確認し、問題の根本原因を探ります。 -
起動順序を確認
依存関係のあるサービスが正しい順序で起動していない場合、エラーが発生することがあります。
depends_on
オプションの設定を確認してください。 -
環境変数を検証
環境変数が正しく設定されていない、または予期せぬ値が設定されている場合、サービスが正常に動作しないことがあります。
.env
ファイルやdocker compose.yml
ファイルの設定を確認してください。 -
リソース制限を見直す
コンテナに割り当てられたリソース(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を使用すると、サービスのイメージを更新して、変更をコンテナに適用することが簡単にできます。
ベストプラクティス
-
イメージのビルド
変更を加えた後、新しいバージョンのDockerイメージをビルドします。タグを使用してバージョンを管理すると、後で特定のバージョンに戻すことが容易になります。
-
ローリングアップデート
更新を行う際は、ローリングアップデートを使用して、一度に一つのインスタンスのみを更新し、サービスの可用性を保ちます。
-
環境の分離
本番環境に適用する前に、変更を開発またはステージング環境でテストすることを推奨します。
サンプルコマンド
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を使用した開発をより効率的かつ効果的に行うことができます。
【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。
「フリーランスエンジニア」
近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。
「成功する人とそうでない人の違いは何か?」
私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。
比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。
多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、
エンベーダー編集部
エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。
関連記事
2020.02.25
完全未経験からエンジニアを目指す爆速勉強法
USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話
- キャリア・学習法
- エンジニア
2024.03.19
初心者でもサクッとできるDocker Composeハンズオン
Docker Compose は、複数の Docker コンテナを定義し、実行するためのツールです。YAML ファイルにサービスの設定を記述することで、一つのコマンドで複数のコンテナを起動、停止、再構築 することができます。
- ハンズオン
- Docker
2024.04.14
手を動かして身につける AWSでサーバレスのハンズオン
サーバレスコンピューティングの最大のメリットは、インフラの管理から解放されることです。開発者はサーバーのプロビジョニングや保守に関する心配をする必要がなく、アプリケーションのコードの作成とその実行に専念できます。より迅速にアプリケーションを市場に投入することが可能となり、イノベーションの速度を高めることができます。
- AWS
- ハンズオン
2024.04.06
[ハンズオン]AWS Backupで作成したAMIをLambdaを使用して起動テンプレートに適用
この記事では、AWS上でのリソース管理を自動化する方法を実践的に解説します。特に、開発環境やプロダクション環境におけるデプロイメントプロセスの簡素化や、ディザスタリカバリ準備の一環として、最新のAMIを定期的に起動テンプレートに適用する自動化手法を紹介します。
- AWS
- インフラエンジニア
- ハンズオン