5秒でできる解決策
警告をすぐに消したいですか?スタックを起動する際に --remove-orphans フラグを追加するだけです。これにより、YAMLファイルで定義されなくなったコンテナを削除するようDockerに指示できます。
docker compose up -d --remove-orphans
新しいサービスを起動せずに整理したい場合は、同じフラグを指定して down コマンドを実行します:
docker compose down --remove-orphans
なぜDockerは警告を出すのか?
Docker Composeは「プロジェクト名」を使用して、作成したすべてのコンテナを追跡します。この警告は、docker-compose.yml に記載されていないものの、プロジェクトに属しているコンテナをDockerが見つけたときに発生します。アイドル状態の Alpine ベースのコンテナでも 5MB〜10MB の RAM を消費し、忘れ去られたデータベースなら理由もなく 200MB 以上のメモリを占有し続ける可能性があります。
多くの開発者が以下の3つのシナリオでこの問題に直面します:
- サービスの名称変更:
db:をpostgres-db:に変更した場合。古いdbコンテナはシステム内で「ゴースト」として残ります。 - スタックの削減: マネージドサービスや別のツールに移行したために、
redisやmailhogなどのサービスを削除した場合。 - Gitブランチの切り替え: 6つのサービスで構成される複雑な機能ブランチから、2つのサービスしか使用しない
mainブランチに戻った場合。残りの4つのコンテナは孤立した状態(orphan)になります。
問題を解決する3つの方法
方法1:標準フラグ(日常的な使用に最適)
通常、これらのコンテナは削除したいはずです。これらは docker ps の出力を乱雑にし、時には 8080 や 5432 などのポートを占有して新しいサービスの開始を妨げることがあります。up コマンドにフラグを追加するのが最も効率的なワークフローです。
# 一括でクリーンアップして起動
docker compose up -d --remove-orphans
内部的には、Dockerは不正なコンテナのIDを特定し、現在の設定を進める前にそれらに対して docker rm -f を実行します。
方法2:削除前に調査する
保存されていないデータが含まれている可能性がある場合は、すぐにコンテナを削除しないでください。警告に Found orphan containers (legacy_api_service) と表示されている場合は、まず中身を確認しましょう。
# 孤立したコンテナがまだ実行中か確認
docker ps -a --filter "name=legacy_api_service"
# 重要な処理を行っていなかったかログを確認
docker logs legacy_api_service
# 確認が取れたら手動で削除
docker rm -f legacy_api_service
この手動のアプローチは、サービスの定義を誤って削除してしまい、コンテナのエフェメラルレイヤーに保存されていたデータベースのバックアップを取り忘れた場合などに非常に役立ちます。
方法3:プロジェクト名の競合を修正する
デフォルトでは、Dockerはフォルダ名をプロジェクト名として使用します。もし /app という名前の異なる2つのプロジェクトが別々のフォルダにある場合、Dockerはそれらのコンテナを混同してしまいます。その結果、全く別のプロジェクトのコンテナを「クリーンアップ」しようとする可能性があります。
これを解決するには、.env ファイルで一意のプロジェクト名を設定します:
# .env ファイル
COMPOSE_PROJECT_NAME=ecommerce_v2_staging
あるいは、CLIコマンドで -p フラグを使用して、環境を分離した状態に保ちます:
docker compose -p unique_project_name up -d --remove-orphans
クリーンアップの確認
修正を実行した後、環境を確認してください。docker compose ps を実行してリストが整理されているか確認します。出力は docker-compose.yml の内容と正確に一致するはずです。再度 up を実行した際、あの煩わしい黄色の警告テキストが消えていれば成功です。
プロのヒント:エイリアスを使用する
毎回長いコマンドを入力するのが面倒な場合は、.zshrc や .bashrc にエイリアスを追加しましょう。私はデフォルトで作業環境をクリーンに保つためにこれを使用しています:
alias dcup='docker compose up -d --remove-orphans'
隠れたデータに関する注意
コンテナを削除しても、そのボリュームは自動的には削除されません。孤立したサービスが永続ストレージ用に名前付きボリューム(named volume)を使用していた場合、そのデータは依然として NVMe や SSD の容量を占有しています。未使用のボリュームによってどれだけのスペースが失われているかを確認するには、次を実行します:
docker system df
接続されていないボリュームを一括削除したい場合は、docker volume prune を使用します。ただし、このコマンドは破壊的であり、現在アクティブなコンテナに接続されていないすべてのボリュームを削除するため、注意して実行してください。

