ホストネットワーク構成で Docker Compose を使用する方法

DockerDockerBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

このチュートリアルでは、LabEx クラウド VM でホストネットワーク構成を使用して Docker Compose を使う方法を案内します。Docker Compose は、複数のコンテナを管理するのに役立つツールです。コンテナとは、Web サーバーなどのアプリケーションを実行する軽量で孤立した環境のことを想像してください。通常、Docker はコンテナのネットワークをホストマシン(作業している VM)から分離しますが、ホストネットワークオプションを使用すると、コンテナがホストのネットワークを直接共有できます。これは、アプリケーションがホスト上で直接実行されているかのように動作する必要がある場合、たとえば追加の設定なしでホストのポートにアクセスする場合に便利です。最後まで進めると、Docker Compose をセットアップし、ホストネットワーキングを使用して簡単な Web サービスを作成、デプロイ、テストできるようになります。Docker は LabEx 環境に事前にインストールされていますが、Docker Compose も使用できるようにします。

この実験では学習のためにインターネット接続が必要です。したがって、Pro ユーザーのみが VM を起動できます。アカウントを Pro にアップグレードする


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/restart("Restart Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") subgraph Lab Skills docker/run -.-> lab-394882{{"ホストネットワーク構成で Docker Compose を使用する方法"}} docker/ps -.-> lab-394882{{"ホストネットワーク構成で Docker Compose を使用する方法"}} docker/restart -.-> lab-394882{{"ホストネットワーク構成で Docker Compose を使用する方法"}} docker/logs -.-> lab-394882{{"ホストネットワーク構成で Docker Compose を使用する方法"}} docker/create -.-> lab-394882{{"ホストネットワーク構成で Docker Compose を使用する方法"}} docker/version -.-> lab-394882{{"ホストネットワーク構成で Docker Compose を使用する方法"}} end

Docker Compose のセットアップ

設定に取り掛かる前に、LabEx クラウド VM で Docker Compose が利用可能かどうかを確認しましょう。Docker は事前にインストールされていますが、複数コンテナのセットアップを管理するための別のツールである Docker Compose はインストールされていない可能性があります。ターミナルを使用してすぐにインストールしましょう。

LabEx VM でターミナルを開きます。プロンプトには /home/labex/project と表示されるはずです。これがデフォルトの作業ディレクトリです。次のコマンドを1つずつ実行します。

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose-install

これらのコマンドの機能は次のとおりです。

  • curl: Docker Compose のバイナリを公式の GitHub リリースからダウンロードします。URL は $(uname -s)-$(uname -m) を使用して、VM のシステム(例: Linux-x86_64)に合わせます。バージョン 2.20.2 は安定しており、広く互換性があります。
  • -o /usr/local/bin/docker-compose: 実行可能ツールの標準的な保存場所である /usr/local/bin に保存します。sudo を使用することで、その場所に書き込む権限があることを確認します。
  • chmod +x: ファイルを実行可能にして、コマンドとして実行できるようにします。再び、sudo を使用することで必要な権限を付与します。

インストールが成功したことを確認するには、次のコマンドを実行します。

docker-compose --version

Docker Compose version v2.20.2 のような出力が表示されるはずです。「command not found」と表示された場合は、コマンドを注意深く再実行してください。タイプミスやインターネットの問題(ダウンロードには VM が Web にアクセスできる必要があります)を確認してください。この手順により、次の手順で docker-compose を使用できるようになります。

ホストネットワークを使用した Docker Compose ファイルの作成

Docker Compose が準備できたので、ホストネットワークを使って Web サービスを実行するためのブループリントである docker-compose.yml ファイルを作成しましょう。簡単で初心者にもやさしい端末テキストエディタである nano を使います。

このファイルを作成および編集するには、次の手順に従います。

  1. 端末で、プロジェクトディレクトリにいることを確認します。

    cd /home/labex/project
  2. nano でファイルを作成して開きます。

    nano docker-compose.yml
  3. 次のコンテンツを nano に入力または貼り付けます。

version: "3"
services:
  web:
    image: nginx:latest
    network_mode: host

各部分の意味は次の通りです。

  • version: "3":Docker Compose ファイル形式を設定します。バージョン 3 は一般的な標準で、テンプレートを選ぶようなものです。
  • services:実行するコンテナ(または「サービス」)をリストします。プロジェクトの作業者のようなものです。
  • web:サービスに名前を付けます。何でも良いですが、「web」は Web サーバにぴったりです。
  • image: nginx:latest:ソフトウェアを指定します。人気のある Web サーバである Nginx で、latest は Docker Hub(コンテナイメージライブラリ)から最新バージョンを取得します。
  • network_mode: host:重要な設定です。通常、Docker はコンテナに独自のプライベートネットワークを与え、ホストから隔離します。host モードでは、コンテナが直接 VM のネットワークを使用できるようになり、そのため Nginx は追加の手順なしでホストのポート(たとえば 80)にアクセスできます。
  1. nano でファイルを保存するには:
    • Ctrl + X を押して終了します。
    • 変更を保存することを確認するために Y を押します。
    • ファイル名を確認するために Enter を押します。

このファイルは現在 /home/labex/project に保存され、次のステップに備えることができました。

Docker Compose アプリケーションのデプロイ

docker-compose.yml ファイルが設定されたので、Nginx コンテナをデプロイしましょう。つまり、Docker にブループリントに基づいてコンテナを起動するよう指示します。これにはターミナルに切り替えます。

/home/labex/project のターミナルで、次のコマンドを実行します。

