Docker

うまくいかないとき集

11

コマンドの打ち間違い以外の詰まり——Desktop が動かない、pull が切れる、権限、キャッシュ、ポート衝突、Compose の version 警告、Windows の改行——を 症状 → 原因 → 対処 で並べたハブです。

参考(Docker 公式)


目次

  1. Docker Desktop が起動していない・応答しない
  2. WSL2 関連の軽い詰まり
  3. イメージの pull がタイムアウト・失敗する
  4. permission denied(権限エラー)
  5. ビルドキャッシュの噛み合わせが変
  6. ポートが衝突する
  7. Compose ファイルの version 警告
  8. Windows の改行コード(CRLF)でスクリプトが壊れる
  9. 症状別クイックリファレンス

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 psdocker version を打つだけでこのエラーが出る場合、CLI 自体は問題なく、接続先の Docker Desktop(エンジン)が起動していない ことがほとんどです。

原因

原因 補足
Docker Desktop アプリを起動していない タスクトレイにクジラアイコンが無い/グレー
起動直後でエンジンの初期化が終わっていない 数十秒〜1 分ほどかかることがある
前回の異常終了でエンジンが不整合な状態 再起動で解消することが多い

対処

  1. タスクトレイの Docker アイコンを確認し、なければ Docker Desktop を起動する
  2. アイコンが「Starting...」の間は待つ(docker version が通るまで)
  3. 直らない場合は Docker Desktop を完全終了 → 再起動
  4. それでも直らない場合は Windows 自体を再起動(WSL2 / Hyper-V 周りの再初期化になる)
docker versiondocker info

docker 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 timeout
Error 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 denied
EACCES: 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 でビルドし直す、または updateinstall を 1 つの RUN にまとめて依存関係を明示する(この教材の Dockerfile もこの書き方)
COPY . . 以降が反映されない .dockerignore に対象ファイルが含まれていないか確認
意図的にキャッシュを丸ごと無視したい docker build --no-cache
特定のレイヤーだけ更新したい そのレイヤーより前の行の内容を少しでも変える(キャッシュキーが変わる)
# キャッシュを使わずに完全ビルド(case01 の親ディレクトリで実行)docker build --no-cache -t case01-ubuntu .\case01

case01 の Dockerfile が apt-get update && apt-get install ... && rm -rf /var/lib/apt/lists/*1 つの RUN にまとめているのは、updateinstall を別レイヤーに分けると 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 nginx

Compose の場合は compose.yamlports を書き換えるだけで済みます。

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 の右下の改行コード表示から CRLFLF に変更して保存
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 系統に大別できます。エラーメッセージの中の固有名詞(daemonpermissioncacheportversion など)に着目すると、どの系統かの見当が早くつきます。

シェア