docker『Volume is Not Available』の原因と対処法

docker『Volume is Not Available』の原因と対処法

コンテナ起動時に「Volume is Not Available」「volume … not found」「failed to mount local volume」などのエラーで落ちる場合、名前付きボリュームの未作成・ドライバや外部ストレージの不調・NFS/クラウドボリュームの未アタッチ・Docker Desktop/WSL2の共有設定不備などが原因になる。どの種類のボリューム(named / bind / 外部ドライバ)が、どの層(Docker / OS / ネットワーク / ストレージ)で利用不可になっているかを切り分けることが対処の近道になる。

エラーの意味と主な発生条件を整理する

「Volume is Not Available」系のエラーは、主に次のようなときに発生する。

# 典型的なメッセージ例
Error response from daemon: 
  create mydata: VolumeDriver.Mount: 
  Volume mydata is not available

Error response from daemon:
  failed to mount local volume: volume not found

docker: Error response from daemon: 
  could not find volume "mydata" with driver "local".

failed to initialize logging driver: 
  file '/var/lib/docker/volumes/logs/_data/app.log' is not available

発生しやすい条件は次の通り。

  • 名前付きボリュームが存在しない/削除されている。
  • 外部ボリュームドライバ(nfs, local-persist, rexray, cloud系など)が利用できない。
  • NFSやクラウドディスクが未マウント/ネットワーク切断/認証エラー。
  • Docker Desktop/WSL2で、共有フォルダやボリュームへのアクセス権限がない。
  • Swarm や Compose で external: true を指定しているが、対象ボリュームが事前に作られていない。

まずボリュームの一覧と状態を確認する

最初に「そのボリュームは本当に存在するのか」「どのドライバか」を確認する。

# すべてのボリューム一覧
docker volume ls

# 対象ボリュームの詳細
docker volume inspect mydata

# ボリュームを利用しているコンテナを確認
docker ps -a --filter volume=mydata --format 'table {{.Names}}\t{{.Status}}'
  • volume inspect で「Driver」「Mountpoint」「Labels」「Options」を確認する。
  • 存在しない場合は create するか、Compose で自動作成させる設定になっているかを確認する。

名前付きボリュームが存在しない・削除されている場合

単純に「ボリュームがまだない/消してしまった」ケース。

# ボリューム作成
docker volume create mydata

# ボリュームを使ってコンテナ起動
docker run -d --name app \
  -v mydata:/var/lib/app \
  myorg/app:1.0

docker-compose.yml で定義する場合。

services:
  app:
    image: myorg/app:1.0
    volumes:
      - mydata:/var/lib/app

volumes:
  mydata: {}    # localドライバのnamed volumeを自動作成
  • external: true を指定しているのに volume create を行っていないと、「Volume is not available」扱いになるので注意。

external ボリューム(Swarm/Compose)と事前作成の必要性

外部定義のボリュームを使う場合、事前に作っておく必要がある。

# docker-compose.yml の例
volumes:
  mydata:
    external: true

# 事前にボリュームを作成
docker volume create mydata

# その後に compose up
docker compose up -d

Swarm で external volume を使う例。

docker volume create --driver rexray mydata

docker service create \
  --name app \
  --mount type=volume,source=mydata,target=/var/lib/app \
  myorg/app:1.0
  • external: true のボリューム名が間違っていると「Volume is not available」となるので、名前の綴りも確認する。

ローカルドライバ & バインドマウントとの混同を避ける

named volume と bind mount を混ぜて設定すると「意図しない場所」を見に行ってエラーになることがある。

# named volume の例
docker run -v mydata:/var/lib/app myorg/app:1.0

# bind mount の例(ホストディレクトリを指定)
docker run -v /opt/appdata:/var/lib/app myorg/app:1.0

docker-compose.yml での混同例。

# NG: volumesセクションでホストパスをnamed volumeとして認識させてしまう例
volumes:
  /opt/appdata: {}

# OK: services側の volumes だけにホストパスを書き、volumes: 定義にはnamed volumeだけを書く
services:
  app:
    volumes:
      - /opt/appdata:/var/lib/app

volumes:
  mydata: {}
  • 「Volume is Not Available」が出ているのが named volume なのか bind mount なのかをログと設定から切り分ける。

NFS/リモートストレージボリュームが未マウント・到達不可の場合

ドライバが nfs や他のリモートストレージを使う設定になっている場合、そのマウント先が利用できないとエラーになる。

# NFSをlocal driver optionsで使う例
docker volume create \
  --driver local \
  --opt type=nfs \
  --opt o=addr=nfs.example.com,nolock,soft,rw \
  --opt device=:/export/data \
  nfsdata

トラブル時には以下を確認する。

# ホストからNFSサーバに到達できるか
ping nfs.example.com

# mountコマンドやcat /etc/fstab の内容を確認
mount | grep nfs
  • NFSサーバ側のエクスポート設定・権限・ネットワーク制限で弾かれていないかを確認する。
  • VPN・Firewall・セキュリティグループでブロックされていると、Volume is Not Available 相当のエラーになる。

Docker Desktop / WSL2 / macOS / Windows 特有のボリューム問題

Docker Desktop や WSL2 上では、ボリュームの実体はVM/WSL内のファイルシステムにあり、ホスト側とはレイヤが分かれている。

# Desktop の設定(GUI操作)
# Settings → Resources → File Sharing でホストディレクトリの共有を許可
  • 共有外のディレクトリを bind mount しようとすると、「Volume is Not Available」「Mounts denied」系エラーが出る。
  • WSL2 の場合、/mnt/c/… 経由でWindows側のパスを参照する必要がある。
# WSL2 内からの例
docker run -v /mnt/c/Users/user/data:/data alpine ls /data

Docker DesktopバックエンドのVMのディスク容量が枯渇しても、ボリュームが利用不可になることがあるため、不要なボリュームやイメージをクリーンアップする。

# 未使用ボリュームを削除
docker volume prune

# 全体的な使用状況確認
docker system df -v

権限・SELinux・ファイルシステムレベルでの「利用不可」

ボリューム自体は存在するが、権限やSELinuxラベルのせいで「使えない」状態になっていることもある。

# ボリュームのMountpointを確認
docker volume inspect mydata \
  --format '{{ .Mountpoint }}'

# Mountpointの権限を見る
sudo ls -ld /var/lib/docker/volumes/mydata/_data

SELinuxを有効にしている環境では、local driverでNFSや特定のディレクトリをマウントするときにコンテナからアクセスできず、「実質的に利用不可」となるケースがある。

# :z/:Z オプションでラベルを付与したbind mount
docker run -v /opt/appdata:/var/lib/app:Z myorg/app:1.0
  • ボリュームを作り直した場合は、Mountpointのパス/ラベルも再確認する。

ボリュームドライバ自体がロードされていない/壊れている場合

サードパーティドライバ(rexray, local-persist, cloud vendor pluginsなど)が必要なボリュームは、そのドライバがインストールされていなければ利用できない。

# どのドライバが使えるか
docker info | sed -n '/Plugins:/,/Runtimes:/p'

# 特定ドライバを指定している例
docker volume create --driver rexray/mycloud mycloudvol
  • プラグインがアンインストールされた/バージョン不整合になった場合、「Volume is Not Available」風のエラーになる。
  • ドライバのインストール手順を再確認し、Docker再起動後に再度 volume create / inspect で状態を確認する。

ボリュームの復旧と安全な再作成フロー

壊れた/不整合なボリュームを、データを守りつつ復旧するための基本パターン。

# 1) Mountpointを確認
mp=$(docker volume inspect mydata --format '{{ .Mountpoint }}')
echo "$mp"

# 2) 中身をバックアップ(ホスト側で)
sudo tar czf /backup/mydata-backup.tgz -C "$mp" .

# 3) コンテナを止めてボリュームを作り直し、バックアップから復元
docker stop app || true
docker rm app || true
docker volume rm mydata

docker volume create mydata
mp_new=$(docker volume inspect mydata --format '{{ .Mountpoint }}')

sudo tar xzf /backup/mydata-backup.tgz -C "$mp_new"
  • 単に volume rm してしまうとデータが消えるため、ビジネスデータが入っているボリュームは必ずバックアップを取ってから操作する。

NG→OK 早見表(よくあるパターン別の修正例)

# 1) external volume が未作成
# NG: docker-compose.yml
volumes:
  mydata:
    external: true

# OK: 事前に作成
docker volume create mydata
docker compose up -d

# 2) named volume と bind mount の取り違え
# NG:
docker run -v /data:/var/lib/app myorg/app:1.0   # /data が存在しない
# OK:
mkdir -p /data
docker run -v /data:/var/lib/app myorg/app:1.0

# 3) Docker Desktopで共有外ディレクトリ
# NG: File Sharingに登録していないパスをbind mount
docker run -v /non/shared/path:/data myorg/app:1.0
# OK: File Sharingに追加 or 共有ディレクトリ配下を使用

# 4) NFSボリュームの到達不可
# NG: NFSサーバ停止中のまま起動
# OK: NFSサーバを起動し、ネットワーク/エクスポート設定を再確認

チェックリスト(上から順に潰す)

1) docker volume ls / inspect で、そのボリュームが本当に存在し、Driver/Mountpointが期待通りか
2) external: true を使っている場合、事前に volume create してあるか
3) named volume と bind mount を混同していないか(ホストパスかボリューム名かを確認したか)
4) NFSやクラウドボリュームなら、サーバ/ストレージ側がオンラインで、ネットワーク/認証が正しく通っているか
5) Docker Desktop/WSL2 なら、File Sharing設定や /mnt/c/... など、環境固有の共有設定を確認したか
6) ボリュームのMountpointの権限・SELinuxラベル・ファイルシステムの状態に問題がないか
7) 使用しているボリュームドライバがインストールされ、docker info に表示されているか
8) データが重要なボリュームはバックアップを取った上で、必要なら作り直し+復元でクリーンな状態に戻したか