Docker Composeの「network not found」エラーを修正する: Error response from daemon: network myapp_default not found

beginner🐳 Docker2026-03-18| Docker Engine 20.x+, Docker Compose v2.x, Linux / macOS / Windows (WSL2)

Error Message

Error response from daemon: network myapp_default not found
#docker#docker-compose#ネットワーク#compose

エラーの内容

Error response from daemon: network myapp_default not found

このエラーは、以前に停止したコンテナに対して docker compose start または docker compose up を実行した際に発生します。コンテナが参加しようとするネットワークをDockerが見つけられない場合に表示されます。

発生原因

Docker Composeはプロジェクトごとに専用のネットワークを作成します。デフォルトの名前は {project}_default です。このネットワークが孤立したり削除されたりする状況は以下の通りです:

  • docker compose down(ネットワークも削除される)を実行した後、docker compose up ではなく docker compose start で再起動しようとした場合
  • 誰かが手動でDockerネットワークを削除した場合: docker network prune
  • プロジェクトディレクトリの名前を変更した場合 — プロジェクト名が変わると、期待されるネットワーク名と一致しなくなる
  • 別のツールやスクリプトが実行間に未使用のネットワークをクリーンアップした場合

コンテナは停止した状態で残っています。どのネットワークに属しているかは記憶していますが、そのネットワーク自体が削除されています。

手順ごとの修正方法

方法1: すべて再作成する(最も手軽)

コンテナの状態を保持する必要がない場合は、一度すべて削除してから再起動します:

docker compose down
docker compose up -d

docker compose down は停止中のコンテナとネットワークをきれいに削除します。docker compose up は新しいネットワークを作成してすべてを起動します。これで90%のケースは解決します。

方法2: 不足しているネットワークだけを再作成する

既存のコンテナを保持したままネットワークだけを修正したい場合は、手動で作成します:

# 期待されるネットワーク名を確認する
docker compose config | grep -A5 'networks'

# 実際に存在しないことを確認する
docker network ls | grep myapp

# ネットワークを作成する
docker network create myapp_default

その後、サービスを起動します:

docker compose start

ネットワーク名は {project_name}_default というパターンに従います。プロジェクト名は通常ディレクトリ名です。以下のコマンドで確認できます:

docker compose config --format json | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('name',''))"

または、エラーメッセージを確認するだけでも構いません — どのネットワークが不足しているか(この例では myapp_default)が正確に表示されています。

方法3: compose.yamlにネットワークを明示的に定義する

このエラーが繰り返し発生して困っていますか?compose.yamlにネットワークを固定して、ライフサイクルを自分で管理しましょう:

services:
  web:
    image: nginx
    networks:
      - app-net
  db:
    image: postgres
    networks:
      - app-net

networks:
  app-net:
    name: myapp_default   # 固定名。ディレクトリ名を変更しても影響なし
    driver: bridge

name を固定することで、プロジェクトディレクトリの名前を変更しても何も壊れません。プロジェクトの場所に関わらず、ネットワーク名は安定したままです。

方法4: 外部ネットワークを使用する

複数のComposeスタックが同じネットワークを共有している場合は、外部ネットワークとして宣言します:

# 一度だけ手動で作成する
docker network create shared_net

# compose.yaml内での設定
networks:
  shared_net:
    external: true

external: true を指定すると、updown 時にComposeはそのネットワークに触れません — ライフサイクルは別途管理します。共有データベースやTraefikのようなリバースプロキシに適した方法です。

修正の確認

# ネットワークが存在することを確認する
docker network ls | grep myapp_default

# コンテナがネットワークに接続されていることを確認する
docker network inspect myapp_default

# サービスが起動していることを確認する
docker compose ps

docker network inspect の結果で Containers セクションを確認してください。サービスが起動したら、すべてのコンテナがそこに表示されるはずです。

補足情報

stop ではなく docker compose down を使う

docker compose stop はコンテナを一時停止しますが、コンテナとネットワーク参照はそのまま残ります。docker compose start で問題なく再開できます。問題が起きるのは、停止と起動の間にネットワークが消えてしまう場合です — 主に docker network prune が原因です。手動でネットワークをクリーンアップした後は、start ではなく docker compose up を使ってください。

ディレクトリ名の変更に注意

プロジェクトフォルダを移動したり名前を変更したりすると(例: mv myapp myapp-v2)、ComposeのプロジェクトIDが変わり、期待されるネットワーク名が壊れます。停止中のコンテナは myapp_default を参照し続けますが、Composeは myapp-v2_default を探すようになります。.env ファイルでプロジェクト名を固定しましょう:

# .env
COMPOSE_PROJECT_NAME=myapp

ネットワークのサブネット競合をデバッグする

多くのスタックが動作している環境では、サブネットの競合によりDockerがネットワークの再作成に失敗することがあります。docker compose up がネットワーク作成でハングする場合は、まず既存のネットワークとそのサブネットを確認してください。ToolCraftのSubnet Calculatorを使えば、CIDRの範囲を計算して重複を避けるのが簡単になります。compose.yamlにサブネットをハードコードする方法もあります:

networks:
  app-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16

ネットワークリセット後に孤立したコンテナをクリーンアップする

# 有効なネットワークを持たなくなったコンテナを削除する
docker compose down --remove-orphans
docker compose up -d

--remove-orphans は、composeファイルに存在しないサービスのコンテナを削除します。大規模なネットワークリセットの後にこのコマンドを実行して、クリーンな状態から始めてください。

Related Error Notes