LINUX.ORG.RU

Почему везде в гайдах говорится что изменения в контейнерах Docker пропадают при остановке, хотя это не так

 


1

4

У меня всегда было удтверждение, что данные в контейнере теряются при остановке или перезапуске. Во всех гайдах, которые я встречал, так и говорилось. Но ко мне недавно обратился приятель, который мыслит как и я, у него есть контейнер на основе python образа, где он при помощи docker exec -it изменил некоторые файлы кода python и эти изменения сохранились после перезапуска.

Я решил провести эксперимент:

merqury@home-pc:~$ sudo docker container run -d ubuntu tail -f /dev/null
ef1ba0a89ea93995a97c2ee3200c66018ffaa9e3671494b813437cc75f082080
merqury@home-pc:~$ sudo docker exec -it ef1 bash
root@ef1ba0a89ea9:/# ls /root
root@ef1ba0a89ea9:/# touch /root/first /root/second
root@ef1ba0a89ea9:/# ls /root
first  second
root@ef1ba0a89ea9:/# exit
exit
merqury@home-pc:~$ sudo docker restart ef1
ef1
merqury@home-pc:~$ sudo docker exec -it ef1 bash
root@ef1ba0a89ea9:/# ls /root
first  second
root@ef1ba0a89ea9:/# exit
exit
merqury@home-pc:~$

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



Последнее исправление: merqury (всего исправлений: 1)

Не путая образ (image) и контейнер. Образ остаётся неизменным. При рестарте у тебя контейнер не удалился. Это видно хотя бы из того, что его id ef1 остался прежним и ты второй раз по нему заходишь внутрь.

Вместо restart сделай docker rm -f <id контейнера>. Тогда контейнер удалится вместе с данным.

ox55ff ★★★★★
()

Вообще используй команду docker ps -a. Она показывает в том числе остановленные контейнеры. Скорее всего у тебя там полно мусора, раз уж ты думал, что контейнеры автоматически удаляются. И хорошо бы его почистить.

Чтобы контейнер автоматически удалялся вместе с данными запускать нужно с ключом --rm.

ox55ff ★★★★★
()

Я не знаю, зачем ты читаешь какие-то сторонние гайды вместо документации. В документации всё есть: https://docs.docker.com/engine/storage/drivers/#container-and-layers Авторы гайдов, возможно, пытаются уберечь тебя от плохих практик, которые приведут к потере данных.

anonymous
()
Ответ на: комментарий от ox55ff

Образ и контейнер я не путаю и с базовыми командами я отлично знаком, и я отлично знаю какие у меня контейнеры хранятся на компьютере, запущеные или нет, можете это не рассказывать. Но ответ ваш мне очень не понравился, вы так и не ответили на сам вопрос, а мой вопрос был: Почему везде люди говорят что при РЕСТАРТЕ данные теряются.

merqury
() автор топика
Ответ на: комментарий от anonymous

По вашему мнению новичок будет читать сложную техническую документацию? Даже когда он просто напросто даже не знает что это за докер и зачем он нужен, просто стало интересно. Мое самое первое видео по докеру было от Merion Academy и он горовил что при остановке данные теряются. Как и в большинстве статей хабра. А если авторы гайдов и пытаются уберечь новичков от плохих данных, то мне кажется это медвежья услуга. Дело в том, что у новичка первые впечатления становятся фундаментом для остального. Как это стало у меня. Я просто, как верующий верит в Бога, думал что данные не сохраняются в контейнере как раз таки из-за таких авторов.

merqury
() автор топика
Ответ на: комментарий от merqury

вы так и не ответили на сам вопрос

Очевидно, потому что вопрос совершенно клоунский. Ты ещё спроси почему люди ковыряются в носу. Хочется. Если конкретный гайд врёт, то «почему» надо спрашивать у автора этого гайда, а не идти на сторонний сайт и спрашивать там. Не?

при РЕСТАРТЕ

Что такое рестарт? Давай ссылку на гайд, где это говорится. Там конкретно про команду docker restart или просто про абстрактный перезапуск, который может быть и в виде docker rm -f. Тогда просто ты долбишься в глаза и увидел в гайде то чего нет, а виноват автор.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

https://youtu.be/aZTL2zRmOnA?si=6NGDVshfwyyFZOu0&t=295

