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

Чтобы ответить на этот вопрос, мы вернемся немного назад в истории, к предшественнику контейнеров, к виртуальным машинам. Это технологии, которые до сих пор можно встретить у системных администраторов. Самые распространенные представители этих технологий в профилях кандидатов это: Xen, KVM, Hyper-V, VMware, VirtualBox.

Что же такое виртуальная машина?

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

Illustration

Аналогично и с виртуальной машиной – это “выдуманный” компьютер внутри компьютера, его программная имитация. Специальная мощная программа “воображает” целый компьютер и все его процессы, которые идут внутри его, все программы и файлы. Как и для персонажей книги, программы внутри виртуальной машины не знают, что их компьютер не настоящий – они не чувствуют разницы. Как в фильме “Матрица”, они живут внутри компьютерной симуляции, неотличимой от реальности. Так же как смерти и катастрофы в книгах не приносят вреда реальному миру, так и ошибки в виртуальной машине не вызывают сбоев в реальном компьютере. Все помнят “синие экраны смерти”, особенно на старых версиях Windows, когда малейшая ошибка – и система летела вместе с вашими несохраненными данными.

Этого бы не произошло, если бы ошибка произошла внутри виртуальной машины. Тогда “полетел” бы только выдуманный компьютер, а реальный бы спокойно продолжил работать.

Этой хитростью пользуются некоторые языки программирования, запускающие программы внутри миниатюрных виртуальных машин – Java и C#. Этот же подход удобно использовать, если вы работаете с чем-то опасным, например, вирусами, внутри виртуальной машины они изолированы от реального мира.

Важное полезное свойство выдуманных миров – они могут быть какими-угодно, так и виртуальные машины часто удобно использовать, чтобы погрузится в другой “мир”. Например, запустить у себя на MacOS Windows или наоборот, или и вовсе какой-нибудь Android. Бывает и такое нужно, и вам для этого необязательно бежать покупать новое устройство, можно просто скачать виртуальную машину и установить на неё нужную вам систему.

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

Оказалось, что этот подход можно применять и в коммерческой сфере. Мы живем в век интернета, когда у компаний сотни и тысячи серверов по всему миру. А настройка одного сервера – долгое занятие, нужно скопировать кучу файлов, настроек, установить много программ. Процесс может занять много часов. Эту работу придется повторить на всех серверах и стараться от усталости и монотонности не допустить где-то ошибку. А если сделать всю это работу только один раз, внутри виртуальной машины, а потом сохранить её в файл и просто скопировать на все компьютеры? Получатся сотни, тысячи абсолютно идентичных компьютеров, тут уж точно нет места никаким ошибкам!

А если дать доступ виртуальному компьютеру в интернет, то будет ли он чем-то отличаться от настоящего компьютера для внешних пользователей?

Да, по сути, ничем он не будет отличаться! В свое время эта идея взорвала интернет. Именно благодаря ей мы сейчас видим множество “облачных” провайдеров, которые, в общем-то, как раз и торгуют виртуальными машинами “под ключ”: AWS, Azure, GCP.

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

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

Зачем же нужны контейнеры, если и виртуальные машины хороши?

Все дело в том, что у виртуальных машин есть большой недостаток. Они, как выдуманные миры, где автор придумывал всю историю до мелочей, от начала и до конца – и этих мелочей очень и очень много. Чтобы описать мир полностью, понадобятся многие сотни страниц. Вы не сможете человеку, не знакомому с “Игрой престолов”, в двух словах объяснить, что такое “Ночной дозор”, или человеку, никогда не смотревшему “Звёздные войны”, почему девятый фильм киносаги называется “Скайвокер. Восход”, да и кто вообще такой этот (эта?) Скайвокер? Тут понадобятся длительные объяснения.

Так и с виртуальными машинами – они в деталях описывают весь виртуальный компьютер. Если на виртуальном компьютере на жестком диске будет занято 100Гб памяти, вам понадобится флешка объемом чуть больше 100Гб, чтобы записать на неё такую сохраненную виртуальную машину, и никак не меньше. Можете себе представить, сколько времени уйдет, чтобы переслать эти 100Гб через интернет. Если задуматься, это даже немного глупо – на свежеустановленном компьютере большую часть места занимает папка “Windows”. Если вы запустите на этом компьютере 3 виртуальных машины с такой же версией Windows, там тоже будут такие же папки “Windows” внутри, и каждая из них потребует ещё по столько же места. В сумме в 4 раза больше места, чем нужно! Хотя, в сущности, там лежат одинаковые файлы. Хотелось бы как-то научится не дублировать по много раз одинаковые файлы. Эта мысль не давала покоя программистам, именно так и появились контейнеры.

Контейнеры похожи на другой вид произведений — это скорее ранние супергеройские фильмы Марвел, где автор не придумывает целую новую вселенную, а переносит необычных персонажей в наш с вами мир. Тут не нужно в деталях расписывать все – мы знаем, как устроена наша с вами действительность, нужно лишь рассказать об отличиях: вот есть плейбой-миллиардер Тони Старк, вот сердитый и зеленый Халк. Дальше все понятно: наш выдуманный мир начинает работать, как копия реального, но с небольшими изменениями.

Важно, что отличия лишь небольшие. Это наше ограничение. Тут уже не запустишь Windows под MacOS. Зато, если ваш контейнер отличается лишь установленной программой, его “вес” будет лишь немного превышать “вес” этой программы, при этом все остальные полезные свойства виртуальных машин сохраняться. Т.е. контейнеры – это те же виртуальные машины, из которых убрали все лишнее, оставив лишь полезную информацию. Мы потеряли возможность менять операционные системы, как перчатки, зато значительно сократили размер файла, что очень важно для передачи данных через интернет. Ведь, в первую очередь, нам всё это нужно, чтобы быстро отправлять новые обновления на сервера.

Таким образом, контейнеризация — это та же виртуализация, те же виртуальные машины, но на уровне одной выбранной операционной системы, сменить её мы уже не можем. Это значительно сузило круг применения, контейнеры уже не так полезны обычным пользователям, тестировщикам или сисадминам, а остаются востребованы главным образом разработчиками — зато им работать с контейнерами гораздо удобнее!

Исторически сложилась аналогия с грузоперевозками морскими контейнерами. Программист создает новую версию программы, устанавливает на свою виртуальную машину-контейнер и сохраняет её в файл – как бы загружает и запечатывает “контейнер”. Потом он отправляет этот файл на сервер через интернет – контейнер “плывет” морем в страну назначения. На сервере эту виртуальную машину запускают и получают обновленную версию сервера со свежей программой – контейнер выгружается и “разворачивается”, а сам процесс называется “развертыванием”.

Если вы не представляете себе как разворачивается морской контейнер, вы просто ещё не видели, как контейнер превращается в дом: