これは非常に基本的な質問ですが、少し苦労しており、適切に理解できるようにしたいと思います。
コンテナがイメージから起動され、その中のファイル(コンテナで実行されているWebAppのDBに保存されているデータなど)に変更が加えられた後、コンテナの停止と再起動の間に同じ日付で作業を続ける適切な方法は何ですか?
コンテナが停止/終了すると(つまり、対話型セッションの後に終了する)、そのコンテナはすべてのファイルの変更とともに消えるという私の理解は正しいですか?ファイルの変更を保持したい場合、コンテナの状態を新しいイメージ/新しいバージョンのイメージにコミットする必要がありますか?
ありがとう、ジュリアン
コンテナが停止/終了すると(つまり、対話型セッションの後に終了する)、そのコンテナはすべてのファイルの変更とともに消えるという私の理解は正しいですか?
いいえ、--rm
のdocker run
引数を使用してコンテナを開始しない限り、コンテナは終了後も保持されます。このことを考慮:
$ docker run -it busybox sh
/ # date > example_file
/ # exit
シェルをexit
edしたため、コンテナは実行されなくなりました。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
しかし、-a
オプションがあれば、それを見ることができます:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79aee3e2774e busybox:latest "sh" About a minute ago Exited (0) 54 seconds ago loving_fermat
そして、再起動して再接続できます。
$ docker start 79aee3e2774e
$ docker attach 79aee3e2774e
<i press RETURN>
/ #
そして、以前に作成したファイルはまだあります:
/ # cat example_file
Wed Feb 18 01:51:38 UTC 2015
/ #
docker commit
コマンドを使用して、コンテナの内容を新しいイメージに保存し、それを使用して新しいコンテナを開始したり、他の人と共有したりすることができます。ただし、定期的にdocker commit
を使用すると、おそらく自分自身を傷つけていることになります。一般に、コンテナを読み取り専用と見なし、Dockerfileとdocker build
を使用して新しいイメージを生成する方が管理しやすいです。
このモデルを使用すると、dataは通常、ホストボリュームマウントまたはデータ専用コンテナーを使用して、コンテナーの外部に保持されます。
docker ps -a
で完成したコンテナを見ることができます
docker commit container_name new_image_name
を使用して、ファイルシステムを変更した完成したコンテナを画像に保存できます
docker cp containerID:/path/to/find/files /path/to/put/copy
を使用して、完成したコンテナからデータファイルを抽出することもできます。
コンテナにホストからディレクトリをマウントさせることにより、一時的なコンテナ内に永続的に必要なデータを「事前に計画」し、トラップを回避することもできることに注意してください。
docker run -v /dir/on/Host:/dir/on/container -it ubuntu:14.04