Dockerでイメージを永続化するには通常commitを使うが、この他に状態保存に関するコマンドとしてsaveとexportがある。いずれもコンテナをtarにまとめて吐き出すような挙動をするが、それぞれ動作が異なる。
Dockerコンテナの内部構成
その前にDockerコンテナの内部構成に関して把握する必要があるが、以下のページが大変詳しくて参考になった。
Dockerイメージの差分管理についてまとめてみた | TANKSUZUKI.COM
Dockerコンテナは構成を「差分」という形で管理していく。Dockerfile内でRUNやADDを行うと、それは都度差分として記録されるので、闇雲にRUNを重ねるとコンテナがぶくぶくと膨れていく。ちなみに差分(レイヤー)数の上限は127だそうだ。
saveとexportの差異
そういったコンテナの構成を踏まえてのこれらのコマンドの差異を見る。
-
save上記のレイヤーやタグといったメタ情報含めてコンテナをtarでまとめる。 -
exportファイルシステムを愚直にtarでまとめ、メタ情報は無視される。
つまりはいわゆる「Dockerコンテナ」として保存できるのはsaveの方であり、exportはDockerとしての構造、情報などは無視され、通常のサーバーと同様のルート以下ファイルシステムが保存されるだけ。例えばDocker Hubを使わずにローカルでコンテナを別のDocker環境へ引き渡したい、といった用途であれば、saveしてloadしてもらう形になるかと思う。
(参考)
- save (Docker Docs)
- export (Docker Docs)
- Difference between save and export in Docker – Thomas Uhrig