sagantaf

IT関連の技術記事を書くブログ。

Docker実践〜稼働中のDockerコンテナをバックアップとしてイメージ化して保存しておく


稼働中の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  94 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 するだけ。