投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償、寄付歓迎) logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)

★LibreOfficeの導入事例★
詳細について

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2018年11月18日日曜日

【Linux CentOS 7】Dockerコンテナにボリュームをマウントしデータを永続化させる方法/ボリュームのバックアップ方法【Docker-ce 18.06.1.ce】

2018年11月27日 バックアップ方法の追加

コンテナはイメージから作成される。
コンテナ動作後に追加保存されたデータは、コンテナの消滅とともに失われる。

そのためデータを永続させるためには、ボリューム等を使う必要がある。
ボリュームは、Dockerにボリューム操作用の専用コマンドが用意されている。

他にも、Dockerホスト上のディレクトリを直接マウントする方法もあるが、
ここでは扱わない。


Dockerは、「【Linux CentOS 7】Dockerをyumでインストールする手順と簡単な動作テスト【Docker-ce 18.06.1.ce】」の手順でインストールした。



<手順の概要>

(ボリュームの作成)
・Dockerホストにおいて、まずボリュームを作成する。

(データボリュームコンテナの作成)
・このボリュームを、任意のディレクトリにマウントするコンテナを作成する。
これをデータボリュームコンテナと呼ぶ。

(メインコンテナの作成)
・さらにこのデータボリュームコンテナを、メインのコンテナにアタッチする。
すると、メインのコンテナは、データボリュームコンテナが使用するボリュームを使用できるようになる。
マウント先も自動で、データボリュームコンテナと同じ位置となる。



■ボリュームを作成

○testdata-volという名前の「空のボリューム」を作成した。
[root@localhost ~]# docker volume create testdata-vol
testdata-vol
○ボリュームの一覧の表示
[root@localhost ~]# docker volume list
DRIVER              VOLUME NAME
local               testdata-vol
○ボリュームの詳細表示
[root@localhost ~]# docker volume inspect testdata-vol
[
    {
        "CreatedAt": "2018-11-17T18:16:33-05:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/testdata-vol/_data",
        "Name": "testdata-vol",
        "Options": {},
        "Scope": "local"
    }
]

ホスト上のディレクトリに専用のディレクトリが設けられていた。
[root@localhost ~]# ls /var/lib/docker/volumes/
metadata.db   testdata-vol/ 
[root@localhost ~]# ls /var/lib/docker/volumes/testdata-vol/_data/

空だった。



■データボリュームコンテナの作成

作成済みボリューム「testdata-vol」を、/DATA にマウントするコンテナを作成した。
cetos7公式イメージを用いた。

このコンテナは、データボリュームコンテナとして用いるものなので動作させなくて良い。
(ただし、後で示すように動作するように設定しなおした。)

このデータボリュームコンテナには/DATAディレクトリがないので、/DATAディレクトリが新規作成され、ここに先のボリュームがマウントされる。


[root@localhost ~]# docker run -d --name testdatacont --mount source=testdata-vol,target=/DATA centos:centos7
0c808ad99adcf7db2be8cc0468cdb665d66186242f5593bb0a78962f4109b170
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                      PORTS                              NAMES
0c808ad99adc        centos:centos7        "/bin/bash"         35 seconds ago      Exited (0) 34 seconds ago                                      testdatacont
起動コマンドで、-itと、/bin/bash を指定しなかったので、すぐに終了した。


○ところで、もしも、/DATAディレクトリが既にこのコンテナに存在していて中にファイルやディレクトリが存在していれば、マウントしようとしている「空のボリューム」にそれらが自動的にコピーされる。

例えば、Dockerイメージ「image-app1-20181128」の「/var/spool」のデータを全て、空のボリューム「vol_app1_var-spool」にコピーしたいとする。
これを意図して行うためには、次のようにコンテナをrunすればよかった。
(ただしコピー先のボリュームが空であることが重要。)

# docker run --net closednet --mount source=vol_app1_var-spool,target=/var/spool image-app1-20181128 nocommand

