Докер: Alpine Linux: почему apk add <package>сохраняется в контейнере? - PullRequest
3 голосов
/ 24 марта 2019

Добрый вечер.

Мы узнали, что контейнер Docker не имеет состояния, но похоже, что контейнер Alpine Linux нарушает это правило:

  1. Мы запускаем контейнер Alpine Linux, используя docker run <containername> -it /bin/sh
  2. Устанавливаем отсутствующий нано-редактор: apk add nano

Если мы сейчас остановимся и запустим этот контейнер, он все еще знает нано-редактор.

Это специальная функция в Alpine Linux или кажется, что наш хост Docker делает что-то странное?

Большое спасибо за любой свет и помощь! С уважением,
Томас.

Ответы [ 2 ]

6 голосов
/ 24 марта 2019

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

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

  • если вы потеряете контейнер без сохранения состояния из-за сбоя приложения или сбоя системы / оборудования, вам все равно, просто создайте новый, который продолжает работать как его предшественник.
  • Если вы хотите перенести какое-либо контейнерное приложение с одного очень загруженного сервера на другой, недостаточно используемый (например, вы только что приобрели и установили новое оборудование), вы уничтожаете контейнер на исходном сервере и заново создаете его на новом.

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

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

2 голосов
/ 24 марта 2019

контейнер все еще существует, когда вы его остановите.только если вы удалите контейнер (docker container rm <id>) и запустите его снова через docker container run, это будет новый контейнер из указанного изображения.если вы остановите его, а затем снова запустите - он останется прежним.

(он будет убит только после льготного периода)

...