Сегодня поговорим про контейнеры в Linux. Не смотря на то что знания будут базовыми, некоторые концепции могут требовать технических скилов, с другой стороны если у вас уже есть Linux - скилов уже может хватить, а если нет то может вам и не принципиально все понимать в деталях🙂
Что такое контейнеры? У них та же область применения, что и у виртуальных машин - создание изолированных окружений. Контейнеры часто называют “легковесными виртуальными машинами”, легковесными по части потребляемых ресурсов компьютера и эффективности их использования, далее расскажу, за счет чего это достигается и какие ограничения несет.
Работают только на Linux. Для начала стоит отметить, что контейнеры полноценно работают только на Linux машинах, так, чтобы запустить контейнер на Windows или на Mac, все равно придется запустить виртуальную машину с Linux и уже внутри нее запускать контейнеры (такое бывает необходимо, например, если у вас на проекте развертывание локального окружения автоматизировано с использованием контейнеров - удобно и довольно универсально, а главное экономит время разработчику).
Зачем же контейнерам Linux? А дело в том, что реализация контейнеров базируется на функционале ядра Linux, в нем есть такая штука как неймспейсы, если коротко, то неймспейсы позволяют скрывать одни процессы от других за счет чего и достигается изоляция, причем можно скрывать еще и файловые системы и сетевые порты и много чего еще, для всего этого есть свои виды неймспейсов. Таким образом, контейнер это просто чуть более навороченный процесс, который запущен в своем собственном наборе неймспейсов на той же Linux-машине. Так если внутри контейнера посмотреть какие процессы запущены, не будут видны процессы, запущенные вне контейнера - системные и процессы других контейнеров, или, если приложение открывает один и тот же сетевой порт в разных контейнерах, у них не будет конфликта - а если запустить два приложения без контейнеров, второе не сможет открыть порт, если он уже занят другим.
Отсюда профит в том, что не надо запускать отдельно полноценную ОС с ядром и драйверами, как в случае с виртуальными машинами, это и быстрее, и меньше потребляет ресурсов как оперативной памяти, так и процессора, ведь все контейнеры переиспользуют, по сути, ядро Linux, установленного на компьютере.
Ну и минус в том, что внутри контейнера можно запустить только Linux-приложение. (и по правилам хорошего тона только одно, ибо рекомендовано запускать одно приложение на контейнер, так проще управлять жизненным циклом контейнера).
Зачем вообще изолировать процессы? Прежде всего для безопасности, все, что происходит внутри контейнера, там и остается. Так, если взбесившееся приложение захочет удалить системные файлы, оно удалит только свою копию и ваша ОС не пострадает, так же контейнер не может навредить соседнему контейнеру по той же причине.
Менее безопасные. Контейнеры, в отличии от виртуальных машин, считаются все же менее безопасными, ведь неправильной конфигурацией можно сделать больше вреда, чем пользы. Так, если в Docker контейнер прокинуть Docker unix-сокет, это позволит контейнеру создавать другие контейнеры, зловредный код внутри контейнера сможет создать большое количество контейнеров, исчерпав ресурсы, что приведет к отказу системы и вместе с ней всех контейнеров, но так иногда делают когда уж очень хочется запускать контейнеры из контейнеров (бывает полезно в CI/CD). А запустив привилегированный контейнер (по сути запустив приложения от имени суперпользователя), если такой контейнер взбесится, он и систему может всю удалить (но необходим для запуска докера в докере). Запуск Docker-контейнера в привилегированном режиме не рекомендован для использования в продакшн окружениях. Так что, если говорить чисто о безопасности, можно не городить огород а просто грамотно настроить запуск приложения от пользователя, у которого есть необходимые и достаточные права и делов.
Воспроизводимые окружения. Изоляция ФС позволяет установить внутри контейнера необходимое и достаточное количество софта, причем нужных версий, с которыми точно все, что вам нужно, работает. Иначе вам пришлось бы вручную ставить на вашу машину разные версии софта (не каждый еще легко поставить сразу в нескольких версиях, ну, скажем, запустить два MySQL разных версий, слабо?). А как закончился проект, еще и не забыть удалить уже ненужный софт. С контейнерами же все проще, можно создать разные контейнеры с разными версиями софта и запустить их даже одновременно, если это будет необходимо. А как закончится проект, просто удалив контейнер, можно удалить больше не нужный внутри него софт - преимущество на лицо. Наверное, это основная фишка контейнеров - воспроизводимые окружения.
Спасибо, что заглянули,
добавляйтесь в
Telegram
канал и будьте в курсе новинок.
Если Вам было интересно, можете поддержать автора