Например знаешь-ли ты, что по умолчанию все изменения внутри контейнера удаляются при его остановке

https://timeweb.cloud/tutorials/docker/peredacha-dannyh-mezhdu-kontejnerom-docker-i-hostom

Когда контейнер останавливается, данные теряются

https://pq.hosting/help/instructions/594-nastrojka-hranilisch-v-docker.html

Это важно, так как контейнеры по умолчанию являются неизменяемыми и все изменения, сделанные внутри контейнера, теряются после его остановки или удаления.

https://habr.com/ru/companies/slurm/articles/534334/

В любой момент контейнер может рестартовать: завершиться и вновь запуститься из образа. При этом все накопленные в нём данные будут потеряны.

Я думаю достаточно статей скинул, а если вопрос клоунский, по твоим словам, то если ты на него не ответишь, то будешь являться клоуном, по ТВОЕЙ же логике. А что такое рестарт - вот это уже клоунский вопрос. Рестарт контейнера - это docker restart, а docker rm -f с последующим запуском нового контейнера - это пересоздание контейнера. Кстати прошу заметить, что timeweb и pq.hosting - хостинг провайдеры, а не какие то ноунеймы с хабра и даже они такое говорят

merqury
() автор топика
Ответ на: комментарий от merqury

Ладно, давай смотреть.

https://youtu.be/aZTL2zRmOnA?si=6NGDVshfwyyFZOu0&t=295

Реклама курсов. Текст писал небось какой-нибудь рерайтер, а не специалист. Если бы это было в самом курсе сказано, тогда да. А так что ты хотел от шестиминутной рекламы с картиночками для детей?

https://timeweb.cloud/tutorials/docker/peredacha-dannyh-mezhdu-kontejnerom-docker-i-hostom

Там прямо во втором предложении:

Docker использует технологию виртуализации, которая создает изолированную среду для запуска приложений.

Какая нахрен виртуализация? Этот текст писал чушпан, который не понимает как работает докер. После этого можно было сразу закрывать этот сайт. Никакого доверия информации оттуда быть не может.

https://pq.hosting/help/instructions/594-nastrojka-hranilisch-v-docker.html

Это не гайд, это три команды из документации. Скорее всего так же было сделано девочкой-копирайтером чисто для наполнения сайта. Не понятно зачем ты зашёл на этот сайт, а не сразу обратился к документации докера. Я бы понял, если это был именно гайд с разбором подводных камней, чего нет в официальной документации.

https://habr.com/ru/companies/slurm/articles/534334/

Здесь «рестартовать» не значит вызвать docker restart. Там дальше двоеточие и объяснение, что конкретно автор подразумевает под словом «рестартовать». «вновь запуститься из образа» это значит с чистого листа. Тут всё правильно. Данные пропадут.

Я думаю достаточно статей скинул

Ты скинул одну нормальную статью с хабра, в котором, сюрприз, всё написано правильно. Остальные это просто копирайтерский высер, единственный смысл которого наполнить сайт, чтобы пусто не было.

Кстати прошу заметить, что timeweb и pq.hosting - хостинг провайдеры, а не какие то ноунеймы с хабра

Вот как раз хостинг провайдерам доверять нельзя, они не докеры админят, а барыжат виртуалочками. Специалистов по докер там нет. А вот статья на хабре от слёрма, которые делают обучающие курсы по кубернетесу. Иронично, что единственную нормальную ссылку ты забраковал.

Но теперь я могу ответить на вопрос из заголовка темы "Почему везде в гайдах говорится что изменения в контейнерах Docker пропадают при остановке": потому что ты не умеешь искать и фильтровать информацию. Из всех ссылок гайд только на хабре. И там нет ошибочной информации. Остальное шлак, который отбрасывается ещё на этапе просмотра ссылок в поисковике.

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Docker использует технологию виртуализации, которая создает изолированную среду для запуска приложений.

Какая нахрен виртуализация? Этот текст писал чушпан, который не понимает как работает докер. После этого можно было сразу закрывать этот сайт. Никакого доверия информации оттуда быть не может.

Прочитай про типы виртуализации. LXC/Docker это тоже виртуализация, но на уровне ОС, а не полная как в qemu/kvm, xen, virtualbox и др.

vel ★★★★★
()

