【Docker】Volumes（ボリューム）の中身を見る方法。ルート権限付きコンテナを起動する。

Dockerのボリュームの中に入っているフォルダやファイルを確認する方法について。


##確認方法

1. `docker volume inspect`でvolumeのmountpoint（絶対パス）を確認する。
2. イメージからルート権限付きのコンテナを起動する。
3. コンテナ内のターミナルでlsコマンドを使う


```:volumeのmountpointの確認
#ボリューム一覧を表示
docker volume ls

#mountpointを確認
docker volume inspect [ボリューム名]
```

```:ルート権限付きのコンテナを起動し、ボリュームの中身を確認
#ルート権限つきコンテナ起動
$ docker run -it --privileged --pid=host [イメージ名] nsenter -t 1 -m -u -n -i sh

#ボリュームの中身を表示
/ # ls [mountpointの絶対パス]

#対話モード終了
/ # exit
```


以上の操作で、volumeの中身を確認することができる。



<br>
##実例による確認手順

```:イメージの確認
$ docker images
REPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZE
tomcat                                          latest              35064a4fcc93        2 weeks ago         648MB
django_web                                      latest              7f0eff7ebc94        2 weeks ago         937MB
debian                                          latest              1510e8501783        5 weeks ago         114MB
python                                          3                   dfc47c6cee13        6 weeks ago         886MB
postgres                                        latest              817f2d3d51ec        7 weeks ago         314MB
vuecli                                          3                   4040959eab16        2 months ago        338MB
```

```:ボリューム一覧の表示
$ docker volume ls
DRIVER              VOLUME NAME
local               0adf7a2b08b8e09f74ffb7799716e48263f012612dc2047da1d7137a75f12b5d
local               vuecli3_vue-cli-node-volume
```


```:mountpointの確認
$ docker volume inspect vuecli3_vue-cli-node-volume
[
    {
        "CreatedAt": "2020-09-08T05:35:36Z",
        "Driver": "local",
        "Labels": {
            "com.docker.compose.project": "vuecli3",
            "com.docker.compose.version": "1.26.2",
            "com.docker.compose.volume": "vue-cli-node-volume"
        },
        "Mountpoint": "/var/lib/docker/volumes/vuecli3_vue-cli-node-volume/_data",
        "Name": "vuecli3_vue-cli-node-volume",
        "Options": null,
        "Scope": "local"
    }
]
```

```:docker対話モードに入る
$ docker run -it --privileged --pid=host [イメージ名] nsenter -t 1 -m -u -n -i sh
```

```:docker対話モード
/ # ls
EFI         boot        dev         home        lib         mnt         proc        run         srv         tmp         var
bin         containers  etc         init        media       opt         root        sbin        sys         usr
```

```:volumeの確認
/ # ls /var/lib/docker/volumes/micres_micres-node_modules2/_data
@babel                                       mime-db
@csstools                                    mime-types
@mdi                                         mimic-response
@nicolo-ribaudo                              mini-css-extract-plugin
@npmcli                                      minimalistic-assert
@rails                                       minimalistic-crypto-utils
```


###ルート権限付きコンテナ起動の詳細
最も肝となる、ルート権限付きコンテナの起動コマンドが何をしているか。

>＞コマンド
$ docker run -it --privileged --pid=host [イメージ名] nsenter -t 1 -m -u -n -i sh`


・`-it`
-t 擬似ターミナル（--tty）
-i 標準出力常時ON (--interactive)

・`--privileged`
特権モード。ホストに対するルート権限が与えられた特別なコンテナを起動。

・`--pid=host`
--pit= コンテナに対するPIDの名前空間を指定。
host コンテナ内でホスト側のPID名前空間を使う。

・`nsenter`
Dockerで作った名前空間に入るためのコマンドラインツール。
「ENTER into Name Spaces」の頭文字の組み合わせ。

<br>
▼nsenterのオプション
・`-t`
「--target pid」プロセスを指定する。ここでは１を指定。

・`-m`
「--mount」　マウント名前空間（mount name space）を入力する。名前空間の指定がなければ、PIDで指定したプロセスを使用する。

・`-u`
「-uts」 UTS名前空間を入力する。名前空間の指定がなければ、PIDで指定したプロセスを使用する。

utsはUnix Time Sharing略。


・`-n`
「--net」 ネットワーク名前空間を入力する。名前空間の指定がなければ、PIDで指定したプロセスを使用する。

・`-i`
「--ipc」 IPC名前空間を入力する。名前空間の指定がなければ、PIDで指定したプロセスを使用する。


要は、PID=１の処理でいろんな名前空間を立ち上げるらしい。

＞[Linux nsenterオプション一覧](https://man7.org/linux/man-pages/man1/nsenter.1.html)