第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👇
- 別ポートにする(例:3001)
- 先に使ってるプロセスを止める✋
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つ🧠✨
- ポート=アプリの入口番号🚪🔢
- LISTENしてるから繋がる👂🔌
- **被ったら “別ポート” or “止める”**🔥🧯
1分ミニ課題(理解が爆上がり)📝🎮
- ✅
3000を3001に変えて起動してみる - ✅
Get-NetTCPConnectionで Listen を確認 - ✅ ブラウザで
http://localhost:3001を開く
AIに投げると強いプロンプト例🤖✨
- 「ポートを、マンションの例えで“超やさしく”説明して」🏢
- 「
EADDRINUSEが出た。Windowsでの原因と直し方を手順で」🧯 - 「ローカル開発でよく使うポート(API/DB/フロント)を、衝突しにくいルールで提案して」📏
次の第22章では、いよいよ **ホスト→コンテナに“入口を公開”**して、ブラウザから見える化するよ〜!👀🔌🐳