Volumeマウント

--mount type=volume

コンテナを削除してもホスト側に何かデータを残したい場合、(可能であればBindより)Volumeを使う。

VolumeマウントもBindマウントも、ホストのディレクトリをコンテナにマウントする仕組みだが、管理方法が大きく違う。

Volumeのホスト側ディレクトリ管理方法

Volumeの特徴

ソースとなるVolumeはsource=で名前指定。指定しなければ匿名Volumeになる。ターゲットはdestination=で指定。読込専用ならreadonly

複数のオプション(キーと値)は、--mount type=volume,キー1=値,キー2=値のように、,区切りで指定する。


Volumeを操作するコマンド

docker volumeコマンドで、Volumeの作成、確認、削除などができる。Volumeはコンテナ作成時に必要なら自動作成されるので、事前に作成しなくてもいい。Volumeは明示的に削除しないと、コンテナ削除でも残ったままになる。

docker volume create

# 名前付きVolumeの作成
docker volume create my-volume
my-volume

docker volume ls

# リスト
docker volume ls
DRIVER              VOLUME NAME
local               my-volume

# rootでアクセス
ls /var/lib/docker/volumes/
metadata.db  my-volume/

必要なときは上記ディレクトリからバックアップ等する。

docker volume inspect

# Volumeの詳細
docker volume inspect my-volume
[
    {
        "CreatedAt": "2018-05-19T20:51:26+09:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-volume/_data",
        "Name": "my-volume",
        "Options": {},
        "Scope": "local"
    }
]

docker volume rm

# Volumeの削除
docker volume rm my-volume
my-volume

docker volume prune

# 使用していないVolumeをまとめて削除
docker volume prune

ログファイルの永続化

コンテナを削除した後もホストにログを残す例として、httpd:2.4イメージを使う。Volumeをコンテナの/var/log/httpdにマウントする。

# httpd-logという名前でVolumeを/var/log/httpdにマウント
# (このときVolumeは自動作成される)
# --publish: ホストポート80をコンテナポート80につなぐ
# sedの行は、httpd.confを編集し、ログディレクトリを/var/log/httpdに指定
# コンテナはバックグラウンド・モード、httpdはフォアグラウンド実行
docker run --rm -dit --name test --publish 80:80 \
  --mount type=volume,source=httpd-log,destination=/var/log/httpd \
  httpd:2.4 bash -c " \
    sed --in-place 's/^[[:blank:]]*#CustomLog \"logs/CustomLog \"\/var\/log\/httpd/' conf/httpd.conf; \
    httpd -D FOREGROUND; \
  "

# アクセス確認
curl localhost
<html><body><h1>It works!</h1></body></html>

# ログ確認
docker exec -it test cat /var/log/httpd/access_log
172.17.0.1 - - [19/May/2018:12:24:22 +0000] "GET / HTTP/1.1" 200 45 "-" "curl/7.29.0"

# コンテナ停止・削除
docker stop test

コンテナ削除後も、下記のように、Volumeはホストの/var/lib/docker/volumes/側に残っている。

ホストで、root権限

cat /var/lib/docker/volumes/httpd-log/_data/access_log
172.17.0.1 - - [19/May/2018:12:24:22 +0000] "GET / HTTP/1.1" 200 45 "-" "curl/7.29.0"