はじめに
この実験では、実行中の Docker コンテナのポートマッピングを検査するためにdocker portコマンドを使用する方法を学びます。まず、公開ポート付きで Nginx コンテナを起動し、その後コンテナのすべての公開ポートマッピングをリストアップする方法を探ります。
また、特定の公開 TCP および UDP ポートマッピングをリストアップする方法や、存在しない UDP マッピングをクエリした際の挙動についても理解します。最後に、プロトコルを明示的に指定せずに特定の公開ポートマッピングをリストアップする方法を実演します。
公開ポート付きでコンテナを起動
このステップでは、Docker コンテナを起動し、そのポートをホストマシンに公開する方法を学びます。ポートを公開することで、コンテナ内で動作するサービスに外部からアクセスできるようになります。
まず、Docker Hub からnginxイメージをプルします。このイメージにはデモンストレーションに使用できるシンプルな Web サーバーが含まれています。
docker pull nginx
イメージがダウンロードされていることを示す出力が表示されます。ダウンロードが完了したら、次のコマンドを実行してイメージがローカルに存在することを確認できます:
docker images
次に、nginxコンテナを起動し、コンテナ内のポート 80 をホストマシンのポート 8080 に公開します。-dフラグはコンテナをデタッチドモード(バックグラウンド)で実行し、-pフラグはポートをマッピングし、nginxはイメージ名です。
docker run -d -p 8080:80 nginx
出力はコンテナ ID になります。これはコンテナが正常に起動し、その内部ポート 80 が LabEx VM のポート 8080 経由でアクセス可能であることを意味します。
Web サーバーが実行中でアクセス可能であることを確認するには、curlを使用してホストマシンの公開ポートにアクセスします。
curl http://localhost:8080
ターミナルに Nginx のデフォルトウェルカムページの HTML 出力が表示されるはずです。これにより、ポートマッピングが正しく機能しており、ホストからコンテナ内で動作しているサービスにアクセスできることが確認できます。
コンテナの公開ポートマッピングを一覧表示
このステップでは、実行中の Docker コンテナの公開ポートマッピングを一覧表示する方法を学びます。これはどのポートが公開され、どのようにホストにマッピングされているかを確認するのに役立ちます。
特定のコンテナのすべての公開ポートマッピングを一覧表示するには、docker portコマンドの後にコンテナ ID または名前を指定します。まず、前のステップで起動したnginxコンテナの ID を取得しましょう。
docker ps -q --filter ancestor=nginx
このコマンドはコンテナ ID を出力します。次のコマンドで使用するため、この ID をコピーしてください。
次に、コンテナ ID を指定してdocker portコマンドを実行し、ポートマッピングを一覧表示します。<container_id>は実際に取得した ID に置き換えてください。
docker port <container_id>
80/tcp -> 0.0.0.0:8080のような出力が表示されるはずです。これはコンテナの内部ポート 80(TCP プロトコル使用)がすべてのホストインターフェース(0.0.0.0)のポート 8080 にマッピングされていることを示しています。
このコマンドは、実行中のコンテナに設定されているすべてのポートマッピングを簡単に確認する方法です。
特定の公開 TCP ポートマッピングを表示
このステップでは、docker portコマンドを使用して、プロトコルを含む特定の公開ポートマッピングを一覧表示する方法を詳しく説明します。これはコンテナが異なるプロトコルで複数のポートを公開している場合に特に有用です。
特定の公開 TCP ポートマッピングを一覧表示するには、docker portコマンドにコンテナポートとプロトコル (/tcp) を追加します。まず、コンテナ ID が手元にない場合は再度取得してください。
docker ps -q --filter ancestor=nginx
次に、docker portコマンドにコンテナ ID を指定し、内部ポート 80 と TCP プロトコルを明示します。<container_id>は実際のコンテナ ID に置き換えてください。
docker port < container_id > 80/tcp
出力は0.0.0.0:8080となるはずです。これはコンテナの内部 TCP ポート 80 がマッピングされているホストアドレスとポートを具体的に示しています。特定のマッピングとプロトコルだけを確認したい場合、すべてのポートを一覧表示するよりもより正確な情報が得られます。
特定の公開 UDP ポートマッピングを表示(エラー発生予期)
このステップでは、nginxコンテナの特定の公開 UDP ポートマッピングを一覧表示しようと試みます。Nginx は通常 Web サーバーとして TCP のみを使用するため、このコマンドは UDP マッピングを見つけられず、エラーまたは出力が得られないことが予想されます。これはポートマッピングを問い合わせる際にプロトコルを指定する方法と、そのプロトコルのマッピングが存在しない場合の挙動を示すものです。
まず、nginxコンテナのコンテナ ID を取得してください。
docker ps -q --filter ancestor=nginx
次に、docker portコマンドにコンテナ ID を指定し、内部ポート 80 と UDP プロトコル (/udp) を明示します。<container_id>は実際のコンテナ ID に置き換えてください。
docker port < container_id > 80/udp
このコマンドは出力を生成しないか、エラーメッセージを返すはずです。これは設定されたnginxコンテナが UDP プロトコルでポート 80 を公開していないためです。この挙動は、ポートマッピングを問い合わせる際に正しいプロトコルを指定することの重要性を示しています。
プロトコル指定なしで特定の公開ポートマッピングを表示
このステップでは、プロトコル (TCP または UDP) を明示的に指定せずに特定の公開ポートマッピングを一覧表示する方法を学びます。プロトコルを省略した場合、docker portコマンドは指定したコンテナポートの TCP と UDP 両方のマッピングを表示します。
まず、nginxコンテナのコンテナ ID を取得してください。
docker ps -q --filter ancestor=nginx
次に、docker portコマンドにコンテナ ID を指定し、プロトコルなしで内部ポート 80 を指定します。<container_id>は実際のコンテナ ID に置き換えてください。
docker port < container_id > 80
今回のnginxコンテナはポート 80 の TCP マッピングのみを持っているため、出力は80/tcp -> 0.0.0.0:8080となります。もしコンテナがポート 80 に対して TCP と UDP 両方のマッピングを持っている場合、両方が表示されます。これは特定の内部ポートに対するすべてのマッピングをプロトコルに関係なく確認できる便利な方法です。
まとめ
この実験では、docker run -pコマンドを使用して Docker コンテナを起動し、内部ポートをホストマシンに公開する方法を学びました。Nginx コンテナを実行し、内部ポート 80 をホストポート 8080 にマッピングし、curlでアクセス可能か確認することで実証しました。
続いて、実行中のコンテナの公開ポートマッピングを一覧表示するdocker portコマンドを調査しました。すべての公開ポートを一覧表示する方法と、特定の TCP または UDP ポートマッピングをクエリする方法を学び、存在しない UDP マッピングをクエリするとエラーが発生することを理解しました。また、プロトコルを明示的に指定せずに特定のポートマッピングを一覧表示する方法も実践しました。



