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