Чому докер-машина очищує дані при перезапуску?


9

Я використовую Docker Toolbox на OSX.

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

Я перевірив, що ці дані дійсно зберігаються на VM boot2docker (створений докер-машиною), а не на контейнері, щоб вони зберігалися. Однак "перезапуск docker-machine" очищає ці власні дані на 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

Це безумовно повинно працювати:

$ 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де можна налаштувати прапори демона)

Привіт, я щойно запропонував змінити вашу відповідь. Ви мали на увазі вказати зображення зайнятої команди в командах 2-го 3-го та 4-го запуску? Не роблячи цього, докер намагається завантажити зображення під назвою "ш" та "кіт", які, я підозрюю, це не те, що ви задумали. Я додамо вище провальний приклад.
Геррі

Дякую за твою допомогу. І ви, і @ mc0e допомогли в цьому, і я дав вам галочку та йому щедро (а також +1 для обох). Я сподіваюся, ви вважаєте це справедливим.
Геррі

1
Ах так, неправильно набрано. Вибачте за друкарські помилки.
nathanleclaire

Вибачення не потрібно. Я лише двічі перевіряв, щоб переконатися, що не зрозумів. Привіт за всю вашу допомогу в цьому.
Джеррі

6

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

Те, що ви робите, також поєднує в собі два різних шаблони для збереження гучності. Щоб отримати стійкість, контейнери можуть монтувати томи з визначеного місця на хост-системі (яка, як вважається, є стійкою), або вони можуть бути пов’язані з контейнером даних та встановлені з ними --volumes-from. Здається, що підхід до файлової системи хоста не підходить для boot2docker, і ви повинні використовувати шаблон (лише).

Імовірно, вам слід створювати контейнер даних -v /var/lib/mysql, а не -v /data:/var/lib/mysql.


Створення тома за допомогою прапора -v, а потім використання томів з цього контейнера в інших контейнерах з використанням - volumes-from - саме те, що показує документація: docs.docker.com/userguide/dockervolumes/… Я б очікував, що якщо -v / location знає, що воно має бути відносно / var / lib / docker / volumes, тоді додавання двокрапки не повинно змінювати цього. Принаймні, це неінтуїтивно. -v / var / lib / mysql! = -v / var / lib / mysql: / var / lib / mysql Також здається, що повинні бути оновлені документи mysql- docker
Геррі

Дякую за твою допомогу. І ви, і @nathanleclaire допомогли в цьому, і я дав вам нагороду (як це коштує більше), і я дав галочку Nathanleclaire (а також +1 для обох). Я сподіваюся, ви вважаєте, що це справедливо.
Геррі

@Gerry Безумовно, рекомендується створити том, а потім використовувати його через - volumes-from. Встановлення ефемерних / даних на контейнер не є.
mc0e

Так, біда в тому, що я не знав / дані були ефемерними, поки я не перезапустив.
Геррі

0

Зауважте, що я використовую docker для mac beta, який використовує xhyve vm.

Вміст / var / lib / boot2docker зберігатиметься між перезавантаженнями машини. Тож якщо ви хочете, щоб певні файли були доступні у вашому vm, покладіть їх у цей каталог.

Якщо ви хочете, щоб вони були доступні в іншому місці для запуску контейнерів docker, тоді ви можете додати наступне до / var / lib / boot2docker / profile:

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

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

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

Сподіваюся, це допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.