Docker コンテナとホスト間のポートマッピング方法

DockerBeginner
オンラインで実践に進む

はじめに

Docker は、開発者がアプリケーションを一貫性があり再現可能な方法でパッケージ化およびデプロイすることを可能にする強力なコンテナ化プラットフォームです。Docker を使用する場合、コンテナとホストシステムの間でポートをマッピングする能力は、通信とコンテナ化されたアプリケーションへのアクセスを可能にする重要な側面です。このチュートリアルでは、Docker のポートマッピングのプロセス、基本概念、および実用的な応用例について説明します。

Docker ポートマッピング入門

Docker は、開発者がアプリケーションを一定の隔離された環境でパッケージ化およびデプロイすることを可能にする、人気のコンテナ化プラットフォームです。Docker の重要な機能の 1 つは、コンテナとホストマシン間でポートをマッピングし、コンテナ化されたアプリケーションと外部世界との間の通信を可能にすることです。

ポートマッピングとは?

ポートマッピング(ポートフォワーディングとも呼ばれます)は、ホストマシンの 1 つのポートから Docker コンテナ内の特定のポートへのトラフィックをリダイレクトするプロセスです。これにより、コンテナは特定のポートでサービスを公開し、ホストマシンは異なるポートを使用してこれらのサービスにアクセスできます。

ポートマッピングが重要な理由

ポートマッピングは、いくつかの理由で重要です。

  1. アクセス性: ポートマッピングがないと、コンテナ化されたアプリケーションはコンテナ外部からアクセスできなくなり、その利用性と他のシステムとの統合が制限されます。
  2. 柔軟性: ポートマッピングにより、同じホストマシン上で複数のコンテナを実行し、それぞれが異なるポートでサービスを公開できます。
  3. セキュリティ: 特定のポートをマッピングすることで、コンテナ化されたアプリケーションへのアクセスを制御および制限し、システム全体のセキュリティを向上させることができます。

Docker ポートマッピング構文

Docker コンテナとホストマシン間でポートをマッピングする構文は次のとおりです。

-p <ホストポート>:<コンテナポート>

ここで、<ホストポート> は、コンテナ化されたアプリケーションにアクセスするために使用されるホストマシンのポートであり、<コンテナポート> は、アプリケーションがリスニングしているコンテナ内のポートです。

たとえば、ホストマシンのポート 80 をコンテナ内のポート 8080 にマッピングするには、次のコマンドを使用します。

docker run -p 80:8080 my-app

これにより、ホストマシンの http://localhost:80 にアクセスすることで、コンテナ化されたアプリケーションにアクセスできるようになります。

コンテナとホスト間のポートマッピング

ポートマッピングプロセスについて

Docker コンテナとホストマシン間のポートマッピングプロセスは、以下の手順で行われます。

  1. コンテナ化されたアプリケーションがリスニングしているポートを特定する: 通常、アプリケーションのドキュメントまたは Dockerfile に記述されています。
  2. アプリケーションにアクセスするために使用するホストマシンのポートを決定する: ホストマシン上で利用可能な任意のポートを使用できます。
  3. Docker コンテナを実行するときに -p または --publish フラグを使用する: これにより、ホストポートをコンテナポートにマッピングできます。

コンテナ作成時のポートマッピング

コンテナ作成時にポートをマッピングするには、docker run コマンドで -p または --publish フラグを使用できます。構文は次のとおりです。

docker run -p <ホストポート>:<コンテナポート> <イメージ名>

たとえば、ホストマシンのポート 80 をコンテナ内のポート 8080 にマッピングするには、次のコマンドを使用します。

docker run -p 80:8080 my-app

実行中のコンテナのポートマッピング

既に実行中のコンテナのポートをマッピングするには、docker port コマンドを使用できます。構文は次のとおりです。

docker port <コンテナ名またはID> <コンテナポート>

これにより、指定されたコンテナポートにマッピングされたホストポートが表示されます。

複数のポートの公開

コンテナとホストマシンの間で複数のポートをマッピングするには、-p フラグを複数回使用します。たとえば:

docker run -p 80:8080 -p 443:8443 my-app

これにより、ホストのポート 80 をコンテナのポート 8080 に、ホストのポート 443 をコンテナのポート 8443 にマッピングします。

ポートマッピングの実用的な応用例

コンテナ内ウェブサーバーの実行

ポートマッピングの最も一般的なユースケースの 1 つは、Docker コンテナ内でウェブサーバーを実行することです。コンテナのウェブサーバーポートをホストマシンのポートにマッピングすることで、ウェブブラウザから簡単にウェブアプリケーションにアクセスできます。

たとえば、Docker コンテナ内で Nginx ウェブサーバーを実行し、ホストのポート 80 をコンテナのポート 80 にマッピングするには、次のコマンドを使用できます。

docker run -p 80:80 nginx

データベースポートの公開

ポートマッピングのもう 1 つの一般的なユースケースは、コンテナからホストマシンへのデータベースポートの公開です。これにより、外部アプリケーションはコンテナ内で実行されているデータベースに接続できます。

たとえば、Docker コンテナ内で MySQL データベースを実行し、ホストのポート 3306 をコンテナのポート 3306 にマッピングするには、次のコマンドを使用できます。

docker run -p 3306:3306 mysql

リモートからのコンテナ化されたサービスへのアクセス

ポートマッピングにより、リモート場所からコンテナ化されたサービスにアクセスすることも可能です。ホストマシンのポートをコンテナ内のポートにマッピングすることで、ホストマシンにアクセスできる任意のコンピュータからコンテナ化されたサービスに接続できます。

これは、ウェブアプリケーション、API、または監視ツールなど、複数のユーザーまたは異なる場所からアクセスする必要があるサービスにとって特に便利です。

コンテナ化アプリケーションのスケーリング

コンテナ化されたアプリケーションの複数のインスタンスを実行する場合、ポートマッピングはロードバランシングとスケーリングに不可欠になります。異なるホストポートを同じコンテナポートにマッピングすることで、複数のコンテナインスタンスにわたって着信トラフィックを分散できます。

これにより、需要に応じてアプリケーションを簡単にスケールアップまたはスケールダウンでき、ポートの競合やアクセス性の問題を心配する必要がなくなります。

まとめ

このチュートリアルでは、Docker でのポートマッピングの重要性と、Docker コンテナとホストシステム間のポートを効果的にマッピングする方法を学びました。ポートマッピングの概念と実用的な応用例を理解することで、コンテナ化されたアプリケーションとのシームレスな通信とアクセスを確保し、Docker ワークフローをより効率的で多用途なものにすることができます。