web-dev-qa-db-ja.com

Dockerコンテナはファイルの変更を保持しますか?

これは非常に基本的な質問ですが、少し苦労しており、適切に理解できるようにしたいと思います。

コンテナがイメージから起動され、その中のファイル(コンテナで実行されているWebAppのDBに保存されているデータなど)に変更が加えられた後、コンテナの停止と再起動の間に同じ日付で作業を続ける適切な方法は何ですか?

コンテナが停止/終了すると(つまり、対話型セッションの後に終了する)、そのコンテナはすべてのファイルの変更とともに消えるという私の理解は正しいですか?ファイルの変更を保持したい場合、コンテナの状態を新しいイメージ/新しいバージョンのイメージにコミットする必要がありますか?

ありがとう、ジュリアン

33
Julian Cerruti

コンテナが停止/終了すると(つまり、対話型セッションの後に終了する)、そのコンテナはすべてのファイルの変更とともに消えるという私の理解は正しいですか?

いいえ、--rmdocker run引数を使用してコンテナを開始しない限り、コンテナは終了後も保持されます。このことを考慮:

$ docker run -it busybox sh
/ # date > example_file
/ # exit

シェルをexitedしたため、コンテナは実行されなくなりました。

$ 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は通常、ホストボリュームマウントまたはデータ専用コンテナーを使用して、コンテナーの外部に保持されます。

50
larsks

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 
13
Paul