このイメージからコンテナが実行される前に、自動的にターゲットディレクトリの中身がボリュームにコピーされ満たされてから、ボリュームがターゲットディレクトリにマウントされる。
ただし、ここでは、イメージ内のファイルをボリュームに移すことが目的だから、コンテナが実行できないようなファイル名「nocommand」を指定しておく。
次のようなエラーが出て終了するが、目的は達成されている。(# ls /var/lib/docker/volumes/で確認する。)
docker: Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"nocommand\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled

また、イメージによっては勝手にポートを解放して、iptablesの内容を変更するものがあるので、--netオプションを用いている。これについてはここでは解説していない。



■メインコンテナの作成

このコンテナがメインである。名前を「test」とした。

上で作成したデータボリュームコンテナ「testdatacont」をボリュームとして使用する。
これによってこのコンテナには自動的に、データボリュームコンテナの/DATAがマウントされる。
つまり、ボリューム「testdata-vol」が利用できる。

[root@localhost ~]# docker run -d -it --name test --volumes-from testdatacont centos:centos7 /bin/bash
292e3bc0ec62ed5feaa9e766c3ae0b0fc063a9a7a705de450a09d102d99ffba9
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                     PORTS                              NAMES292e3bc0ec62        centos:centos7        "/bin/bash"         3 seconds ago       Up 1 second                                                   test0c808ad99adc        centos:centos7        "/bin/bash"         9 minutes ago       Exited (0) 9 minutes ago                                      testdatacont


○動作テスト

メインコンテナのコンソールを表示
[root@localhost ~]# docker exec -it test /bin/bash
[root@292e3bc0ec62 /]#
ルートディレクトリ内にDATAが作成されているか確認
[root@292e3bc0ec62 /]# ls /
DATA  anaconda-post.log  bin  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@292e3bc0ec62 /]# ls / -al
total 12
drwxr-xr-x   1 root root    18 Nov 17 23:11 .
drwxr-xr-x   1 root root    18 Nov 17 23:11 ..
-rwxr-xr-x   1 root root     0 Nov 17 23:11 .dockerenv
drwxr-xr-x   2 root root     6 Nov 17 22:56 DATA
(省略)

DATAディレクトリにファイルを保存した。
[root@292e3bc0ec62 /]# mkdir DATA/box     
[root@292e3bc0ec62 /]# touch DATA/box/text.txt
[root@292e3bc0ec62 /]# echo test >> DATA/box/text.txt
[root@292e3bc0ec62 /]# cat DATA/box/text.txt
test
日時が更新されていることを確認
[root@292e3bc0ec62 /]# ls / -al
total 12
drwxr-xr-x   1 root root    18 Nov 17 23:11 .
drwxr-xr-x   1 root root    18 Nov 17 23:11 ..
-rwxr-xr-x   1 root root     0 Nov 17 23:11 .dockerenv
drwxr-xr-x   3 root root    17 Nov 17 23:16 DATA
(省略)


ボリュームについてDockerホスト側でも更新を確認してみた。
[root@localhost ~]# ls /var/lib/docker/volumes/testdata-vol/_data/
box
[root@localhost ~]# ls /var/lib/docker/volumes/testdata-vol/_data/ -al
合計 0
drwxr-xr-x 3 root root 17 11月 17 18:16 .
drwxr-xr-x 3 root root 19 11月 17 17:56 ..
drwxr-xr-x 2 root root 22 11月 17 18:16 box
[root@localhost ~]# cat /var/lib/docker/volumes/testdata-vol/_data/box/text.txt
test
Dockerホスト側のボリュームに直接アクセスして、ファイルを表示させられた。



■ボリュームの削除テスト

[root@localhost ~]# docker volume rm testdata-vol
Error response from daemon: remove testdata-vol: volume is in use - [0c808ad99adcf7db2be8cc0468cdb665d66186242f5593bb0a78962f4109b170, 292e3bc0ec62ed5feaa9e766c3ae0b0fc063a9a7a705de450a09d102d99ffba9]
ボリュームは、データボリュームコンテナと、コンテナが使用しているため削除できない。

しかし、停止中のデータボリュームコンテナは削除できてしまうので注意。
そこで、続いて、データボリュームコンテナが削除できないように、動作した状態にした。
そうして、一連の手順を試した。



■ボリュームはそのままでもう一度、一連の手順

★予め、データボリュームコンテナと、メインコンテナは削除しておいた。
ただし、ボリュームはそのままにしている。


○データボリュームコンテナの作成(動作させておく)

データボリュームコンテナの名称は同じように、testdatacont とした。
ボリューム testdata-vol をマウントソースとし、/DATAディレクトリにマウントする。
今度は、動作するようにした。

