第22章:ポート公開(ホスト→コンテナ)で見える化👀🔌
この章はひとことで言うと—— **「コンテナの中で動いてるWeb/APIを、Windowsのブラウザで見えるようにする」**回です😆✨
1) まず超ざっくりイメージ🧠💡
- コンテナの中:アプリが
3000とか80で待ち受けしてる(でも外からは見えない) - Windows側:ブラウザは
http://localhost:XXXXにアクセスしたい - そこで ポート公開(publish) をして Windowsのポート → コンテナのポート をつなぎます🔌
例:8080:80
8080= Windows側(ホスト)の入口🚪80= コンテナ側(アプリが聞いてるポート)📦
この考え方は公式ドキュメントでも同じ説明です。(Docker Documentation)
2) いきなり動くやつで体感しよう🎮🐳
まずは「とにかく見えた!」を作るのが最強です💪😄
公式の例と同じく、ポートを -p で公開します。(Docker Documentation)
docker run -d --name port-demo -p 8080:80 docker/welcome-to-docker
✅ できたらブラウザでこれ👇
http://localhost:8080
Docker Desktopの画面でも、コンテナの「Port(s)」にリンクが出ます(公式手順でも案内あり)。(Docker Documentation)
3) 「公開できてるか」確認コマンド3点セット✅🕵️♂️
A. いまの公開状況を見る👀
docker ps
PORTS 欄に 0.0.0.0:8080->80/tcp みたいなのが出ていればOK👍
(-P でランダムポートになった例も公式に載ってます)(Docker Documentation)
B. コンテナ名で「どのポート出してる?」を見る🔎
docker port port-demo
これは公式のCLIリファレンスにもある確認方法です。(Docker Documentation)
C. 実際にアクセスしてみる🌐
PowerShellならこれが楽👇(JSON返すAPIでも見やすい)
irm http://localhost:8080
4) Todo APIに当てはめるとこうなる📝✨
あなたのTodo APIが コンテナ内で 3000 で待ち受けしてるとします(よくあるやつ)🙂
Windows側では http://localhost:3001 で見たいとき:
docker run -d --name todo-api -p 3001:3000 your-todo-api-image
3001(Windows側)→3000(コンテナ側)- ブラウザ:
http://localhost:3001
ポイント:コンテナ内アプリは 0.0.0.0 で listen してる必要があることが多いです(127.0.0.1 だけで待つと外から来れない)😵
※この「コンテナ内localhost罠」は次の章でガッツリやるやつです🪤
5) Compose版:ports: で同じことをする📦📦
docker run -p と同じことを compose.yaml で書くとこう👇
(公式の “publishing ports” 手順でも ports: - 8080:80 が紹介されています)(Docker Documentation)
services:
app:
image: docker/welcome-to-docker
ports:
- "8080:80"
起動👇
docker compose up -d
停止&片付け👇
docker compose down
6) よく使う ports の書き方パターン集📚✨
Composeの公式リファレンスに沿って、実用でよく使う形だけ抜き出します。(Docker Documentation)
パターンA:いちばん基本
"HOST_PORT:CONTAINER_PORT"
ports:
- "3001:3000"
パターンB:ホスト側ポートを省略して、空いてるやつを自動で使う🎲
"CONTAINER_PORT"だけ書くと、ホスト側は自動割り当てになります。(Docker Documentation)
ports:
- "3000"
どこに割り当てられたか確認👇
docker compose ps
docker compose port app 3000
docker compose port は公式CLIにもあるコマンドです。(Docker Documentation)
パターンC:localhost(127.0.0.1)に縛って安全寄り🔒
"127.0.0.1:HOST:CONTAINER"これで「同じPCからだけアクセス可」にしやすいです。(Docker Documentation)
ports:
- "127.0.0.1:3001:3000"
7) EXPOSE と -p は別モノだよ⚠️📌
ここ、初心者がめっちゃ混乱しがち😅
EXPOSE:「このアプリはこのポート使うよ」っていう宣言(目印)-p/ports::実際に外へ公開する設定
EXPOSE だけじゃ公開されません。-P(publish-all)を使うと、EXPOSEされたポートをまとめてランダム公開できます。(Docker Documentation)
docker run -d -P --name autoport nginx
docker ps
PORTS に 0.0.0.0:54772->80/tcp みたいに ホスト側がランダムで出ます🎲(Docker Documentation)
8) ちょい大事:公開は基本「外にも開く」ので注意🚨🌍
Dockerの公式ドキュメントでは、ポート公開はデフォルトだと外部からも到達し得るので危ない、だから必要なら 127.0.0.1 に縛ろう、とはっきり書かれています。(Docker Documentation)
さらに細かい話として、Docker Engine 28.0.0 より前は条件によって「localhostに公開したはずが同一L2から到達される可能性」が注意書きされています(かなりニッチだけど、最新情報として知っておく価値あり)😳(Docker Documentation)
9) Windowsで「localhostで見える」理由を軽く理解🪟🧠
Docker Desktopでは、-p で公開すると
Windows側で待ち受け → VM内のコンテナに転送 という流れになります。
公式のNetworkingページに仕組みがまとまってます。(Docker Documentation)
10) AIに手伝わせると爆速🤖⚡
コピペして使えるプロンプト例👇(短くて実用系)
- 「
docker psのPORTSがこう出てる。http://localhost:xxxxで開けない原因候補を3つと確認コマンドを出して」 - 「Composeの
portsを 開発用は localhost 縛り、本番想定は 外部アクセス可 で書き分けたい。yaml例を2つ出して」 - 「
HOST:CONTAINERの考え方を、マンションの例えで説明して」
まとめ🎉
- ポート公開は Windowsの入口ポート と コンテナ内の待受ポート をつなぐだけ🔌
docker run -p HOST:CONTAINER/ Composeのports: - "HOST:CONTAINER"が基本形(Docker Documentation)- localhost縛り(127.0.0.1) は安全寄りでおすすめ🔒(Docker Documentation)
- 見えないときは
docker ps/docker port/docker compose portで事実確認👀(Docker Documentation)
次の第23章で「ポート被り」「起動してない」「Firewall」みたいな “よくある失敗”の倒し方を、わざと事故らせながら覚えます🔥😆