Подтвердить что ты не робот

У контейнеров докеров сохраняются изменения файлов?

Это очень простой вопрос, но я немного борюсь и хочу, чтобы я правильно понял.

После запуска контейнера из образа и внесения некоторых изменений в файлы внутри (т.е. некоторые данные, хранящиеся в БД WebApp, запущенного в контейнере), то каким образом продолжить работу с той же датой между остановкой контейнера и перезапустите?

Насколько я понимаю, что после того, как контейнер остановлен/закончен (т.е.: выход после интерактивного сеанса), тогда этот контейнер исчезнет вместе со всеми изменениями файлов? Поэтому, если я хочу сохранить некоторые изменения файлов, я должен зафиксировать состояние контейнера в новом изображении/новой версии изображения?

Спасибо, Джулиан

4b9b3361

Ответ 1

Насколько я понимаю, как только контейнер остановлен/закончен (т.е.: выход после интерактивного сеанса), то этот контейнер ушел вместе со всеми изменениями файла?

Нет, контейнер сохраняется после его выхода, если только вы не начали его с помощью аргумента --rm до docker run. Рассмотрим это:

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

Так как мы exit изменили нашу оболочку, контейнер больше не работает:

$ 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, вы, вероятно, оказываете себе плохую услугу. В общем, более удобно рассматривать контейнеры только для чтения и создавать новые изображения с использованием файла Docker и docker build.

Используя эту модель, данные обычно хранятся вне контейнера, либо с помощью монтирования хоста, либо с помощью контейнера только для данных.

Ответ 2

Вы можете увидеть готовые контейнеры с 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