Dockerを使ってWebサーバーやアプリを動かすとき、忘れてはいけないのがポートの設定です。
「起動したけどアクセスできない…」という原因の多くは、ポートの指定忘れや競合。
この記事では、Dockerでコンテナ起動時にポートを指定する方法と、その使い方・注意点までを初心者向けに解説します。
Dockerで「ポート指定」が必要な理由

Dockerコンテナは、セキュリティと独立性を保つためにデフォルトでは外部から隔離されています。
コンテナ内でWebサーバーやデータベースなどのサービスが動いていても、そのままでは外部(ホストPCやネットワーク)からアクセスできません。
コンテナ内のサービスにアクセスするには、ポートマッピングという設定が必要です。
これにより、ホストPCの特定ポートへのアクセスを、コンテナ内の特定ポートに転送できるようになります。
ポートマッピングが必要な理由:
- コンテナはデフォルトで外部からアクセス不可
- WebアプリやAPI、データベースなどの通信には特定のポートが必要
- 複数のコンテナを同時に実行する場合、ポート番号の衝突を避ける必要がある
- 開発・テスト・本番環境で異なるポート設定が必要な場合がある
-p オプションの基本構文

Dockerでポートを指定するには、docker run
コマンドの -p
(または --publish
)オプションを使います。
基本構文:
docker run -p ホストポート:コンテナポート イメージ名
この構文は以下を意味します:
- ホストポート: あなたのPC(またはサーバー)上のポート番号
- コンテナポート: コンテナ内でサービスが使用しているポート番号
例:
docker run -p 8080:80 nginx
この例では:
- ホストの
8080
番ポートへのアクセスが - コンテナ内の
80
番ポート(Nginxのデフォルトポート)に転送される
つまり、ブラウザで http://localhost:8080
にアクセスすると、コンテナ内で動いているNginxのウェブページが表示されます。
実用例:Nginxを8080番で公開する

実際にNginxをポート指定で起動する例を見てみましょう。
Nginxはウェブサーバーで、デフォルトで80番ポートを使用します。
docker run -d --name webserver -p 8080:80 nginx
このコマンドの各部分の意味:
-d
: バックグラウンドで実行(デタッチドモード)--name webserver
: コンテナに「webserver」という名前を付ける-p 8080:80
: ホストの8080番ポートをコンテナの80番ポートにマッピングnginx
: 使用するイメージ名
コマンド実行後、ブラウザで以下のURLにアクセスすると、Nginxのデフォルトページが表示されます:
http://localhost:8080
注意点:
- ホストの80番ポートは特権ポート(1024未満)なので、通常はroot権限が必要です
- そのため一般ユーザーでは8080などの非特権ポートを使うことが多いです
複数ポートの指定・任意のポート番号

複数ポートを同時に公開する:
多くのアプリケーションは複数のポートを使用します。例えば、HTTP (80) とHTTPS (443) です。
docker run -p 8080:80 -p 8443:443 nginx
このコマンドでは:
- ホストの8080番 → コンテナの80番(HTTP)
- ホストの8443番 → コンテナの443番(HTTPS)
両方のマッピングが同時に設定されます。
ポート番号の自由な設定:
必ずしもホストとコンテナで同じポート番号を使う必要はありません。アプリの要件に合わせて自由に設定できます。
docker run -p 3000:8000 node-app
この例では:
- ホストの3000番ポートへのアクセスが
- コンテナ内の8000番ポートに転送される
IPアドレスを指定したポートマッピング:
特定のネットワークインターフェイスにだけポートをバインドすることも可能です。
docker run -p 127.0.0.1:8080:80 nginx
この場合、ローカルホスト(127.0.0.1)からのアクセスのみを許可し、外部ネットワークからはアクセスできなくなります。
任意のホストポートを割り当てる:
ホストポートを指定せず、Dockerに自動割り当てさせることもできます。
docker run -p 80 nginx
この場合、使用可能な任意のホストポートが80番にマッピングされます。
割り当てられたポート番号は docker ps
コマンドで確認できます。
ポートが競合しているときの対処法

ポートが既に使用されている場合、以下のようなエラーが表示されます:
Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use.
ポート競合時の対処方法:
1. 使用中のポートを確認する
Linux/macOS:
sudo lsof -i :8080
Windows:
netstat -ano | findstr :8080
2. 別のポート番号を使用する
競合を避けるために、別の未使用ポートを選びます:
docker run -p 8081:80 nginx
3. 競合しているプロセスを終了する
ポートを使用しているプロセスを特定し、必要に応じて終了します。
Linux/macOS:
sudo kill <PID>
Windows:
taskkill /PID <PID> /F
4. 既存のDockerコンテナを確認・停止する
他のDockerコンテナが同じポートを使用している可能性もあります:
docker ps
使用中のポートが別のコンテナによって使われている場合は、そのコンテナを停止します:
docker stop <コンテナID または名前>
ポート指定済みの状態確認コマンド

コンテナを起動した後、ポートマッピングが正しく設定されているかを確認するには:
docker ps
出力例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx "/docker-entrypoint.…" 5 minutes ago Up 5 minutes 0.0.0.0:8080->80/tcp, :::8080->80/tcp webserver
PORTS列の見方:
0.0.0.0:8080->80/tcp
: すべてのネットワークインターフェイスの8080番ポートが、コンテナの80番TCPポートにマッピングされている:::8080->80/tcp
: IPv6アドレスのマッピング(通常はIPv4と一緒に表示されます)- 複数のポートマッピングがある場合はカンマ区切りで表示されます
特定のコンテナの詳細情報を確認:
docker inspect <コンテナID または名前>
このコマンドの出力から、PortBindings
セクションを探すと詳細なポートマッピング情報が確認できます。
実際の接続テスト:
Webサーバーの場合、ブラウザで接続するか、以下のコマンドで接続確認ができます:
curl http://localhost:8080
まとめ
Dockerコンテナをポート指定で起動することで、外部アクセスの設定が正しく行えるようになります。
おさらい:
-p ホストポート:コンテナポート
で明示的にポートマッピングを設定- 複数ポートの同時マッピングも可能(
-p
オプションを複数指定) - ホストとコンテナで異なるポート番号を自由に設定可能
docker ps
でマッピング状態を確認- ポート競合時は、別ポートを使用するか競合しているプロセスを終了
実践的な活用例:
- 開発環境で複数のWebアプリを同時に動かす(8080, 8081, 8082…)
- 本番環境と同じポート番号をローカルでテスト(443, 80など)
- データベースコンテナの接続ポートを公開(MySQL: 3306, PostgreSQL: 5432など)
- APIとフロントエンドを別々のポートで実行
ポート指定をしっかり行えば、「動いているのにアクセスできない」問題を未然に防げます。
ぜひ本記事を参考に、スムーズなDocker運用を始めてみてください!
コメント