Docker コンテナの公開ポートを検査する方法

DockerDockerBeginner
今すぐ練習

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

はじめに

Docker は、アプリケーションの開発、パッケージング、およびデプロイの方法に革命をもたらした、広く採用されているコンテナ化技術です。Docker コンテナの公開ポートを理解することは、Docker を扱う上で基本的な側面であり、コンテナ内で実行されているサービスにアクセスし、対話することを可能にします。このチュートリアルでは、Docker コンテナの公開ポートを検査するプロセスを案内し、コンテナ化されたアプリケーションをより良く管理し、最適化できるようにします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/inspect("Inspect Container") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") subgraph Lab Skills docker/run -.-> lab-410089{{"Docker コンテナの公開ポートを検査する方法"}} docker/ps -.-> lab-410089{{"Docker コンテナの公開ポートを検査する方法"}} docker/rm -.-> lab-410089{{"Docker コンテナの公開ポートを検査する方法"}} docker/inspect -.-> lab-410089{{"Docker コンテナの公開ポートを検査する方法"}} docker/port -.-> lab-410089{{"Docker コンテナの公開ポートを検査する方法"}} end

Docker コンテナポートの理解

コンテナポートの検査に入る前に、まずポートとは何か、そして Docker コンテナでなぜ重要なのかを理解しましょう。

コンテナポートとは

Docker では、ポートはコンテナ内で実行されているサービスが外部の世界と通信することを可能にします。ポートを、コンテナ化されたアプリケーションへのドアと考えてください。これらのドアを開かなければ、誰も内部のサービスにアクセスできません。

ポート設定の種類

Docker は、2 つの主要なポート設定タイプをサポートしています。

  1. 公開ポート (Exposed Ports): コンテナが潜在的な接続のために利用可能にするポートですが、ホストからは自動的にアクセスできません。

  2. 公開ポート (Published Ports): ホスト上のポートにマッピングされ、コンテナサービスへの外部アクセスを可能にする公開ポート。

これをより良く理解するために、シンプルな Web サーバーコンテナを実行してみましょう。

docker run -d --name web-demo nginx

このコマンドをターミナルで実行します。これにより、デタッチモード(バックグラウンドで実行)で web-demo という名前の Nginx Web サーバーコンテナが起動します。

出力には、次のようなコンテナ ID が表示されます。

3a6e8df899a9b723de9e4684542dc9987af26381118fa36496757d17ac952c9f

この Nginx コンテナは、デフォルトでポート 80 を公開しています(Dockerfile で定義されているとおり)。しかし、まだホストに公開していないため、外部からアクセスすることはできません。

コンテナポート設定の検査

コンテナが実行されているので、そのポート設定を検査してみましょう。

docker ps を使用してポートマッピングを表示する

docker ps コマンドは、実行中のコンテナとそのポート設定を表示します。

ターミナルでこのコマンドを実行します。

docker ps

次のような出力が表示されます。

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
3a6e8df899a9   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    80/tcp    web-demo

PORTS 列に注目してください。80/tcp と表示されており、ポート 80 が公開されているが、ホストには公開されていないことを示しています。

公開ポートを持つコンテナの実行

最初のコンテナを停止し、公開ポートを持つ新しいコンテナを作成しましょう。

docker stop web-demo
docker rm web-demo

次に、ポートマッピングを使用して新しいコンテナを実行します。

docker run -d --name web-demo -p 8080:80 nginx

-p 8080:80 オプションは、コンテナのポート 80 をホストのポート 8080 に公開します。

違いを確認するために、もう一度 docker ps を実行します。

docker ps

出力:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   web-demo

PORTS 列が 0.0.0.0:8080->80/tcp と表示され、コンテナ内のポート 80 がすべてのホストインターフェースのポート 8080 にマッピングされていることを示していることに注目してください。

コンテナポートの詳細検査

Docker は、コンテナポート設定を詳細に検査するための複数のコマンドを提供しています。これらのオプションを調べてみましょう。

docker port コマンドの使用

docker port コマンドは、コンテナのポートマッピングを表示します。

docker port web-demo

出力:

80/tcp -> 0.0.0.0:8080

これは、コンテナ内のポート 80/tcp がすべてのホストインターフェースのポート 8080 にマッピングされていることを示しています。

詳細情報には docker inspect を使用

より詳細な情報については、docker inspect コマンドを使用します。

docker inspect web-demo

このコマンドは、コンテナに関する詳細情報を含む多くの JSON 出力を生成します。ポート情報のみをフィルタリングするには、次のコマンドを使用します。

docker inspect --format='{{json .NetworkSettings.Ports}}' web-demo | jq

jq がインストールされていない場合は、以下でインストールできます。

sudo apt-get update && sudo apt-get install -y jq

