停止中のDockerコンテナが削除できない

システムトラブルならお任せ下さい

停止中のDockerコンテナを docker rm で削除しようとしたが、エラーが発生して削除できない問題に遭遇したので対応方法を書いておきます。

はじめに

先日Dockerコンテナがいつの間にか落ちているという事態に遭遇しました。
原因は不明。
再起動が必要なコンテナ等の対応を行い、一部の落ちたコンテナは放置してあったのですが、不要なコンテナを削除しようとした際にエラーが発生して削除ができませんでした。
すぐに解決には至ったのですが、一応対応方法を書いておきます。
 

環境

環境は以下
CentOS上にDockerの利用環境を作る で書いた構築した環境です。

OS CentOS 6.7
docker docker-io-1.6.2-3.el6.x86_64

事象

停止中のコンテナを削除するために、以下コマンドを実行したところエラーが発生しました。

# docker rm `docker ps -a -q`
Error response from daemon: Conflict, You cannot remove a running container. Stop the container before attempting removal or use -f
89e88321c9b0
Error response from daemon: Cannot destroy container 34232dc03587: Driver devicemapper failed to remove root filesystem 34232dc035872c0c297601b97b1676cfc82bb06e9c071f9a99f62541e3ccba08: Device is Busy
Error response from daemon: Cannot destroy container d667b81103a1: Driver devicemapper failed to remove root filesystem d667b81103a1b56f9f698da274a61c4b959c41192fa99af8822f076be93520dd: Device is Busy
FATA[0035] Error: failed to remove one or more containers

今までは発生した事がないエラーだったので、上述の原因不明で落ちたために発生したものと思われます。

※弊社環境では特にストレージドライバを指定してはいないので、上記環境ではデフォルトで device mapper が利用されているようです。

対応手順

弊社のDocker 環境では /var/lib/docker/devicemapper/mnt/ ディレクトリ以下に docker コンテナが利用しているファイルシステムがマウントされていました。
このディレクトリ以下の (エラーメッセージに含まれている) 該当するファイルシステムをアンマウントする事で対応可能なようです。

  1. /var/lib/docker/devicemapper/mnt/ディレクトリに移動します。
    # cd /var/lib/docker/devicemapper/mnt/
    
  2. エラー出力されていたファイルシステム名に合致するディレクトリが存在するか ( 一応 ) 確認します。
    # ls -la
    
  3. ディレクトリが存在したらこれをアンマウントします。
    # umount 34232dc035872c0c297601b97b1676cfc82bb06e9c071f9a99f62541e3ccba08
    # umount d667b81103a1b56f9f698da274a61c4b959c41192fa99af8822f076be93520dd
    
  4. コンテナ削除を再実行します。
    # docker rm `docker ps -a -q`
    34232dc03587
    d667b81103a1
    

    削除できなかったコンテナが削除できました。

なお、マウントされているファイルシステムを確認する場合、以下で確認可能です。

# cat /proc/mounts

上の方法だとDocker以外が利用しているものも表示されるので、Dockerコンテナで利用しているものだけ表示する場合、以下のようにすればよさそうです。

# cat /proc/mounts | grep "mapper/docker"

まとめ

docker で利用するストレージドライバは初期は aufs 一択だったようですが、現状では複数のものから選択可能になっており、バージョンやディストリビューションによっても異なっているようです。

devicemapper 以外のストレージドライバでも発生する問題かは不明ですが、軽くぐぐった所、海外のフォーラムでは同様の問題が結構発生している様子。

Docker を利用している場合、利用しないコンテナ ( 及び、イメージ ) は定期的に削除しないとディスクがどんどん足りなくなるので、Dockerが利用するストレージの管理もきちんと行いたいものです。
( といいつつ、Dockerホストのディスク容量を nagios 通知する位しかできてない... )