稼働中のDockerコンテナで開発をしていると、もしコンテナが落ちたら環境がすっ飛ぶよなあ、、、と不安になるので、バックアップを取れないか検証してみた。
(コンテナで直接環境を更新しているあたり、本来のDockerの使い方には合っていないんでしょうが、、、)
結論から
①稼働中のコンテナをcommitコマンドでイメージ化
②そのイメージをsaveコマンドでファイル化
でバックアップとして保存しておける。
コマンドは以下。
$ docker commit <コンテナのIDもしくはNAME> <イメージ名> $ docker save <イメージ名> -o <ファイル名>
では実際に
まずは、ホストマシンからUbuntu16.04のコンテナを作成して、bashで入る。
$ docker run -ti ubuntu:16.04 bash
コンテナの中に入ったあとは、デフォルトでは入っていないpython3を入れて環境を変更してみる
root@5207d7754fea:/# python3 -V bash: python3: command not found root@5207d7754fea:/# root@5207d7754fea:/# apt update 〜出力は省略〜 root@5207d7754fea:/# apt install python3 〜出力は省略〜 root@5207d7754fea:/# python3 -V Python 3.5.2 root@5207d7754fea:/#
バージョンが表示されたので問題なくpython3がインストールされた。
この状態のまま、他のターミナルを開き、Dockerのコンテナ状況を確認する。
$ sudo docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5207d7754fea ubuntu:16.04 "bash" 12 minutes ago Up 12 minutes gifted_bhabha $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 16.04 52b10959e8aa 12 days ago 115MB
bashが稼働しており、またubuntuイメージだけがあることがわかる。
さてここからが本題。
①稼働中のコンテナをcommitコマンドでイメージ化
コンテナが稼働した状態のまま、イメージを取得して保存する。
$ sudo docker commit 5207d7754fea test_image sha256:3c053ce8d919dd993c668bbcb7e27a740823e9ff8ec449b2fe4afe5cc6a096b6 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test_image latest 3c053ce8d919 9 seconds ago 193MB ubuntu 16.04 52b10959e8aa 12 days ago 115MB
commitにより、イメージが作成されたことがわかる。
また最初に使ったUbuntuよりもサイズが増えているので、python3が入っていると推測できる。
commitのコマンドは、
$ docker commit <コンテナのIDもしくはNAME> <イメージ名>
のようにして使う。
②そのイメージをsaveコマンドでファイル化
バックアップしたイメージはsaveコマンドでファイル化して、Docker環境の無いサーバやNASに保存しておくことができる。現在いるディレクトリに作成される。
$ docker save test_image -o test_file.tar $ ls -ltr total 193984 -rw------- 1 root root 198637568 9月 4 18:52 test_file.tar
あとはこのファイルをNASなどに保存しておき、いざという時に復活できるようにしておけばよい。
saveのコマンドは、
$ docker save <イメージ名> -o <ファイル名>
のようにして使う。
バッチ処理などで、定期的にこのcommitとsaveを実行するようにしておけば、突然サーバが落ちて、コンテナが消えても、最後のバックアップした状態までには戻せるようになる。
ファイルから復旧するには
ちなみにこのファイルからコンテナに復旧するには、loadコマンドとrunコマンドを使う。
一旦、イメージを削除する。
$docker images REPOSITORY TAG IMAGE ID CREATED SIZE test_image latest 3c053ce8d919 25 minutes ago 193MB ubuntu 16.04 52b10959e8aa 12 days ago 115MB $ sudo docker rmi test_image Untagged: test_image:latest Deleted: sha256:3c053ce8d919dd993c668bbcb7e27a740823e9ff8ec449b2fe4afe5cc6a096b6 Deleted: sha256:e36bc1738fb2f0e049abbc86a09f597ffb52e0be65bed049f36d49393326ee8d $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 16.04 52b10959e8aa 12 days ago 115MB
ファイルからイメージを作成する。
$ sudo docker load < test_file.tar 678bc467ee4a: Loading layer [==================================================>] 79.57MB/79.57MB Loaded image: test_image:latest $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test_image latest 3c053ce8d919 27 minutes ago 193MB ubuntu 16.04 52b10959e8aa 12 days ago 115MB
イメージが復活していることがわかる。 あとはこのイメージを使って、最初のように docker run するだけ。