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

Да, за пос­ледние годы Docker фак­тичес­ки стал синони­мом кон­тей­нериза­ции: раз­работ­чики запус­кают в нем при­ложе­ния, адми­ны раз­ворачи­вают сер­висы, а DevOps-инже­неры стро­ят инфраструк­туру. Из‑за это­го кажет­ся, что кон­тей­неры — тех­нология, которая появи­лась вмес­те с Docker. На самом деле это не так.

Се­год­ня пос­мотрим, как соб­рать минималь­ную сис­тему Linux с нуля, узна­ем, почему chroot — это еще не кон­тей­нер, выяс­ним, как работа­ют namespaces и как огра­ничи­вать ресур­сы через cgroups. Все это вмес­те поз­волит нам под­готовить свой кон­тей­нер средс­тва­ми сис­темы, а заод­но узнать, как кон­крет­но устро­ена кон­тей­нериза­ция.

 

Что внутри

Преж­де чем занять­ся кон­тей­нером, раз­берем­ся, из каких механиз­мов он сос­тоит. Хорошая новость: поч­ти всё уже есть в Linux — нуж­но толь­ко научить­ся этим поль­зовать­ся.

В нашем «конс­трук­торе кон­тей­нера» будут три глав­ных механиз­ма:

  • namespaces — изо­лиру­ют про­цес­сы и окру­жение;
  • chroot — изо­лиру­ет фай­ловую сис­тему;
  • cgroups — огра­ничи­вают ресур­сы.

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

 

Строим изолированную файловую систему с нуля

Да­вай поп­робу­ем сде­лать то, что за нас обыч­но дела­ет кон­тей­нер­ная плат­форма: соз­дадим отдель­ную фай­ловую сис­тему кон­тей­нера. Нач­нем с пус­того катало­га и пос­тепен­но прев­ратим его в минималь­ную сре­ду Linux.

Для изо­ляции фай­ловой сис­темы исполь­зуем механизм chroot. Он меня­ет кор­невой каталог про­цес­са: ука­зыва­ет сис­теме, что дру­гая пап­ка теперь корень /.

 

Шаг 1. Создаем пустую систему

Сна­чала соз­дадим каталог, который ста­нет кор­нем будущей сис­темы:

mkdir xakep

Пос­мотрим, что внут­ри:

ls xakep

Ка­талог пуст. Сей­час это обыч­ная пап­ка, но имен­но здесь будет фай­ловая сис­тема нашего будуще­го кон­тей­нера.

 

Шаг 2. Пытаемся войти в систему

Поп­робу­ем запус­тить chroot:

sudo chroot xakep /bin/bash

Ви­дим ожи­даемую ошиб­ку:

chroot: failed to run command '/bin/bash': No such file or directory

Ло­гич­но: внут­ри xakep нет даже шел­ла. Для про­цес­са в chroot эта пап­ка — корень сис­темы, поэто­му он ищет /bin/bash имен­но там.

 

Шаг 3. Добавляем первую программу

Соз­дай каталог bin и ско­пируй туда bash:

mkdir -p xakep/bin
cp /bin/bash xakep/bin/

Поп­робу­ем сно­ва:

sudo chroot xakep /bin/bash

Ошиб­ка никуда не делась: боль­шинс­тво прог­рамм для Linux исполь­зуют ди­нами­чес­кие биб­лиоте­ки, а их сей­час нет.

 

Шаг 4. Проверяем зависимости

Пос­мотреть, какие биб­лиоте­ки нуж­ны bash, мож­но так:

ldd /bin/bash

Ко­ман­да ldd показы­вает, какие динами­чес­кие биб­лиоте­ки нуж­ны прог­рамме для запус­ка; здесь она помога­ет понять, какие фай­лы понадо­бят­ся для нашего минималь­ного rootfs.

Продолжение доступно только участникам

Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».

Присоединяйся к сообществу «Xakep.ru»!

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    4 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии