Dockerのボリュームを使用しているコンテナを確認する

Dockerでいくつもサービスを運用している場合、このボリュームはどのコンテナで使用していたかな?となる場面があるかと思います。

Dockerのロゴ

今回はボリュームを利用しているコンテナを確認する方法についてまとめました。

確認用の環境の準備

まずは確認用のボリュームとコンテナを作成するスクリプトを用意します。

setup-containers.sh
docker volume create volume1
docker volume create volume2
docker volume create volume3

docker container run -di \
  --name container1 -v volume1:/mnt/volume alpine
docker container run -di \
  --name container2 -v volume1:/mnt/volume alpine
docker container run -di \
  --name container3 -v volume1:/mnt/volume alpine
docker container run -di \
  --name container4 -v volume1:/mnt/volume1 -v volume2:/mnt/volume2 alpine
docker container run -di \
  --name container5 -v /mnt/volume1 -v volume2:/mnt/volume2 alpine

このスクリプトではコンテナを5つ作成してボリュームをマウントします。それぞれのコンテナと利用しているボリュームの一覧は以下です。

コンテナ名ボリューム
container1volume1
container2volume1
container3volume1
container4volume1, volume2
container5名前なしvolume, volume2

つづいて確認用の環境を準備します。以下のコマンドでDocker上にDockerが動くコンテナを作成します。(先ほどのスクリプトはカレントディレクトリに配置しておきます)

docker container run --privileged --rm -d \
  -v ${PWD}/setup-containers.sh:/setup-containers.sh:ro \
  --name docker-test \
  docker:dind

確認用のコンテナが作成できたら以下のコマンドでシェルを起動します。

docker exec -it docker-test sh 

シェルが起動できたら確認用のボリュームとコンテナを作成するスクリプトを実行します。

sh /setup-containers.sh

特定のボリュームを利用しているコンテナを表示する

まずはコンテナの一覧を表示するdocker container lsコマンドのfilterオプションでボリュームを利用しているコンテナを絞り込む方法です。

特定のボリュームを利用しているコンテナを確認する場合はこの方法が一番簡単ではないでしょうか。

docker container ls --filter volume=volume1

以下のように出力されます。

CONTAINER ID   IMAGE     COMMAND     CREATED         STATUS         PORTS     NAMES
7ba8013a0f90   alpine    "/bin/sh"   2 minutes ago   Up 2 minutes             container4
56b502afa615   alpine    "/bin/sh"   2 minutes ago   Up 2 minutes             container3
100ade528384   alpine    "/bin/sh"   2 minutes ago   Up 2 minutes             container2
36d4868a4f53   alpine    "/bin/sh"   2 minutes ago   Up 2 minutes             container1

そのほかのオプションなどの詳細はman docker-container-lsで確認することができます。

コンテナごとに利用しているボリュームの一覧を表示する

つづいてコンテナごとに利用しているボリュームの一覧を表示したい場合を考えてみました。

docker inspectコマンドを利用する方法

docker inspectコマンドの--formatオプションを利用した以下のコマンドで表示させることができました。

docker inspect $(docker container ls -aq) \
  --format '{{ .Name }}{{ range .Mounts }}{{ with .Name }} {{ . }}{{ end }}{{ end }}'

docker inspectコマンドには$(docker container ls -aq)を利用してすべてのコンテナのコンテナIDを指定しています。またボリュームにNameがある場合のみ出力するようにしてみました。

結果は以下のように出力されます。

/container5 volume2 3fd05b866f9f09f7e81b36565231117a4681fda2f75d32df21af273bdb1b90fe
/container4 volume1 volume2
/container3 volume1
/container2 volume1
/container1 volume1

ボリューム名の長さがまちまちで表示をそろえたい場合はcolumn -tをパイプでつなげればいい感じに表示されます。

docker container lsコマンドを利用する方法

docker container lsコマンドの--formatオプションで.Mountsを出力することで表示させることができました。

docker container ls --no-trunc \
  --format 'table {{ .ID }}\t{{ .Image }}\t{{ .Status }}\t{{ .Names }}\t{{ .Mounts }}'

表示が切り詰められないように--no-truncオプションを指定したのと--formatオプションの出力はtableを利用してテーブル形式としました。

CONTAINER ID                                                       IMAGE         STATUS          NAMES         MOUNTS
f0aa6cd9c4f80766dc57aadcf7e9700dbcb07e83635f1ab8900b7b61de700fa7   docker:dind   Up 12 minutes   docker-test   /home/user/setup-containers.sh,477eb0cda9916c336fbdc325c1d5da5e4c500d3d6f007bf3e911500453af8692

--formatオプションで利用できる関数などの機能は以下のリファレンスを参照ください。

上記のリファレンスにありますが--formatオプションで利用できるキー名を確認する場合は以下のコマンドが便利です。

docker container ls --format='{{json .}}'

まとめ

今回はDockerのボリュームを利用しているコンテナを確認する方法についてまとめました。今回調べてみただけでも色々な確認方法があり、ほかにもたくさんの方法があると思います。

また--formatオプションはGo templatesなので工夫次第で便利に活用できそうです。