Docker コンテナ内で Nginx が 80 番ポートを待ち受けていても、それだけでホストの外からアクセスできるわけではありません。外部から接続させるには、ホスト側ポートとコンテナ側ポートを対応させる port publish が必要です。
この記事では、Ubuntu 22.04 上の Docker で Nginx コンテナを起動し、-p による公開、待ち受け確認、bind address の違い、firewall やリバースプロキシとの役割分担を確認します。
-pによる port publish の向き- Nginx コンテナをホスト側ポートへ公開する手順
- ローカル確認と外部端末からの確認の違い
- bind address を指定した公開範囲の違い
- firewall、リバースプロキシ、TLS を分けて考える理由
書籍
Kubernetes完全ガイド 第2版
コンテナ、ネットワーク、公開方式の周辺知識を体系的に確認したい場合の参考書籍です。価格や在庫はリンク先で確認してください。
Amazon で見るこのリンクは Amazon アソシエイトリンクです。
Docker の外部公開で確認すること
-p 8080:80 は、ホストの 8080 番ポートをコンテナの 80 番ポートへ転送する指定です。左側がホスト、右側がコンテナです。この向きを間違えると、公開されるポートを読み違えます。
| 指定 | 意味 | 確認先 |
-p 8080:80 | ホスト 8080 番をコンテナ 80 番へ対応させる | http://ホスト:8080/ |
-p 127.0.0.1:8080:80 | ホストの loopback だけで待ち受ける | http://127.0.0.1:8080/ |
-p 0.0.0.0:8080:80 | 全インターフェイスで待ち受ける | 外部端末からの接続対象になる |
前提を確認する
Docker Engine が導入済みで、現在のユーザーから docker コマンドを実行できる状態を前提にします。Nginx image は必要に応じて pull されます。
docker --version
docker info
docker psNginx image を取得する
まず Nginx image を取得し、ローカルにあることを確認します。検証では latest でも動きますが、運用手順として固定する場合は tag を明示します。
docker pull nginx:latest
docker images nginx
docker image inspect nginx:latestNginx コンテナを起動して公開する
ホスト側の 8080 番をコンテナ側の 80 番へ対応させて起動します。検証用なので --rm を付け、停止時にコンテナが残らないようにします。
docker run --rm -d \
--name nginx-public \
-p 8080:80 \
nginx:latest
docker psローカルからアクセスを確認する
まずホスト自身から HTTP 応答を確認します。外部端末から接続できない場合でも、ローカルで応答するなら Docker の port publish までは動いている可能性があります。
curl -I http://127.0.0.1:8080/
curl http://127.0.0.1:8080/ | head
ss -lntp | grep 8080外部端末からアクセスする
外部端末から接続する場合は、ホストの IP アドレスに対してアクセスします。ここで失敗する場合は、Docker だけでなく、Ubuntu 側 firewall、ルーター、セキュリティグループ相当の制御も確認します。
hostname -I
ip -br addr
docker port nginx-publicbind address を指定する
-p 8080:80 は環境によって広い範囲で待ち受けます。ローカル確認だけにしたい場合は 127.0.0.1 を明示します。外部公開する場合は、どのインターフェイスで待ち受けるかを意識します。
docker rm -f nginx-public
docker run --rm -d \
--name nginx-local \
-p 127.0.0.1:8080:80 \
nginx:latest
ss -lntp | grep 8080
docker rm -f nginx-localfirewall と公開範囲を確認する
Docker の port publish は、コンテナとホストの対応付けです。ネットワーク全体の公開可否は firewall や上位のネットワーク制御に依存します。
sudo ufw status verbose
sudo nft list ruleset
sudo iptables -Sログと動作を確認する
Nginx が起動しているか、HTTP リクエストが届いているかを確認します。アプリケーション側の応答と、ホスト側の待ち受けを分けて見ると切り分けやすくなります。
docker logs nginx-public
docker exec nginx-public nginx -t
docker exec nginx-public ps aux停止する
検証が終わったらコンテナを停止します。--rm を付けて起動しているため、停止後にコンテナは削除されます。
docker rm -f nginx-public
docker ps -a運用時に見るポイント
検証では -p で直接公開して挙動を確認できます。ただし本番では、TLS、アクセスログ、ヘルスチェック、公開範囲、リバースプロキシの有無を別に決めます。
- ホスト側ポートとコンテナ側ポートの向きを確認する
- 外部公開する前に bind address を確認する
- Docker の公開設定と firewall の許可を分けて確認する
- TLS 終端をコンテナで行うか、リバースプロキシで行うかを決める
- 永続化が必要なコンテンツは volume または bind mount を使う
まとめ
Docker で Nginx コンテナを外部公開する基本は、-p ホスト側:コンテナ側 の向きを正しく読むことです。コンテナ内の Nginx が動いていることと、外部端末から到達できることは別の確認項目です。
Ubuntu 22.04 の既存環境では、Docker の port publish、ホストの待ち受け、firewall、リバースプロキシ、TLS を分けて確認すると、公開範囲を誤りにくくなります。

