Docker Desktop for Macでコンテナがマウントしてるボリュームを調べる

動機

仕事でRubyのバージョンアップを行いました。ローカルの開発環境ではDockerを使っているので、新しいバージョンのRubyをインストールするようDockerfileを書き換えてイメージをビルドしました。

イメージのビルド後、あたらしいバージョンのRubyで bundle installを実施しました。すると以下のようなメッセージが表示されました。

1
Ignoring (gem名) because its extensions are not built.

古いgemが残っているからなのだと思うのですが、ちょっと気持ち悪いので対処したいと思いググってみました。すると、どこかのサイトにgemのインストールディレクトリをまっさらにしてからもう一度 bundle installするとよい、と書かれていたのでその通りにすると、アプリケーションが全く動かなくなってしまいました。bundle installは実行できますが、すでにgemはインストール済という認識でなにも行ってくれません。

docker-compose.ymlを見ると、マウントしているボリュームにbundle installしているようです。そのボリュームを調べたいと思いました。

ボリュームの一覧表示

ボリュームの一覧表示をするにはdocker volume lsを実行します

1
2
3
4
5
6
$ docker volume ls
DRIVER VOLUME NAME
local 0d506af3b9c55280acce2e034fb7ff2b6f19c9c23192e6de91ac406702236f8d
local 2f6589f1ec9c16dd1fcdc638aa2df316c3d1e5fa9c712651e8b61997ca26d0d1
local 3c8d4c4aa95221be36b5adc472549440e7330764ad3b8bef08f37d4d59f4d4ba
...

かなりの数があります。

使っていないものもあるのだろうなと思い、フィルタオプションでボリュームが参照されているかどうかを指定して(dangling=true)使っていないボリュームの一覧を表示してみます。(参照されていない時がtrue。ドキュメントはこちらです。danglingとは宙ぶらりんという意味のようです。)

1
2
3
4
5
6
$ docker volume ls -f dangling=true
DRIVER VOLUME NAME
local 0d506af3b9c55280acce2e034fb7ff2b6f19c9c23192e6de91ac406702236f8d
local 2f6589f1ec9c16dd1fcdc638aa2df316c3d1e5fa9c712651e8b61997ca26d0d1
local 3c8d4c4aa95221be36b5adc472549440e7330764ad3b8bef08f37d4d59f4d4ba
...

ほとんどが使われていないボリュームのようです。

では利用されていないボリュームを削除します。ボリュームを削除するにはdocker volume rmコマンドを利用します。VOLUME NAMEを一つずつ指定して削除することもできますが、大変なので一気に削除します。

1
2
3
4
5
$ docker volume ls -qf dangling=true | xargs docker volume rm
2f6589f1ec9c16dd1fcdc638aa2df316c3d1e5fa9c712651e8b61997ca26d0d1
3c8d4c4aa95221be36b5adc472549440e7330764ad3b8bef08f37d4d59f4d4ba
5cb87cee19c530d3dc8e903a93501333ebdb7b191a220a24c6eec4b8cc1151f7
...

削除されたボリューム名が表示されます。

これですっきりしました、残ったボリュームは数個しかありません。ではそれらのボリュームの詳細をみていきたいと思います。

ボリュームの詳細確認

ボリュームの詳細を確認するにはdocker volume inspectコマンドを利用します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$ docker volume inspect web_bundle
[
{
"CreatedAt": "2020-07-16T13:09:21Z",
"Driver": "local",
"Labels": {
"com.docker.compose.project": "web",
"com.docker.compose.version": "1.25.4",
"com.docker.compose.volume": "bundle"
},
"Mountpoint": "/var/lib/docker/volumes/web_bundle/_data",
"Name": "web_bundle",
"Options": null,
"Scope": "local"
}
]

マウントポイントが記載されています。中身をみてみます。

1
2
$ ls -l /var/lib/docker/volumes/web_bundle/_data
ls: /var/lib/docker/volumes/web_bundle/_data: No such file or directory

どういうことでしょうか…

Dockerホストにログイン

少しググってみると、Docker Desktop for MacはDocker Desktop HyperKit VMが動作していて、Mac上で仮想マシンが動いているということでした。ですとMacのファイルシステムにそのパスは存在せず、Mac上で動いている仮想マシンに存在するということになります。

その仮想マシン(Dockerホスト)にログインするにはどうするのか調べてみると、screenというコマンドでログインできるようです。screenについての詳細はman screenで確認しました。

screenコマンドでDockerホストに接続します。

1
$ screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

パッと見、接続できたかどうかわかりづらいですが、エンターキーを押すと、docker-desktop:~#とプロンプトが表示されます。切断するときはCtrl-a Ctrl-kです。
Ctrl-dを押すとおなじみのクジラが表示されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
docker-desktop:~# __  __

Welcome to LinuxKit

## .
## ## ## ==
## ## ## ## ## ===
/"""""""""""""""""__/ ===
{ / ===-
_____ O __/
__/
_________/

docker-desktop login: root (automatic login)

Welcome to LinuxKit!

NOTE: This system is namespaced.
The namespace you are currently in may not be the root.
System services are namespaced; to access, use `ctr -n services.linuxkit ...`
login[72826]: root login on 'ttyS0'

ボリュームの確認

ではボリュームを確認します。

1
2
3
4
5
6
7
8
9
10
11
12
docker-desktop:~# ls -l /var/lib/docker/volumes/web_bundle/_data
total 84
drwxr-xr-x 2 root root 4096 Jul 16 13:09 bin
drwxr-xr-x 2 root root 4096 Apr 3 15:49 build_info
drwxr-xr-x 3 root root 4096 Apr 3 15:49 bundler
drwxr-xr-x 3 root root 20480 Jul 16 11:59 cache
-rw-r--r-- 1 root root 60 Jul 16 13:09 config
drwxr-xr-x 4 root root 4096 Jul 14 02:21 doc
drwxr-xr-x 3 root root 4096 Apr 3 15:50 extensions
drwxr-xr-x 264 root root 16384 Jul 16 11:59 gems
drwxr-xr-x 4 root root 4096 Jul 14 01:47 ruby
drwxr-xr-x 2 root root 20480 Jul 16 11:59 specifications

このボリュームはRailsアプリケーションで利用するgemのインストールディレクトリです。Dockerコンテナでbundle installを行うとこのボリュームのファイルが更新されます。

まとめ

  • dockerで利用しているボリュームはdocker volumeコマンドで確認ができる
  • Docker Desktop for Macは仮想マシンで動作している
  • MacからDockerホストに接続するにはscreenコマンドを利用する