フィルタリングされた inspect コマンドの出力は次のようになります。

{
  "80/tcp": [
    {
      "HostIp": "0.0.0.0",
      "HostPort": "8080"
    }
  ]
}

これは、詳細なポートマッピング情報を示しています。

  • コンテナポート:80/tcp
  • ホスト IP: 0.0.0.0 (すべてのインターフェース)
  • ホストポート:8080

すべてのコンテナポートのリスト表示

複数のコンテナがある場合は、次のようにしてすべてのポートマッピングを表示できます。

docker ps --format "{{.Names}}: {{.Ports}}"

出力:

web-demo: 0.0.0.0:8080->80/tcp

これは、異なるポート設定を持つ複数のコンテナを管理する際に役立ちます。

公開ポートを介したサービスへのアクセス

コンテナポートの検査方法を理解したので、コンテナ内で実行されている Web サーバーにアクセスしてみましょう。

コンテナのアクセシビリティのテスト

コンテナのポート 80 をホストのポート 8080 にマッピングしたので、ポート 8080 を介して Nginx Web サーバーにアクセスできます。

curl コマンドを使用して、Web サーバーにリクエストを送信してみましょう。

curl localhost:8080

Nginx のウェルカムページの HTML が表示されるはずです。

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

これにより、公開ポートを介してコンテナ内で実行されている Nginx Web サーバーにアクセスできることが確認されました。

複数のサービスの実行

別のサービスとポートマッピングを使用して、別のコンテナを作成してみましょう。

docker run -d --name redis-demo -p 6379:6379 redis

このコマンドは、Redis データベースコンテナを起動し、そのデフォルトポート 6379 をホストの同じポートにマッピングします。

実行中のコンテナを確認します。

docker ps

出力:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
a45df67e21b3   redis     "docker-entrypoint.s…"   10 seconds ago   Up 10 seconds   0.0.0.0:6379->6379/tcp   redis-demo
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp     web-demo

これで、異なるサービスを実行する 2 つのコンテナがあり、それぞれに独自のポートマッピングがあります。

コンテナポート設定の管理

コンテナ化されたサービスの検査とアクセス方法を理解したので、いくつかの追加のポート管理の概念を探ってみましょう。

一般的なポート管理のシナリオ

以下は、遭遇する可能性のある一般的なシナリオです。

1. ポートマッピングの変更

ホストでポート 8080 が既に利用されている場合は、別のポートにマッピングできます。

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 8081:80 nginx

これで、Nginx コンテナはポート 8081 でアクセス可能になります。

curl localhost:8081

2. 特定のインターフェースへのバインド

すべてのインターフェース (0.0.0.0) にバインドする代わりに、特定の IP にバインドできます。

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx

これにより、コンテナポートは localhost インターフェースにのみバインドされ、ホストの外部からはアクセスできなくなります。

3. ランダムなホストポートの使用

どのホストポートが使用されても構わない場合は、Docker に割り当てさせます。

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -P nginx

-P フラグは、公開されているすべてのポートをホスト上のランダムなポートに公開します。

割り当てられたポートを確認します。

docker port web-demo

出力:

80/tcp -> 0.0.0.0:49153

正確なポート番号は異なりますが、この例では、ポート 80 がポート 49153 にマッピングされました。

一般的なポート関連の問題のトラブルシューティング

一般的なポート関連の問題に対する解決策を以下に示します。

  1. ポートが既に使用されています: "port is already allocated" のようなエラーが表示された場合は、別のポートを選択します。
docker run -d --name another-web -p 8082:80 nginx
  1. コンテナがホストに接続できない: コンテナがホスト上のサービスに接続する必要がある場合は、localhost の代わりに特別な Docker DNS 名 host.docker.internal を使用します。
docker run --rm alpine ping -c 2 host.docker.internal
  1. どのプロセスがポートを使用しているかを確認する: ホストでポートが既に使用されている場合は、そのプロセスを見つけます。
sudo lsof -i :8080

クリーンアップ

コンテナをクリーンアップしましょう。

docker stop web-demo redis-demo
docker rm web-demo redis-demo

まとめ

この実験では、以下を含む Docker コンテナポートの操作方法を学習しました。

  • 公開ポートと公開ポートの違いを理解する
  • 特定のポートマッピングでコンテナを実行する
  • さまざまな Docker コマンドを使用して、コンテナポート設定を検査する
  • マッピングされたポートを介して、コンテナ内で実行されているサービスにアクセスする
  • 一般的なポート関連のシナリオを管理およびトラブルシューティングする

これらのスキルは、Docker コンテナを操作するための基本であり、開発環境および本番環境でコンテナ化されたアプリケーションをデプロイするために不可欠です。この知識があれば、Docker コンテナのネットワーキングの側面を自信を持って設定および管理できるようになります。