コマンドの打ち間違い以外の詰まり——Desktop が動かない、pull が切れる、権限、キャッシュ、ポート衝突、Compose の version 警告、Windows の改行——を 症状 → 原因 → 対処 で並べたハブです。
参考(Docker 公式)
- Docker Desktop troubleshooting
- Docker Desktop WSL 2 backend on Windows
- File sharing(Windows settings)
- Version and name top-level elements(Compose)
- docker container run — Publish ports / Restart policies
目次
- Docker Desktop が起動していない・応答しない
- WSL2 関連の軽い詰まり
- イメージの pull がタイムアウト・失敗する
- permission denied(権限エラー)
- ビルドキャッシュの噛み合わせが変
- ポートが衝突する
- Compose ファイルの
version警告 - Windows の改行コード(CRLF)でスクリプトが壊れる
- 症状別クイックリファレンス
Docker Desktop が起動していない・応答しない
症状
error during connect: this error may indicate that the docker daemon is not runningopen //./pipe/dockerDesktopLinuxEngine: The system cannot find the file specified.docker ps や docker version を打つだけでこのエラーが出る場合、CLI 自体は問題なく、接続先の Docker Desktop(エンジン)が起動していない ことがほとんどです。
原因
| 原因 | 補足 |
|---|---|
| Docker Desktop アプリを起動していない | タスクトレイにクジラアイコンが無い/グレー |
| 起動直後でエンジンの初期化が終わっていない | 数十秒〜1 分ほどかかることがある |
| 前回の異常終了でエンジンが不整合な状態 | 再起動で解消することが多い |
対処
- タスクトレイの Docker アイコンを確認し、なければ Docker Desktop を起動する
- アイコンが「Starting...」の間は待つ(
docker versionが通るまで) - 直らない場合は Docker Desktop を完全終了 → 再起動
- それでも直らない場合は Windows 自体を再起動(WSL2 / Hyper-V 周りの再初期化になる)
docker versiondocker infodocker info がサーバー側(Server: セクション)まで表示されれば、エンジンとの接続は回復しています。
WSL2 関連の軽い詰まり
Windows 版 Docker Desktop は既定で WSL 2 バックエンド を使います。ここでの軽い詰まりは、多くが「どの WSL ディストリビューションと連携しているか」の設定ズレです。
| 症状 | 原因 | 対処 |
|---|---|---|
wsl --status で Docker 用のディストリビューションが見えない |
Docker Desktop 初回セットアップが未完了 | Docker Desktop を一度起動して初期化を完了させる |
WSL 内のターミナルから docker コマンドが見つからない |
そのディストリビューションで WSL Integration が無効 | Docker Desktop の Settings > Resources > WSL Integration で対象ディストリビューションを有効化 |
Windows のフォルダをコンテナにマウントすると file not found |
WSL 2 モードでは File sharing タブが表示されない(自動共有される仕様) | パスの綴りを確認。Hyper-V モードに切り替えないと File sharing タブ自体は出ない仕様なので、通常は WSL 2 の自動共有をそのまま使う |
| WSL のディスク使用量が肥大化する | 仮想ディスク(.vhdx)が縮小されず溜まっていく |
wsl --shutdown 後、Optimize-VM 相当の圧縮、または Docker Desktop の Troubleshoot 画面から Clean / Purge data |
深い WSL2 の設定(メモリ上限・CPU 割り当てなど)は .wslconfig で調整できますが、学習用途で詰まった場合はまず Docker Desktop を再起動する だけで解消するケースが大半です。
イメージの pull がタイムアウト・失敗する
症状
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeoutError response from daemon: toomanyrequests: You have reached your pull rate limit原因
| 原因 | 見分け方 |
|---|---|
| ネットワークが不安定・オフライン | ブラウザで Docker Hub にアクセスできるか確認 |
| プロキシ環境でエンジンがプロキシを経由できていない | 社内ネットワーク・VPN 使用時に多い |
| Docker Hub の匿名/無料枠のレート制限に達した | toomanyrequests の文字列が出る |
| レジストリ側の一時的な障害 | しばらく待って再実行すると直る場合がある |
対処
# 単純な再試行(一時的な障害はこれで直ることが多い)docker pull nginx:alpine# 認証してレート制限を緩和(Docker Hub アカウントがある場合)docker loginプロキシ環境では、Docker Desktop の Settings > Resources > Proxies にプロキシ URL を設定します。設定後は必ず Docker Desktop を再起動して反映させます。
permission denied(権限エラー)
症状
touch: /app/data/output.txt: Permission deniedEACCES: permission denied, open '/app/node_modules/.cache/...'原因
Linux コンテナ内のプロセスは UID/GID で動作します。ベースイメージによっては非 root ユーザー(例: node イメージの node ユーザー)で実行され、ホストからバインドマウントしたディレクトリの所有者と食い違うと書き込みに失敗します。
| パターン | 原因 |
|---|---|
| コンテナ内が非 root ユーザーで動いている | Dockerfile に USER 指定があるイメージ |
ホストのフォルダをそのまま -v でマウントした |
マウント先のファイル所有者がコンテナ内のユーザーと不一致 |
| ボリューム内に別コンテナが root で書き込んだファイルが残っている | 後から非 root で書けなくなる |
対処
# 一時的にコンテナ側を root で実行して確認する(本番運用では非推奨)docker exec -u root -it <コンテナ名> sh学習・検証用途であれば、Dockerfile 側で明示的に権限を揃える方法が分かりやすいです。
FROM node:22-alpineWORKDIR /appCOPY --chown=node:node . .USER node--chown はコピー時点で所有者を指定できるため、あとから chmod / chown を打つより事故が起きにくいです。
ビルドキャッシュの噛み合わせが変
症状
Dockerfileを書き換えたのにdocker buildの結果が変わらないRUN apt-get updateの結果が古いパッケージ一覧のまま
原因
Docker のビルドは レイヤーごとにキャッシュ され、直前の命令までの内容が変わっていないレイヤーはキャッシュから再利用されます。apt-get update のような「外部の状態を取りに行く」命令は、Dockerfile の記述自体が変わらない限り再実行されない ため、パッケージ一覧が古いままキャッシュされることがあります。
| 症状の原因 | 対処 |
|---|---|
apt-get update の結果が古い |
--no-cache でビルドし直す、または update と install を 1 つの RUN にまとめて依存関係を明示する(この教材の Dockerfile もこの書き方) |
COPY . . 以降が反映されない |
.dockerignore に対象ファイルが含まれていないか確認 |
| 意図的にキャッシュを丸ごと無視したい | docker build --no-cache |
| 特定のレイヤーだけ更新したい | そのレイヤーより前の行の内容を少しでも変える(キャッシュキーが変わる) |
# キャッシュを使わずに完全ビルド(case01 の親ディレクトリで実行)docker build --no-cache -t case01-ubuntu .\case01case01 の Dockerfile が apt-get update && apt-get install ... && rm -rf /var/lib/apt/lists/* を 1 つの RUN にまとめているのは、update と install を別レイヤーに分けると update だけキャッシュされて install 対象が古くなる事故を避けるためです。
ポートが衝突する
症状
Error response from daemon: driver failed programming external connectivityon endpoint ...: Bind for 0.0.0.0:8080 failed: port is already allocated原因
同じホストポートを複数の -p / ports 設定で公開しようとしている、または Windows 側の別プロセス(IIS Express、他の開発サーバーなど)がそのポートを使用中です。
対処
# どのコンテナがそのポートを使っているかdocker ps --filter "publish=8080"# Windows 側で誰がポートを使っているか(PowerShell)Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue# 空いているポートに変更して起動docker run -d --name web-demo2 -p 8081:80 nginxCompose の場合は compose.yaml の ports を書き換えるだけで済みます。
services: web: image: nginx:alpine ports: - "8081:80" # 8080 が衝突する場合はここを変更Compose ファイルの version 警告
症状
WARN[0000] the attribute `version` is obsolete, it will be ignored,please remove it to avoid potential confusion原因
docker-compose.yml の先頭に version: "3.8" のような記述を残していると出る警告です。現在の Compose(Compose Specification)は version キーを見ずに常に最新の仕様として解釈 するため、このキーは後方互換のためだけに存在する obsolete な項目です。
対処
version: の行を削除するだけで警告は消え、動作にも影響しません。
# 変更前version: "3.8"services: ubuntu: build: .# 変更後(Compose Specification 準拠)services: ubuntu: build: .新しく compose.yaml を書くときは、最初から version: を書かない書き方に統一しておくのがシンプルです。プロジェクト名を明示したい場合は代わりに name: トップレベル要素を使います。
name: my-projectservices: ubuntu: build: .Windows の改行コード(CRLF)でスクリプトが壊れる
症状
Windows で作成した entrypoint.sh などのシェルスクリプトを Linux コンテナにコピーして実行すると、次のようなエラーになります。
exec /app/entrypoint.sh: no such file or directory/bin/sh: 1: /app/entrypoint.sh: not foundファイルは存在するのに「無い」と言われるのが典型的な症状です。
原因
Windows のエディタや Git の設定によっては、テキストファイルの改行が CRLF(\r\n) で保存されます。Linux のシェルは \r を含む先頭行(シバン行 #!/bin/sh\r)を正しく解釈できず、実行可能ファイルとして認識できません。
対処
| 対処 | 方法 |
|---|---|
| エディタで LF 保存に統一 | VS Code / Cursor の右下の改行コード表示から CRLF → LF に変更して保存 |
| Git 側で改行を強制 | リポジトリに .gitattributes を置き、シェルスクリプトを LF 固定にする |
| Dockerfile 側で変換する | dos2unix を使う、または sed -i 's/\r$//' をビルド中に実行 |
# .gitattributes の例*.sh text eol=lf# Dockerfile 内で変換する例(dos2unix が使えない最小イメージ向け)COPY entrypoint.sh /app/entrypoint.shRUN sed -i 's/\r$//' /app/entrypoint.sh && chmod +x /app/entrypoint.shこの教材の case01 / case02 の Dockerfile はシェルスクリプトを持たず CMD に配列形式(["sleep", "infinity"])を使っているため、この問題自体は発生しません。独自にシェルスクリプトを追加する場合にだけ注意が必要です。
症状別クイックリファレンス
| 症状のキーワード | 疑うべき箇所 |
|---|---|
docker daemon is not running |
Docker Desktop 未起動・起動中 |
pipe/dockerDesktopLinuxEngine |
エンジン未接続。Desktop を再起動 |
TLS handshake timeout / toomanyrequests |
ネットワーク・レート制限。docker login や再試行 |
Permission denied(コンテナ内書き込み) |
UID/GID 不一致。--chown や -u root で調査 |
| ビルドしても変化がない | キャッシュ。--no-cache で切り離して確認 |
port is already allocated |
ホストポート衝突。docker ps --filter "publish=..." |
the attribute version is obsolete |
古い Compose 記法。version: を削除 |
no such file or directory(実行はできるはずのスクリプト) |
CRLF 改行。LF に変換 |
| WSL 関連の表示がおかしい | WSL Integration 設定・Desktop 再起動 |
Docker のトラブルは「エンジン自体の問題」「ネットワークの問題」「ファイル/権限の問題」「キャッシュの問題」「設定記法の問題」の 5 系統に大別できます。エラーメッセージの中の固有名詞(daemon、permission、cache、port、version など)に着目すると、どの系統かの見当が早くつきます。