docker-compose up -d

このコマンドを分解すると:

  • docker-compose: docker-compose.yml を読み取り、サービスを管理するツールです。
  • up: ファイルで定義された web サービス(Nginx)を起動します。
  • -d: サービスをバックグラウンド(「デタッチド」モード)で実行します。これにより、ターミナルを自由に使用できます。

Docker Compose は、VM に nginx:latest イメージがまだない場合、Docker Hub からダウンロードし(ダウンロードメッセージが表示されることがあります)、その後コンテナを起動します。コンテナが実行中かどうかを確認するには、次のコマンドを実行します。

docker ps

このコマンドは、アクティブなコンテナを一覧表示します。「IMAGE」の下に nginx:latest が、「STATUS」の下に「Up」(例: 「Up 5 seconds」)が表示されていることを確認してください。network_mode: host がホストのポートを直接使用するため、ポートマッピング(例: 0.0.0.0:80->80/tcp)は表示されません。何も表示されない場合は、/home/labex/project にいることを確認し(pwd で確認)、docker-compose up -d を再実行してください。

ホストネットワーク上の Nginx サービスのテスト

コンテナがホストネットワーキングで実行されているので、Nginx がホストの標準的な Web ポートであるポート 80 で Web ページを提供しているかどうかをテストしましょう。

/home/labex/project のターミナルで、次のコマンドを実行します。

curl localhost:80

このコマンドで行われることは次のとおりです。

  • curl: ターミナルベースのブラウザのように、Web アドレスからデータを取得します。
  • localhost:80: ポート 80 で VM 自身 (localhost) に接続します。network_mode: host を使用すると、コンテナの Nginx はホストのネットワークを使用するため、そのポート 80 はホストのポート 80 です。

<!DOCTYPE html> で始まる HTML が表示されるはずです。これは Nginx のデフォルトのウェルカムページです。通常、Docker はコンテナネットワークを分離するため、ポートマッピング(例: ホストポート 80 をコンテナポート 80 にマッピング)が必要です。ホストモードではこの手順を省略でき、Nginx が VM のポート 80 に直接バインドできます。

「connection refused」と表示された場合は、手順 3 を確認してください。docker ps を実行して、コンテナが「Up」状態であることを確認します。必要に応じて docker-compose up -d で再起動し、または sudo service docker status で Docker の状態を確認してください。ここではブラウザを使用しないため、curl がテストツールになります。

ログの確認とクリーンアップ

コンテナ内部で何が起こっているかを確認するためにログをチェックしましょう。これはトラブルシューティングの重要なスキルです。その後、コンテナを削除してクリーンアップします。

ログの確認

次のコマンドを実行します。

docker-compose logs web
  • docker-compose logs: サービスからの出力を表示します。
  • web: docker-compose.ymlweb サービスを対象にします。

「nginx starting」や「listening on 0.0.0.0:80」のような行を探してください。curl を使用した場合、「GET /」がログに記録されていることがあります。エラー(例: 「port 80 failed」)もここに表示されます。これは Nginx が停止した場合に役立ちます。

クリーンアップ

次のコマンドを実行します。

docker-compose down
  • docker-compose down: コンテナを停止して削除し、ポート 80 を解放し、整理します。

次のコマンドで確認します。

docker ps

nginx の行がなければ、コンテナは削除されています。まだ残っている場合は、docker-compose down を再実行してください。docker-compose.yml は残るため、後で docker-compose up -d で再起動できます。これで、セットアップ、デプロイ、テスト、削除というライフサイクルが完了します。

トラブルシューティングとベストプラクティス

ここでは、トラブルを解決する方法と、Docker Compose を賢く使う方法について説明します。

トラブルシューティングのヒント

  • コンテナが起動しない場合: docker ps の出力が空の場合、docker-compose logs web を確認して、「port in use」のようなエラーを探します。sudo lsof -i :80sudo kill <PID> でポート 80 を解放し、その後 docker-compose up -d を実行します。
  • curl で応答がない場合: コンテナが起動していることを確認し (docker ps)、Docker が実行中であることを確認します (sudo service docker status)。docker-compose up -d または sudo service docker restart で再起動します。
  • ファイルに関する問題: docker-compose up がファイルを見つけられない場合、/home/labex/project にいることを確認し (pwd)、docker-compose.yml が存在することを確認します (ls)。

ベストプラクティス

  • ホストネットワーキングの制限: ホストネットワーキングは簡単ですが、分離機能をスキップするため、他のサービスが実行されている場合、セキュリティ上のリスクがあります。必要な場合を除き、本番環境ではなく実験(Lab)で使用してください。
  • ポートの事前チェック: sudo netstat -tuln | grep :80 でテストし、最初にポート 80 を空けておきます。
  • ファイルの保存: docker-compose.yml/home/labex/project に保存して、再利用できるようにします。
  • ログの監視: 定期的にログを確認して、問題を早期に発見します。

これらの習慣を身につけることで、Docker の作業が信頼性高く行え、核心的なスキルを身につけることができます。

まとめ

あなたは Docker Compose をインストールし、ホストネットワーキングを使用した docker-compose.yml ファイルを作成し、Nginx コンテナをデプロイし、テストを行い、ログを確認し、クリーンアップを行いました。ホストネットワーキングを使用すると、コンテナは Docker の分離機能をスキップして、ホストのネットワークを直接使用できます。これは非常に強力な手法です。これらの手順は、Docker Compose アプリケーションの管理とトラブルシューティングの基礎を築き、より大規模なプロジェクトに向けて準備を整えます。