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


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

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

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

Я не могу найти документацию о том, что происходит. Я нашел одно сообщение в форуме, в котором упоминалось, что данные в / 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

8
2017-09-14 03:22


Источник




Ответы:


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

$ 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. Конфигурация докера (например, /var/lib/boot2docker/profile где флагов демона можно настроить)

8
2017-09-18 18:32



Привет, я только что предложил изменить ваш ответ. Вы имели в виду указать изображение busybox во 2-й 3-й и 4-й командах запуска? Без этого докер пытается загрузить изображения под названием «sh» и «cat», которые, как я подозреваю, не то, что вы намеревались. Я добавлю лишний пример выше. - Gerry
Спасибо за помощь. И вы, и @ mc0e помогли с этим, поэтому я дал вам тик и его щедрость (а также +1 для обоих). Надеюсь, вы считаете это справедливым. - Gerry
Ах да, неправильно напечатано. Извините за опечатку. - nathanleclaire
Никаких извинений не требуется. Я просто дважды проверял, чтобы убедиться, что я не понял. Приветствую вас за вашу помощь. - Gerry


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

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

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


6
2017-09-19 14:26



Создание тома с использованием флага -v, а затем использование томов из этого контейнера в других контейнерах с использованием --volumes-from - это именно то, что показывает документация: docs.docker.com/userguide/dockervolumes/...  Я бы ожидал, что если -v / location знает, что он должен относиться к / var / lib / docker / томам, то добавление двоеточия не должно меняться. По крайней мере, это неинтуитивно. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Также кажется, что документы mysql-docker должны обновляться: hub.docker.com/_/mysql/#caveats - Gerry
Спасибо за помощь. И вы, и @nathanleclaire помогли с этим, поэтому я дал вам щедрость (как это стоит больше), и я дал галочку nathanleclaire (а также +1 для обоих). Надеюсь, вы думаете, что это справедливо. - Gerry
@Gerry Конечно, создание тома, а затем его использование через --volumes-from рекомендуется. Установка эфемерных данных на ваш контейнер - нет. - mc0e
Да, проблема в том, что я не знал / данные были эфемерными, пока я не перезапустил. - Gerry


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

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

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

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


0
2017-07-29 10:57