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起動コマンドで、-itと、/bin/bash を指定しなかったので、すぐに終了した。
0c808ad99adc centos:centos7 "/bin/bash" 35 seconds ago Exited (0) 34 seconds ago testdatacont
○ところで、もしも、/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[root@localhost ~]# cat /var/lib/docker/volumes/testdata-vol/_data/box/text.txt
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
testDockerホスト側のボリュームに直接アクセスして、ファイルを表示させられた。
■ボリュームの削除テスト
[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日
/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日