[root@localhost ~]# docker run -d -it --name testdatacont --mount source=testdata-vol,target=/DATA centos:centos7 /bin/bash
3949ab31aea7886937772c2358bc8ffc16def7ee9e4026161011cfa9f4d48905
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS                       PORTS                              NAMES3949ab31aea7        centos:centos7        "/bin/bash"         2 seconds ago       Up 1 second                                                     testdatacont


○メインコンテナの作成

こちらは、最初のコマンドと同じ

[root@localhost ~]# docker run -d -it --name test --volumes-from testdatacont centos:centos7 /bin/bash
8cda669bbb74f53abf2d2477fb68771d75d99be527420889b9dc7fd571849716
[root@localhost ~]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED              STATUS              PORTS                              NAMES8cda669bbb74        centos:centos7        "/bin/bash"         4 seconds ago        Up 2 seconds                                           test
3949ab31aea7        centos:centos7        "/bin/bash"         About a minute ago   Up About a minute                                      testdatacont


○再び動作テスト

メインコンテナのコンソールを表示
[root@localhost ~]# docker exec -it test /bin/bash
[root@8cda669bbb74 /]#
ボリュームはそのままだったので、前のデータが残っていることを確認
[root@8cda669bbb74 /]# ls DATA/box/text.txt
DATA/box/text.txt
[root@8cda669bbb74 /]# cat DATA/box/text.txt
test


■ボリュームのバックアップ方法


testdatacontデータコンテナーはvolumeを/DATAにマウントしている。
そしてこのtestdatacontデータコンテナーはメインコンテナにアタッチされている。
これによってメインコンテナは、volumeを/DATAに自動マウントしている。

今同様に、バックアップを作業するコンテナを新規作成し、testdatacontデータコンテナをアタッチすることで、自動的にvolume/DATAにマウントさせる。
さらにバックアップを作業するコンテナには、バックアップ先ディレクトリもマウントしておく。
今回はこの/DATAをバックアップ先ディレクトリへバックアップする。

  →はマウントの方向

▲メインコンテナとデータコンテナの関係

testdata-vol(ボリューム)---></DATA>testdatacont(データコンテナ)---></DATA>test(メインコンテナ)


▲バックアップ作業用コンテナとデータコンテナの関係

testdata-vol(ボリューム)---></DATA>testdatacont(データコンテナ)---></DATA>(バックアップ作業用コンテナ)</backup><---(ホスト上のバックアップ先ディレクトリ$(pwd)


したがって、手順は次の通りである。

○ホストマシン上のバックアップ先ディレクトリに移動

移動後にディレクトリのパスは、pwdコマンドで取得できる
# cd /root/backup/docker/test


○作業用コンテナが行うバックアップ作業

# docker run --volumes-from testdatacont -v $(pwd):/backup centos:centos7 tar cvfz /backup/volume_test_20181126.tgz /DATA

testdatacont データコンテナがメインコンテナにマウントされる。
(上で見てきたように、このデータコンテナは /DATA にボリュームをマウントしているものなので、この操作を行うことで、自動的にメインコンテナの /DATA にマウントされる。)

-v で、カレントディレクトリ(ここでは、/root/backup/docker/test)を、メインコンテナの /backup にマウントする。

イメージは、centos7を使う。

tar以下は、作業用コンテナが実行するバックアップ処理内容である。
/DATA(ボリュームに繋る)を、/backup/volume_test_20181126.tgz(ホスト上のファイルに繋る)にtarでコピーして圧縮して一つのファイルに梱包している。

完了後は、ホスト上のファイル操作で任意の方法で保管しておく。


以上




<参考>
・Use volumes
< https://docs.docker.com/storage/volumes/ > 2018年11月27日

・コンテナでデータを管理する
< http://docs.docker.jp/engine/userguide/dockervolumes.html > 2018年11月18日

・Dockerのデータボリュームをバックアップ・リストア
< https://www.lancard.com/blog/2016/09/06/docker%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%83%9C%E3%83%AA%E3%83%A5%E3%83%BC%E3%83%A0%E3%82%92%E3%83%90%E3%83%83%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97%E3%83%BB%E3%83%AA%E3%82%B9%E3%83%88%E3%82%A2/ > 2018年11月18日

・DockerでCentOS 7のイメージを利用してみよう
< https://weblabo.oscasierra.net/docker-centos7/ > 2018年11月18日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad