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

9

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

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

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

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

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


Редактировать: добавление примера неудачного senario

$ 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
Gerry
источник

Ответы:

8

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

$ 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где можно настроить флаги демона)
nathanleclaire
источник
Привет, я только что предложил изменить ваш ответ. Вы хотели указать образ busybox в командах 2-го, 3-го и 4-го запуска? Без этого docker пытается загрузить изображения с именами "sh" и "cat", которые, как я подозреваю, не соответствуют вашим ожиданиям. Я добавлю неудачный пример выше.
Джерри
Спасибо за помощь. И вы, и @ mc0e помогли с этим, поэтому я дал вам галочку, а ему награду (а также +1 для обоих). Я надеюсь, что вы считаете это справедливым.
Джерри
1
Ах да, неправильно набрал. Извините за опечатку.
Натанлклер
Никаких извинений не требуется. Я просто дважды проверил, чтобы убедиться, что меня не поняли. Приветствую за вашу помощь с этим.
Джерри
6

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

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

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

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

Обратите внимание, что я использую 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

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

baoluofu
источник