はじめに
Docker は、アプリケーションの開発、パッケージング、およびデプロイの方法に革命をもたらした、広く採用されているコンテナ化技術です。Docker コンテナの公開ポートを理解することは、Docker を扱う上で基本的な側面であり、コンテナ内で実行されているサービスにアクセスし、対話することを可能にします。このチュートリアルでは、Docker コンテナの公開ポートを検査するプロセスを案内し、コンテナ化されたアプリケーションをより良く管理し、最適化できるようにします。
💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください
Docker は、アプリケーションの開発、パッケージング、およびデプロイの方法に革命をもたらした、広く採用されているコンテナ化技術です。Docker コンテナの公開ポートを理解することは、Docker を扱う上で基本的な側面であり、コンテナ内で実行されているサービスにアクセスし、対話することを可能にします。このチュートリアルでは、Docker コンテナの公開ポートを検査するプロセスを案内し、コンテナ化されたアプリケーションをより良く管理し、最適化できるようにします。
コンテナポートの検査に入る前に、まずポートとは何か、そして Docker コンテナでなぜ重要なのかを理解しましょう。
Docker では、ポートはコンテナ内で実行されているサービスが外部の世界と通信することを可能にします。ポートを、コンテナ化されたアプリケーションへのドアと考えてください。これらのドアを開かなければ、誰も内部のサービスにアクセスできません。
Docker は、2 つの主要なポート設定タイプをサポートしています。
公開ポート (Exposed Ports): コンテナが潜在的な接続のために利用可能にするポートですが、ホストからは自動的にアクセスできません。
公開ポート (Published Ports): ホスト上のポートにマッピングされ、コンテナサービスへの外部アクセスを可能にする公開ポート。
これをより良く理解するために、シンプルな Web サーバーコンテナを実行してみましょう。
docker run -d --name web-demo nginx
このコマンドをターミナルで実行します。これにより、デタッチモード(バックグラウンドで実行)で web-demo
という名前の Nginx Web サーバーコンテナが起動します。
出力には、次のようなコンテナ ID が表示されます。
3a6e8df899a9b723de9e4684542dc9987af26381118fa36496757d17ac952c9f
この Nginx コンテナは、デフォルトでポート 80 を公開しています(Dockerfile で定義されているとおり)。しかし、まだホストに公開していないため、外部からアクセスすることはできません。
コンテナが実行されているので、そのポート設定を検査してみましょう。
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 web-demo
出力:
80/tcp -> 0.0.0.0:8080
これは、コンテナ内のポート 80/tcp がすべてのホストインターフェースのポート 8080 にマッピングされていることを示しています。
より詳細な情報については、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"
}
]
}
これは、詳細なポートマッピング情報を示しています。
複数のコンテナがある場合は、次のようにしてすべてのポートマッピングを表示できます。
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 つのコンテナがあり、それぞれに独自のポートマッピングがあります。
コンテナ化されたサービスの検査とアクセス方法を理解したので、いくつかの追加のポート管理の概念を探ってみましょう。
以下は、遭遇する可能性のある一般的なシナリオです。
ホストでポート 8080 が既に利用されている場合は、別のポートにマッピングできます。
docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 8081:80 nginx
これで、Nginx コンテナはポート 8081 でアクセス可能になります。
curl localhost:8081
すべてのインターフェース (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 インターフェースにのみバインドされ、ホストの外部からはアクセスできなくなります。
どのホストポートが使用されても構わない場合は、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 にマッピングされました。
一般的なポート関連の問題に対する解決策を以下に示します。
docker run -d --name another-web -p 8082:80 nginx
localhost
の代わりに特別な Docker DNS 名 host.docker.internal
を使用します。docker run --rm alpine ping -c 2 host.docker.internal
sudo lsof -i :8080
コンテナをクリーンアップしましょう。
docker stop web-demo redis-demo
docker rm web-demo redis-demo
この実験では、以下を含む Docker コンテナポートの操作方法を学習しました。
これらのスキルは、Docker コンテナを操作するための基本であり、開発環境および本番環境でコンテナ化されたアプリケーションをデプロイするために不可欠です。この知識があれば、Docker コンテナのネットワーキングの側面を自信を持って設定および管理できるようになります。