Pull to refresh

Comments 26

Podman как альтернатива Docker. Со временем вы узнаёте, что Docker — не единственный вариант. Podman, например, не висит постоянно в памяти. Можно даже сделать алиас, alias docker=podman, и забыть, что у вас на самом деле не Docker.

Лично у меня с podman как-то не пошло.
Много мелких отличий (и это еще ладно, с этим можно разобраться, было бы время и желание).

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

Наверное это решение проблемы? podman run --replace

--replace If another container with the same name already exists, replace and remove it. The default is false.

И чем это поможет, если я вручную останавливаю контейнер и вручную же его запускаю?

неудачный перезапуск контейнера из-за занятого порта прошлой версией контейнера.

конечно при условии что имя контейнера тоже самое.

Разумеется имя то же самое. Более того - ничего не менялось, даже образ оставался тот же.
Хотя при ручной остановке контейнера - имя не важно все-таки. Порты должны становиться доступными в любом случае.
Причем подобное происходило неоднократно.

К сожалению мало вводных:) Самые первые версии podman работали с предоставлением root, как docker сервис (который обслуживает все сущности для контейнеров), но после чего переориентировались к rootless mode, в котором работает не только Podman враппер, но и целая цепочка background сервисов, из которых за работу с сокетами и портами отвечает containers-rootlessport. Часто, из того что я видел, он продолжает оставатся активным для контейнера, даже когда контейнер остановлен, и тем самым продолжая держать заняными порты данного контейнера. И когда я делал --replace, оно удаляло старый контейнер, и освобождало используемые порты для новой копии контейнера.

Это было в прошлом году, на свежей Fedora, rootless.
И это явно была бага - потому как повторялась нестабильно. Чаще всего перезапуск контейнера не приводил к проблемам, даже если запускать контейнер сразу же.

К слову, это был не единственный прикол с портами. Я использую подход "разработка в контейнере", под каждый стек - свой контейнер. К контейнеру цепляюсь через SSH. И иногда не с 1й попытки удавалось достучаться из VSCode до контейнера. Иногда VSCode не мог достучаться, пока я вручную через консоль не подключусь разок.

Ну и завершающим штрихом было то, что в половине случаев я не мог загрузить систему нормально. После входа, при загрузке gnome - просто серый экран и все. Система ни на что не реагирует. В логах никакого криминала не увидел, поиск по симптомам в интернете ничего не дал. Так что могу только косвенно подозревать, что podman что-то не поделил при старте и произошел deadlock (возможно с docker "подрался"). Но именно что подозревать - перестал использовать podman и проблема ушла (хотя я его не удалял даже). И да, я знаю, что docker и podman не рекомендуют использовать совместно.

Так что лично у меня podman оставил не лучшие впечатления. Слишком много неожиданностей, помимо ожидаемого некоторого изменения поведения команд (относительно docker). Работать, конечно, можно, но стабильной работу не назвать.

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

Федора это платформа для тестирования будующих RHEL релизов, по этому сильно ожидать стабильности, мне кажется не стоит. Переход на podman 5 в прошлом году был, и много изменений в нем. Можете попробовать podman 4, в нем проблем значительно меньше.

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

Это не нормально, от слова - совсем… К сожалению, в последнее время это становится нормой, но если у тебя контейнер «просто взял и сломался», возможно, дело тут все-таки в пряморукости админа :)

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

>> LLM сейчас отлично умеют генерировать Dockerfile  - отлично умеют, но версии и параметры будут устаревшими, нужно все тщательно перепроверять.

Контейнер у нас создаётся в системе с ядром 5, бежит локально на ядре 6, а ещё и в системах с ядром 3.

Веселья хватает на каждый день.

А еще версия docker может быть разной. Причем одной у разработчика, другой у CI/CD и третьей на сервере. И у каждой свои нюансы (и несовместимости). Или вообще не docker, а что-то еще стоять может (тот же podman). И кеши сборки могут быть разные, как и базовые образы при том же теге.

Но стоит сказать, что веселья явно стало сильно меньше относительно до-docker времен с "а у меня работает" от программиста. Да и по работоспособности docker-сборки можно с высокой степени достоверности определить, на какой стороне проблемы - у разработчика или на сервере (а может косячить и CI/CD).

А на такое лично не нарывался. Может уже это порешали до меня.

Есть примеры таких несовместимостей ?

Нарывался, что более старая версия docker на сервере не сумела запустить свежий образ (собранный более свежей версией docker).
Причем ошибка была не "новая версия образа, не могу прочесть", а что-то прям совсем непонятное и дикое - за давностью не помню, но вроде приложение падало с "нет доступа к ФС".

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

Конкретика немного есть тут (пара лет с небольшим случаю):
https://github.com/apache/solr-docker/pull/13 - образ JRE превратился в тыкву в определенный момент.
Веселье в том, что мы обновили docker до актуального из реп - получили новое сообщение об ошибке. И по новому сообщение вышли уже на это сообщение (оказалось, что в репах тоже чуть более старая версия, чем нужно).

про LLM добавлю 5 копеек IMHO: чтобы нормальный результат получить - надо потратить время и нормально сформулировать. и всё равно потом перепроверка и отладка. Зачастую очень быстрее получается "сделать с каких-то СВОИХ готовых наработок копию и поменять что надо". В-общем ИИ вообще не впечатлил в том виде как сейчас

Неплохая статья, была бы полезна 5 лет назад ;)

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

А что с Виндой? Когда нужно виндовый домен, терминальник, сиквел-сервер и 1С?

@Контейнер — это изолированный процесс, которому кажется, что он запущен в отдельной системе. Но на самом деле он использует ядро хостовой ОС @
да и жизненный цикл домена не подразумевает частое пересоздание.

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

MS SQL конечно.
1Ска в браузере не всё умеет и с программистами не дружит.
домен для всего остального: ворд, эксель, почта и прочее.

Ну так ВМ - вот только "по шаблону" проблематично", т.е. ранее созданный домен восстанавливать/дублировать из копии не стОит в той же сети :) да и всегда ли нужен он
т.ч. всё равно много чего ручками делать и это уже совсем другая история

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

Статья очень кстати, особенно когда застрял на поддержке инфраструктуры, работающей на виртуалках в опенстеке

Представьте: у вас на одном сервере два приложения. Одному нужна Java 8, другому — Java 11. С виртуалками решение одно: две отдельные виртуалки.

Или можно сделать unshare -m, чтобы не тратится на создание отдельной файловой системы под каждое приложение; Или можно сделать chroot, чтобы не плодить неймспейсы линукса под каждое приложение; Или можно подменить PATH, чтобы вообще не зависеть от подсистем ядра Линукса; Или же можно просто не использовать /bin/java, а вместо этого хотя бы запускать приложение через /bin/java<версия>. В линуксе в принципе изначально плохо изолируется только libc по понятным причинам, который обычно никогда не надо изолировать. Я не понимаю, почему девопсы пытаются мне доказать, что поставить две версии интерпретатора на одну систему - это рокет сайнс, который требует неймспейсов, си групп и подмену рута одновременно.
И так со всем девопсом в целом: Большинство поднимает кубер только для того, чтобы либо "разгрузить" приложение с максимальным rps равным двум, либо разгрузить (уже без кавычек) приложение с максимальным rps равным двум. Имхо, два случая должны заставить задуматься о жизни и о направлении проекта.
Похоже мне никогда не увидеть 450к в месяц :p

:-) Комментарий правильный....
1) От разработчиков требуется полноценный программный продукт... С полноценной системой дистрибуции и обновления, мало того еще и масштабируемый (если клиентам это необходимо), и защищенный (если хранит/обрабатывает приватные данные) и безопасный (если не хотите получить проблемы со временем)... И это точно проблемы прикладных разработчиков, а не "дяди" администратора который будет этот продукт эксплуатировать. Администратору нужны указания/документация что он должен обеспечить, чтобы прикладной продукт работал безотказно и безопасно... И на нем же "висит" обязанность кроме прикладного ПО обеспечить "правильную эксплуатацию" системного ПО (ПО третьих производителей связанного с прикладным ПО).
2) Мало кого интересует сколько ресурсов требует "простаивающая система" - если она "простаивает" значит и ресурсы ей не нужны. "Умение" контейнеров "захватывать" ресурсы - требует времени на такой "захват", и если ваше прикладное приложение "по бизнес требованиям" может себе позволить "не отвечать" на время выделения ресурсов (или отвечать "повторите еще раз позже") - контейнеризация вам возможно подходит, а если после "простоя" приложения происходит "непредвиденный всплеск" нагрузки в 100 раз, ответ на которую требуется в течении 1 секунды - проблемы с "временем захвата" ресурсов и отказами в прикладной обработке будут. Разница же в потребляемых ресурсах (на высоконагруженных сервисах/приложениях) в пиках прикладной нагрузки между контейнерами и VM - малозначительна. Более того "вспомогательные" сервисы контейнеризации при абсолютной необходимости обеспечения их устойчивости к сбоям как правило нивелируют снижение требования к контейнеризированным прикладным сервисам (по сравнению с прикладными сервисами в VM).
Общий вывод - если у вас "наколенная система" с 10 прикладными TPS, контейнеры ваш выбор. Если же у вас в пиках от 300TPS, миллионы хранимых в сутки операций (БД с десятками терабайт) и простой в 5 секунд недопустим (поскольку после него придется обрабатывать уже 1500TPS), то что-то вспомогательное (не критичное) вы можете "запихнуть" в контейнеры, но основную нагрузку вы в контейнеры просто "не впихнете"...

Sign up to leave a comment.