今回はDockerボリュームについて解説します。
Dockerコンテナ上に保存するデータは、コンテナの削除と同時に削除されてしまいます。コンテナを実行したログはdocker logs
コマンドで確認できますが、コンテナを削除すると確認ができません。
よってコンテナの外部にデータを保存する仕組みが必要です。ここでDockerボリュームを使うと、コンテナの外部にデータの保存ができます。
Dockerボリュームとは?
Dockerボリュームは、コンテナのデータを永続化するために使用される仕組みです。
コンテナは基本的に短命な存在で、削除されるとデータも削除されてしまいます。しかし、実行ログやコンテナ内で作成したファイルなどを残しておきたい場合があるでしょう。
データをコンテナの外(ホストマシン)に保存するための手段としてDockerボリュームを使います。
データ永続化の問題
Dockerコンテナはデータを扱いにくいポイントとして以下があります。
コンテナ自体を削除するとコンテナ内のデータやログが残りません。
コンテナイメージを更新し、再ビルドすると再ビルド前のデータが残らなくなります。
コンテナ間のデータ共有はDockerネットワーク経由で可能ですが、コンテナ内での閉じた対応ができません。
ボリュームの利点
Dockerボリュームを使うことで上記のポイントを解消できます。
Dockerボリュームの種類
Dockerボリュームには以下の3種類があります。基本的には名前付きボリュームを使うことになるでしょう。
ボリュームの種類 | 概要 | 利用時のコマンド |
---|---|---|
名前付きボリューム | ユーザーが名前を指定して作成するボリューム 名前付きで管理されるため、再利用やバックアップが容易です。 | 作成時のコマンドdocker volume create {ボリューム名} |
Bind Mount | ホストマシンの特定のディレクトリをコンテナにマウントして利用するボリューム ホスト上の既存のディレクトリやファイルを直接使用します。 | docker run -d -v {ホストマシンのディレクトリ}:{コンテナのディレクトリ} {コンテナ名} |
tmpfs | コンテナのメモリ内に一時的なファイルシステムとして利用するボリューム データはコンテナの終了時に自動的に削除されます。 | docker run -d --tmpfs {コンテナのディレクトリ} {コンテナ名} {コンテナ名} |
Dockerボリュームの基本操作
Dockerボリュームの基本操作は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#Dockerボリュームのリスト確認(何もないことを確認) $ docker volume ls DRIVER VOLUME NAME #作成 $ docker volume create nginx-logs nginx-logs #Dockerボリュームのリスト確認(nginx-logsが作られたことを確認) $ docker volume ls DRIVER VOLUME NAME local nginx-logs #Dockerボリュームの削除 $ docker volume rm nginx-logs nginx-logs #Dockerボリュームのリスト確認(削除されて何もないことを確認) $ docker volume ls DRIVER VOLUME NAME |
使用例: nginxコンテナにボリュームをアタッチする
nginxのコンテナにボリュームをマウントして、利用してみましょう。この使い方ができると、例としてWebサーバのコンテナとデータベースのコンテナを分けて構築し、ボリューム間でデータを共有しながらの利用が可能です。
手順
1. ボリュームを作成します。
1 2 |
$ docker volume create nginx-html $ docker volume create nginx-logs |
2. nginxコンテナを起動し、ボリュームをマウントします。
1 2 3 4 5 6 |
$ docker run -d \ --name nginx-container \ -v nginx-html:/usr/share/nginx/html \ -v nginx-logs:/var/log/nginx \ -p 8080:80 \ nginx |
3. ボリュームを確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
$ docker container inspect nginx-container [ { ... "Name": "/nginx-container", ... "HostConfig": { "Binds": [ "nginx-html:/usr/share/nginx/html", "nginx-logs:/var/log/nginx" ], ... }, ... "Mounts": [ { "Type": "volume", "Name": "nginx-html", "Source": "/var/lib/docker/volumes/nginx-html/_data", "Destination": "/usr/share/nginx/html", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" }, { "Type": "volume", "Name": "nginx-logs", "Source": "/var/lib/docker/volumes/nginx-logs/_data", "Destination": "/var/log/nginx", "Driver": "local", "Mode": "z", "RW": true, "Propagation": "" } ], ... ] |