|
| 1 | +# Prisma Studio: Docker compose で localhost refused になる原因と対処方法 |
| 2 | + |
| 3 | +## 概要 |
| 4 | + |
| 5 | +Docker Compose(devcontainer なし)で `pnpm db:studio`(= `prisma studio`)を起動すると、ホストのブラウザで `http://localhost:5555` が `localhost refused to connect` になる。 |
| 6 | + |
| 7 | +本件は **Prisma Studio 自体の不具合ではなく、コンテナのポート公開(publish)と VS Code のポート転送(port forward)の違い**によって発生する。 |
| 8 | + |
| 9 | +## 結論 |
| 10 | + |
| 11 | +- Prisma Studio は `web` コンテナ内では起動している。 |
| 12 | +- しかし `compose.yaml` の `web.ports` に `5555` が無いため、ホストの `localhost:5555` に到達できない。 |
| 13 | +- VS Code Dev Containers では port forward が効くため、`compose.yaml` に `5555` の publish が無くてもアクセスできて「動いているように見える」。 |
| 14 | + |
| 15 | +## 背景(今回の構成) |
| 16 | + |
| 17 | +- `package.json` |
| 18 | + - `db:studio`: `pnpm exec prisma studio` |
| 19 | +- `compose.yaml` |
| 20 | + - `web.ports`: `5173:5173` のみ(Studio の `5555` は公開されていない) |
| 21 | +- `.devcontainer/devcontainer.json` |
| 22 | + - port forward を使える(VS Code がコンテナ内ポートをローカルへ転送可能) |
| 23 | + |
| 24 | +## 症状と切り分け |
| 25 | + |
| 26 | +### 1) コンテナ内では起動しているか |
| 27 | + |
| 28 | +```bash |
| 29 | +# コンテナ内の待受確認 |
| 30 | +docker compose exec -T web sh -lc "ss -ltnp | grep ':5555' || true" |
| 31 | + |
| 32 | +# コンテナ内から疎通 |
| 33 | +docker compose exec -T web curl -I http://localhost:5555 |
| 34 | +``` |
| 35 | + |
| 36 | +コンテナ内疎通が成功するなら、Studio は起動している。 |
| 37 | + |
| 38 | +### 2) ホストへ公開されているか(主原因) |
| 39 | + |
| 40 | +```bash |
| 41 | +# ホストに publish されているか |
| 42 | +docker compose port web 5555 |
| 43 | + |
| 44 | +# ホストから疎通 |
| 45 | +curl -I http://localhost:5555 |
| 46 | +``` |
| 47 | + |
| 48 | +- `docker compose port web 5555` が `no port 5555/tcp ...` の場合、ホストからは繋がらない。 |
| 49 | +- その状態でブラウザを開くと `localhost refused to connect` になり得る。 |
| 50 | + |
| 51 | +## VS Code / devcontainer で動く理由 |
| 52 | + |
| 53 | +VS Code Dev Containers は、Dockerの `ports:` で publish していなくても、VS Code 側の **port forward** でローカルに転送できる。 |
| 54 | + |
| 55 | +- そのため devcontainer では `http://localhost:5555` が開ける。 |
| 56 | +- 同じ `compose.yaml` でも、「Dockerのみ(VS Codeなし)」だと port forward が無いので開けない。 |
| 57 | + |
| 58 | +## 再実行時に 5556 / 5557 のようにポート番号がインクリメントされる問題 |
| 59 | + |
| 60 | +### 原因 |
| 61 | + |
| 62 | +`pnpm db:studio` を複数回実行すると、既に `:5555` が使用中のため Prisma が空きポートに退避し、`5556`, `5557` で起動する。 |
| 63 | + |
| 64 | +よくあるパターン: |
| 65 | + |
| 66 | +- `docker compose exec web ...` で起動した Studio がコンテナ内に残る |
| 67 | +- ホスト側のターミナルを閉じても、コンテナ内プロセスは継続 |
| 68 | +- 次回起動で `EADDRINUSE` → 別ポートを選択 |
| 69 | + |
| 70 | +### 回避策(推奨:常に 5555 固定) |
| 71 | + |
| 72 | +起動前に既存 Studio を止め、`--port 5555` を明示して起動する。 |
| 73 | + |
| 74 | +```bash |
| 75 | +# 1) 既存Studioが居たら止める(居なくてもOK) |
| 76 | +docker compose exec -T web sh -lc "pkill -f 'prisma.*studio' || true" |
| 77 | + |
| 78 | +# 2) 5555 が空いていることを確認 |
| 79 | +docker compose exec -T web sh -lc "ss -ltnp | grep ':5555' || true" |
| 80 | + |
| 81 | +# 3) Studio起動(ポート固定) |
| 82 | +docker compose exec web pnpm exec prisma studio --port 5555 |
| 83 | +``` |
| 84 | + |
| 85 | +## Prisma Studio の停止方法(Docker内) |
| 86 | + |
| 87 | +### ざっくり止める(推奨) |
| 88 | + |
| 89 | +```bash |
| 90 | +docker compose exec -T web sh -lc "pkill -f 'prisma.*studio' || true" |
| 91 | +``` |
| 92 | + |
| 93 | +- 終了コード `143`(SIGTERM)は正常系のことが多い。 |
| 94 | + |
| 95 | +### 状態確認 |
| 96 | + |
| 97 | +```bash |
| 98 | +docker compose exec -T web sh -lc "ss -ltnp | grep ':555[5-9]' || true" |
| 99 | +docker compose exec -T web sh -lc "ps aux | grep -E 'prisma.*studio' | grep -v grep || true" |
| 100 | +``` |
| 101 | + |
| 102 | +## 運用方針メモ(Dockerのみでブラウザから開きたい) |
| 103 | + |
| 104 | +- Dockerのみ運用でホストのブラウザから開くなら、`compose.yaml` の `web.ports` に `5555:5555` を publish する必要がある。 |
| 105 | +- publish するとホストの `:5555` を占有するため、ホスト上で別アプリが `:5555` を使っている場合はポート競合に注意。 |
| 106 | + |
| 107 | +## Q&A |
| 108 | + |
| 109 | +### Q. `compose.yaml` に `5555:5555` を追加すれば良い? |
| 110 | + |
| 111 | +A. Dockerのみ(devcontainerなし)でホストブラウザから `localhost:5555` を開きたいなら妥当。 |
| 112 | + |
| 113 | +### Q. devcontainer でも明示した方が良い? |
| 114 | + |
| 115 | +A. 必須ではない(VS Code の port forward で動く)。ただし、Dockerのみ運用と挙動を揃えたい/VS Code 以外からもアクセスしたい場合は明示しておくと再現性が上がる。 |
| 116 | + |
| 117 | +### Q. publish すると VS Code 利用に悪影響は? |
| 118 | + |
| 119 | +A. 基本的に大きな悪影響は無い。注意点は「ホストの `:5555` 競合」だけ。 |
0 commit comments