Назад | Перейти на главную страницу

Почему докер-машина очищает данные при перезапуске?

Я использую Docker Toolbox в OSX.

Я создал контейнер тома данных для хранения постоянных данных: https://docs.docker.com/userguide/dockervolumes/#creating-and-mounting-a-data-volume-container.

Я проверил, что эти данные действительно хранятся на виртуальной машине boot2docker (созданной докер-машиной), а не в контейнере, поэтому они сохранятся. Однако "перезапуск докер-машины" очищает эти пользовательские данные на виртуальной машине.

Я не могу найти документацию о том, что происходит. Я нашел одно сообщение на форуме, в котором упоминалось, что данные в / var / lib / docker будут сохранены, но я не смог найти никаких официальных документов, подтверждающих это, и это также кажется странным, учитывая, что приведенное выше руководство по постоянному хранению не использует этот путь и даже не упоминает, что ваши данные будут удалены.

Ожидается ли это, и если да, существует ли официальная документация по правильному пути для хранения постоянных данных?


Изменить: добавление примера сбоя сенарио

$ docker-machine ssh alt
docker@alt:~$ docker run -v /data:/var/lib/mysql --name mydata busybox sh -c "echo 'hello' > /var/lib/mysql/hello"
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
hello
docker@alt:~$ exit
$ docker-machine restart alt
Starting VM...
$ docker-machine ssh alt
docker@alt:~$ docker run --rm --volumes-from mydata busybox sh -c "cat /var/lib/mysql/hello"
cat: can't open '/var/lib/mysql/hello': No such file or directory

Это определенно должно сработать:

$ docker-machine ssh default
docker@default:~$ docker run -v /data --name mydata busybox true
docker@default:~$ docker run --volumes-from mydata busybox sh -c "echo hello >/data/hello"
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello
docker@default:~$ exit
$ docker-machine restart default
Starting VM...
$ docker-machine ssh default
docker@default:~$ docker run --volumes-from mydata busybox cat /data/hello
hello

Не могли бы вы подробнее рассказать о том, как воспроизвести вашу проблему?

boot2docker имеет файловую систему только для чтения (стирается при перезагрузке), за исключением:

  1. Контейнеры и их данные (объемы) - это то, о чем вы читаете /var/lib/docker
  2. Образы докеров
  3. Конфигурация Docker (например, /var/lib/boot2docker/profile где можно настроить флаги демона)

Я не использую boot2docker, но если / data стирается при перезагрузке, ваш том хранится именно там (docker run -v /data:/var/lib/mysql), поэтому он будет потерян.

То, что вы делаете, также объединяет два разных шаблона для обработки сохраняемости тома. Чтобы обеспечить постоянство, контейнеры могут монтировать тома из указанного места в хост-системе (которое предполагается постоянным), или они могут быть связаны с контейнером данных и монтироваться с --volumes-from. Похоже, подход файловой системы хоста не подходит для boot2docker, и вы должны использовать шаблон объема данных (только).

Предположительно вы должны создать свой контейнер данных с помощью -v /var/lib/mysql, скорее, чем -v /data:/var/lib/mysql.

Обратите внимание, что я использую docker для бета-версии Mac, в которой используется xhyve vm.

Содержимое / var / lib / boot2docker будет сохраняться между перезапусками машины. Поэтому, если вы хотите, чтобы определенные файлы были доступны на вашей виртуальной машине, поместите их в этот каталог.

Если вы хотите, чтобы они были доступны в другом месте для запуска контейнеров докеров, вы можете добавить следующее в / var / lib / boot2docker / profile:

mkdir -p /desired/path
ln -s /var/lib/boot2docker/your.file /desire/path/your.file

Если вы хотите добавить другую конфигурацию в системные файлы, которые будут сохраняться между перезапусками vm, например дополнительные значения в вашем файле hosts, вы можете добавить команду, подобную приведенной ниже, в / var / lib / boot2docker / profile:

echo '127.0.0.1 your.domain.com' >> /etc/hosts

Надеюсь, поможет