Потому, что надо читать документацию, а не «гайды» сомнительного качества. Естественно в контейнерах данные сохраняются. Чтобы данные потерять, нужно удалить это контейнер и создать новый, в котором, конечно же, данных из старого контейнера не будет.

Если ты разбираешься в виртуальных машинах, контейнер это полная аналогия виртуальной машины. Образ это снапшот виртуальной машины.

Единственное, что в докере может «помочь» с потерей данных, это его философия. К примеру если ты создаёшь конейнер с флагом --rm, то он действительно удалится сразу после остановки. Если ты пишешь docker compose down, то он удаляет все контейнеры.

Про то, что контейнеры легко удаляются, это скорей некая «философия» современного применения этих самых контейнеров. Когда все изменения должны быть в Dockerfile. Также в Kubernetes контейнеры задуманы эфемерными, твой под может быть удалён с ноды, и пересоздан на другой ноде в любой момент, поэтому хранить что-то в контейнере, а не во внешнем томе - ну разве что какие-то закешированные данные, которые не жалко потерять. Хотя даже там с этим можно бороться, про «удален в любой момент» я немного лукавлю.

Но если говорить именно про докер - конечно же данные сохраняются в контейнерах и конечно же это можно использовать, хотя лучше всё же все значимые изменения документировать в Dockerfile-ах, а не делать вручную.

А почему так пишут? Не знаю. Видимо гайдописатели тупые. Такое бывает. Это как я в третьем классе понял, что моя учительница по математике тупая и я знаю математику лучше её. Видимо ты похожее осознал немного позже в своей жизни.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 3)
Ответ на: комментарий от vel

Docker это разграничение прав ядром. Если докер считать виртуализацией, то и права на файлы это тоже виртуализация. Да и сами процессы тоже в виртуализацию можно записать. Ну а чё нет? Из-за виртуальной памяти каждый процесс изолирован и не видит чужую память. Чем не виртуализация, а? ;)

ox55ff ★★★★★
()
Ответ на: комментарий от ox55ff

Тут границу сложно провести. XEN работает по тому же принципу, что и контейнеры, но тем не менее его юз-кейс это замена KVM и к нему абсолютно применим термин виртуализация.

С процессом разница в том, что процесс на «голом железе» работать не может. Он в любом случае работает внутри ОС и с миром общается через сисколлы, если, конечно, делает хоть что-то видимое.

Виртуальную машину можно запустить на реальном железе. Докер-образ скорей всего тоже можно, я, правда, не пробовал, но принципиальных проблем не вижу - указать ядру init=entrypoint и должно сработать.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

XEN работает по тому же принципу, что и контейнеры

Нет, это настоящая виртуализация. Кто-то даже скажет, что более настоящая, чем KVM, потому что последняя это якобы type 2 hypervisor (что не соответствует действительности).

anonymous
()
Ответ на: комментарий от anonymous

Тут проблема в том, что сейчас технологий слишком много и люди пытаются пропустить базовые знания. Я лично видел - человек не то, что консолью не владеет, он по-моему компьютером-то пользуется с затруднениями, но уже лезет в докер. По-человечески я его понимаю, ему хочется рубить бабло сегодня, а не читать Фигурнова следующие 10 лет. Но по факту получается, что человек не понимая вообще, что такое mountpoint, port mapping (да и что такое порт в принципе) не сможет продуктивно читать документацию. В общем-то и от «гайдов» ему пользы большой не будет, но ему будет казаться, что будет - типа команд там нахватался, как попугай копипастишь и вроде даже какие-то строчки бегут, типа работает что-то.

vbr ★★★★
()
Последнее исправление: vbr (всего исправлений: 1)
Ответ на: комментарий от vbr

Ха-ха, да полон реддит мастеров curl https://.../coolest-vasyan-stack.yml; docker-compose up, которым кажется, что всё очень просто, пока оно не сломается (а оно, понятное дело, рано или поздно ломается). Просто здесь абстракция предназначена для удобства знающих подкапотную технологию, а не для скрытия этой технологии полностью, но часто ошибочно воспринимается именно так.

anonymous
()
Ответ на: комментарий от ox55ff

Ты не хочешь осознать, что уровни виртуализации бывают разными.

Про память ты зря сказал. То что у каждого процесс своё адресное пространство, это тоже виртуализация, т.к. процесс не знает где она физически. Были ОС в которых все процессы жили в одном адресном пространстве.

