Skip to main content

第21章:ポートって何?(入口の番号の話)🚪🔢

この章は「ポート=入口の番号」って感覚を、手を動かしながら腹落ちさせます😊 次の章(ポート公開)で「ホスト↔コンテナ」へつなげるので、まずは土台をガッチリ作ろう〜!🏗️🐳


1) ポートの正体:住所(IP)+入口番号(Port)📮🚪

ざっくり言うと…

  • IPアドレス:建物の住所📮(どのPC/VM/コンテナ?)
  • ポート番号:入口(部屋番号)🚪🔢(どのアプリ?)
  • プロトコル:呼び出し方法📞(TCP/UDP など)

だから、Webサイトを見るときって実は

  • IP(または名前) : ポート

にアクセスしてるんだね😊 (URLでポート省略のときは、だいたい“よくある標準ポート”が使われます)


2) ポート番号の範囲は 0〜65535(3つに分かれる)🧭

ポート番号は 0〜65535 の整数で、ざっくり3つの帯に分かれます👇 (IANA がこの区分を整理しています)(IANA)

  • 0–1023:System / Well-known(有名どころ)👑
  • 1024–49151:User / Registered(登録枠)🧾
  • 49152–65535:Dynamic / Private(動的・一時的)⚡(IANA)

💡イメージ サーバ側(待ち受け)は 3000 / 8080 / 5432 みたいな「決め打ち」が多くて、 クライアント側(ブラウザ等)は 一時的な番号(Dynamic) を勝手に使うことが多いです⚡


3) 「待ち受け(Listen)」が超重要👂📡

アプリがポートを使うとき、基本はこう👇

  • サーバ:**ポートを“待ち受け”する(LISTEN)**👂
  • クライアント:そのポートに接続する🔌

つまり 「ポートはアプリの入口」=「入口を開けて待ってるアプリがいる」 ってこと😊


ハンズオン:自分のPCで“ポートの存在”を目で見る👀🪟

A) まずは超ミニWebサーバを立てる(NodeでOK)🚀

VS Code のターミナル(PowerShell)で、これを実行👇

node -e "require('http').createServer((req,res)=>{res.end('hello port!')}).listen(3000,()=>console.log('listening http://localhost:3000'))"

✅ 出たら成功: listening http://localhost:3000

次にブラウザで👇へアクセス http://localhost:3000 🌐✨

「hello port!」が出たらOK!🎉 これで今あなたのPCでは “3000番の入口” を Node が開けて待ってる 状態です👂🚪


B) そのポートが「LISTEN中」なのを確認する🔍

方法1:PowerShell(おすすめ)⚡

Get-NetTCPConnection -LocalPort 3000 -State Listen

このコマンドは ローカル/リモートIP・ポート・状態などを見られます(Microsoftの公式コマンド説明)(Microsoft Learn)

方法2:netstat(現場でよく見るやつ)🧰

netstat -nato | findstr :3000

「そのポートがLISTENしてるか確認しよう」って手順として、Microsoftも netstat / Get-NetTCPConnection を例に出しています。(Microsoft Learn)


C) “ポート被り”をわざと起こして理解する🔥🚪

今、3000番は Node が使っています。 そこで別ターミナルで、もう一回同じのを実行👇

node -e "require('http').createServer((req,res)=>{res.end('second')}).listen(3000)"

するとだいたい EADDRINUSE(もう使われてるよ)系で怒られます😵‍💫 これが「ポート被り」🔥

直し方は2つだけ覚えればOK👇

  1. 別ポートにする(例:3001)
  2. 先に使ってるプロセスを止める

D) 先に使ってるプロセス(PID)を見つけて止める🕵️‍♂️🧯

netstat -aon | findstr :3000

最後の列に PID が出ます。 止める(※自分が立てた Node のPIDだけね!)👇

taskkill /PID 12345 /F

ここで “Dockerの話” に一歩だけ近づく🐳🔌

コンテナでも同じ:中で待ち受ける(Listen)👂

コンテナ内でアプリが 3000 を待ち受けても、そのままだと外(ホストやLAN)から見えないことがあります。

Dockerの基本ルールとして、

  • bridgeネットワーク上のコンテナのポートは Dockerホスト(=あなたのPC)や同じネットワークのコンテナからは到達できる でも ホストの外からは到達できない(デフォルト)
  • 外へ出すには -p / --publish を使う

…という整理になっています。(Docker Documentation)

そして Docker Desktop(Windows) では、-p で公開したポートを Docker Desktop 側がホストに受け口を作って、VM内のコンテナへ転送します。(Docker Documentation)

次章(第22章)でここをガッツリやるよ!💪😆


ちょい大事:-p のデフォルト公開範囲(0.0.0.0)⚠️🌍

Docker Desktopの説明では、docker run -pデフォルトで全インターフェース(0.0.0.0)で待ち受けになり、必要なら 127.0.0.1 に絞れる、という挙動が書かれています。(Docker Documentation)

ローカル開発で「外に見せたくない」なら localhost縛りは超大事になるやつです🔒 (ここも次章で実演するね😊)


ミニまとめ:今日の合言葉3つ🧠✨

  1. ポート=アプリの入口番号🚪🔢
  2. LISTENしてるから繋がる👂🔌
  3. **被ったら “別ポート” or “止める”**🔥🧯

1分ミニ課題(理解が爆上がり)📝🎮

  • 30003001 に変えて起動してみる
  • Get-NetTCPConnection で Listen を確認
  • ✅ ブラウザで http://localhost:3001 を開く

AIに投げると強いプロンプト例🤖✨

  • ポートを、マンションの例えで“超やさしく”説明して」🏢
  • EADDRINUSE が出た。Windowsでの原因と直し方を手順で」🧯
  • 「ローカル開発でよく使うポート(API/DB/フロント)を、衝突しにくいルールで提案して」📏

次の第22章では、いよいよ **ホスト→コンテナに“入口を公開”**して、ブラウザから見える化するよ〜!👀🔌🐳