Докер/lxc дает тебе возможность создать виртуальную ОС. В ней свои идентификаторы процессов, свои идентификаторы юзеров, своя сеть, своё время, свои файлы.

vel ★★★★★
()
Ответ на: комментарий от anonymous

виртуализация в контексте где ее протипоставляют какой-нибудь контейнеризации понимается как та виртуализация которая vmware, qemu, и т.п. то есть виртуализация среды исполнения включая устройства, в докере этого нет, вот и разница о которой я регистранту сообщил. а википедия не лучший источник информации.

asdpm
()
Ответ на: комментарий от CrX

да, тебе осталось понять. но я помогу: контекст противопоставления взялся из сообщения на которое я отвечал Почему везде в гайдах говорится что изменения в контейнерах Docker пропадают при остановке, хотя это не так (комментарий)

asdpm
()
Ответ на: комментарий от asdpm

Там нет этого противопоставления. Более того, ox55ff как раз не согласен, что доккер корректно называть системой виртуализации. Да и отвечал ты на сообщение от анонимуса с вот этой ссылкой: https://en.m.wikipedia.org/wiki/OS-level_virtualization, а не на то…

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
Ответ на: комментарий от CrX

Там нет этого противопоставления

Более того, ox55ff как раз не согласен, что доккер корректно называть системой виртуализации

ну если он рассуждает о том, можно ли одно считать другим, то противопоставление одного другому всё же есть, особенно если в одном из случаев он (корректно) считает, что одно другим считать нельзя (комментируя то ли хабр то ли что).

отвечал ты на сообщение от анонимуса с вот этой ссылкой

да, это сообщение было ответом анонимуса на мое сообщение, являвшееся, в свою очередь, ответом на сообщение 0x55ff.

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

asdpm
()
Ответ на: комментарий от asdpm

ОК. Тем не менее, если вернуться чуть выше, то терминологические споры начались с того, что в какой-то говностатье написано «Docker использует технологию виртуализации». Там, в этом изначальном контексте никакого противопоставления нет, и я бы скорее назвал это придиркой к статье, нежели замечанием по существу. Впрочем, она, пожалуй, уместна, учитывая, что там и дальше глупости написаны (собственно по сабжу). Но если бы это была в остальном нормальная статья, я не согласен, что нельзя сказать, что docker использует виртуализацию. В общем случае, без какого-то контекста противопоставления (а его не было в этой самой статье и любой подобной), контейнеризация не является противопоставлением виртуализации, а напротив, использует возможности ядра по этой самой виртуализации. И в этом смысле ссылка анонимуса вполне уместна.

CrX ★★★★★
()
Ответ на: комментарий от CrX

я не согласен, что нельзя сказать, что docker использует виртуализацию

в середине 2000-х когда, когда я эту технологию начал использовать и я и другие народные массы под словом усвоили именно то что делает VMWare, MS Virtual PC, и т.д. смысл слова виртуализация свёлся к более конкретному явлению - к виртуализации машин.

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

заранее соглашусь с тем, что ссылки можно найти на что угодно, (анонимус указавший на терминологиские споры всё же в целом прав), но тем не менее, такое понимание виртуализации вполне можно налюдать до сих пор:

https://azure.microsoft.com/en-us/resources/cloud-computing-dictionary/what-is-virtualization

What is virtualization? Virtualization creates a simulated, or virtual, computing environment as opposed to a physical environment.

https://aws.amazon.com/what-is/virtualization/

Virtual software mimics the functions of physical hardware to run multiple virtual machines simultaneously on a single physical machine.

https://opensource.com/resources/virtualization

Virtualization is the process of running a virtual instance of a computer system in a layer abstracted from the actual hardware.

https://www.ibm.com/think/insights/virtualization-benefits

Virtualization uses software to create an abstraction layer over the physical hardware. In doing so, it creates a virtual compute system, known as virtual machines (VMs).

возвращаясь к докеру.

докер не виртуализует машину, в том числе одно достаточно важное устройство - процессор.

данный факт, по-первых, для меня противоставляет докер виртуализации понятийно.

во-вторых, вышеназванный факт про процессор проявляется на практике при эксплуатации докера: контейнер из такого же образа не работает на другом «хосте», что логично, ведь докер - не виртуализация.

asdpm
()
Ответ на: комментарий от asdpm

смысл слова виртуализация свёлся к более конкретному явлению - к виртуализации машин.

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

P.S. В любом случае, сказанное по прежнему не делает употребление слова виртуализация в той статье «неправильным», да и ссылка анонимуса на одну из причин, почему, тоже всё ещё валидна.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от ox55ff

А так сразу ответить нельзя было? Или у тебя такая традиция, сначала засрать, а потом уже нормально ответить. Я полностью с тобой согласен, что это моя проблема, что я не умею фильтровать и искать информацию, но я тогда был новичком, когда только знакомился с докером. В те времена я прочитал это и поверил на слово. А потом просто не задавался вопросом, даже когда уже научился фильтровать информацию. А почему такой вопрос встал? Да потому что странно, что в большинстве гайдов пишется неправильно. Тут даже начинаешь сомневаться в своих знаниях, когда везде говорят по другому.

merqury
() автор топика
Ответ на: комментарий от theNamelessOne

Ну сейчас мне то не сложно, но когда был новичок, было сложно из-за того что документация написана техническим языком. Это знаете, как в праве: В каком нибудь, например, уголовном кодексе все написано юридическим языком и когда ты в этом ноль, тебе это покажется сложным. Именно поэтому и есть юристы, которые должны это понимать. Точно так же чтоб читать документацию нужны программисты, а когда ты новичок, ты же еще не программист

merqury
() автор топика
Ответ на: комментарий от vbr

Мне показалось странным что в большинстве гайдов пишут так. Ладно одна статья, ну две. Но когда столько неверной информации, то тут уже встаёт вопрос. Ну а насчет учителей, сейчас учусь в ВУЗе, где только пара нормальных преподов, остальные как будто просто ничего не знают и прошли в преподаватели по блату. Учитель по дисциплине «Операционные системы» мне доказывал, что граб перезаписать нельзя, что биос, как и уефи не нужны и их скоро отключат, что создатель GNU/Linux - Линус Торвальдс, а Ричард Столлман просто подогнал ему утилиты. Вобщем я отлично с этим знаком, когда ты умнее препода

merqury
() автор топика
Ответ на: комментарий от Dimez

Одно другому не противоречит. Виртуализация (не железа) необходима для контейнеризации.

Почему у ЛОРовцев всегда так сложно с тем, что у одного слова может быть больше одного значения?

…хотя тут и значение-то в принципе примерно одно. Уровень разный. Есть виртуализация на уровне железа, есть на уровне ядра, есть на уровне приложения.

Это примерно как некоторые всерьёз воспринимают «wine — не эмулятор» не как шутку/шалость, а доказывая, будто это действительно не эмулятор, приняв этот рекурсивный акроним за чистую монету.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 1)
Ответ на: комментарий от merqury

Я тебе нормально отвечал пока ты сам не задал тон общения своим

Но ответ ваш мне очень не понравился

Чел, это бесплатный форум, тут никто никому не должен. А ты приходишь и начинаешь меня отчитывать, что я недостаточно усердно отвечаю на вопрос. После этого я поставил тебе клоуна и начал общаться по-другому.

ox55ff ★★★★★
()
Ответ на: комментарий от Dimez

И эмулятор тоже. Если системные/библиотечные вызовы оно транслирует, то, скажем, рабочий стол оно может именно эмулировать. Снова одно другому не противоречит. Конечная задача (ну или одна из, воспринимаемая большинством юзеров как основная) — добиться эмуляции видны. Делается это путём трансляции того, что транслируется, эмуляции того, что не, и всяких грязных хаков там, где совсем не.

— Вася же вегитарианец.
— Строго говоря, он программист.

CrX ★★★★★
()
Ответ на: комментарий от merqury

Тут даже начинаешь сомневаться в своих знаниях, когда везде говорят по другому.

А чего тут сомневаться, если это легко проверить. Вспомнил одного ютубера, который начал видео с демонстрации того, что данные из редиса не пропадают после рестарта, я кажется понял зачем)

goingUp ★★★★★
()
Ответ на: комментарий от ox55ff

Я не отчитывал. Просто высказал своё мнение. Вот если бы я сказал, что твой ответ плохой, то да, тут я не имею права судить. Да и я с тобой на вы был, так что начал скорее ты, который увидел в этом оскорбление.

merqury
() автор топика