Руководство по контейнерам Linux: введение в контейнеры

Контейнеры уже много лет являются модным словом... но какие именно?

Контейнеры — это метод запуска виртуализированных приложений на вашем компьютере, аналогичный виртуальным машинам, но использующий другой набор базовых технологий. Их может быть сложно понять, но они необходимы для запуска всего, начиная с Шахтерское ремесло серверы Google. И мы покажем вам, как их настроить.

Мы будем использовать Linux — операционную систему, созданную с упором на мобильность, модульность и стабильность. Linux присутствует во всем: от серверов до микроволновых печей и игровых консолей. Контейнеры не ограничиваются работой в Linux, но технологии, лежащие в их основе, лучше всего подходят и лучше всего работают в Linux. Если вы новичок в Linux, мы рекомендуем вам ознакомиться с нашим руководство для начинающих прежде чем нырнуть.

Являются ли контейнеры виртуальными машинами?

Контейнеры могут быть сложной темой, но лучше начать с одного ключевого момента: контейнер — это нет виртуальная машина. Виртуальная машина — это смоделированная версия конкретного оборудования и его программного обеспечения, работающая в так называемом гипервизоре. Если вы когда-либо использовали такое программное обеспечение, как VirtualBox или

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

Гипервизор обычно работает либо как собственная операционная система (известная как гипервизор типа 1), либо в рамках другой операционной системы, например Windows или Ubuntu (гипервизор типа 2). Ответственность гипервизора — предоставить гостевой операционной системе моделируемое оборудование, необходимое для ее работы. Тогда вся операционная система может работать поверх. Сюда входит все: от моделируемого ЦП и оперативной памяти до шин данных, дисковых накопителей или сетевых адаптеров. Такое моделирование требует больших вычислительных затрат, поэтому виртуальные машины обычно несут значительные накладные расходы.

Итак, что такое контейнер?

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

Контейнеры получают доступ к операционной системе хоста через механизм контейнеров, который управляет запущенными контейнерами и контролирует их доступ к базовой операционной системе. Это может включать обеспечение безопасности между контейнерами, а также предоставление или запрет доступа к файлам операционной системы или сетевым подключениям.

Каковы некоторые компромиссы при использовании контейнеров?

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

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

Поскольку контейнерам не требуется полноценная операционная система, их можно легко упаковать в меньшие образы и распространить. Полный образ виртуальной машины может легко занимать десятки гигабайт, а контейнеры могут представлять собой образы размером до 15 КБ. Это чрезвычайно упрощает распространение и использование контейнеров. Мы продемонстрируем это, запустив несколько простых примеров контейнеров в Docker.

Установка Докера

Это много теории, так что давайте перейдем к практике. Чтобы показать вам, как настроить контейнер, мы установим Docker в Ubuntu 23.10 и будем использовать его для запуска простого контейнера Hello World. Наши действия проверены на виртуальной машине, но вы также можете выполнить двойную загрузку с ПК с Windows или использовать отличный ноутбук для Linux.

Docker быстро стал де-факто инструментом контейнеризации. Хотя существуют и другие инструменты, Docker широко распространен и идеально подходит для всех приложений, кроме самых требовательных. Есть документация о различных способах установки Docker, но мы будем использовать сценарий удобной установки. Эта команда загрузит скрипт с get.docker.com на ваш локальный компьютер:

$ curl -fsSL https://get.docker.com -o get-docker.sh

Затем вы можете запустить этот скрипт для установки Docker. Вы можете убедиться, что Docker установлен правильно, проверив версию с помощью:

$ sudo sh ./get-docker.sh

Далее следует проверка версии с помощью:

$ sudo docker version

Вы также можете убедиться, что служба докеров работает в фоновом режиме с помощью:

$ sudo systemctl status docker

Зеленым текстом должно быть указано «активно (работает)», как показано на снимке экрана ниже. Версия движка Docker также должна быть распечатана без ошибок.

Запуск простого примера

Теперь, когда Docker установлен, вы можете использовать его для загрузки образа контейнера. Образы контейнеров во многом похожи на ISO-образы для виртуальных машин, за исключением того, что они обычно меньше по размеру и их проще создавать. Загрузите простой образ контейнера hello-world с помощью следующей команды:

$ sudo docker pull hello-world

Как только это изображение будет загружено, вы можете проверить его, перечислив изображения, загруженные в вашу систему, используя следующее:

$ sudo docker images

Теперь вы должны увидеть загруженный файл hello-world. Обратите внимание на очень маленький размер (13 КБ на нашей тестовой машине), а также на его тег. Тег изображения фактически является его версией. По умолчанию Docker загрузит последнюю версию образа. Запустите контейнер на основе этого образа, используя:

$ sudo docker run hello-world: latest

Это выведет на экран программу Hello World от Dockers, которая запускается из очень маленькой программы на C (с которой вы можете ознакомиться на GitHub).

Поздравляем; вы запустили свой первый контейнер! В этом случае программа вывела результат и завершила выполнение. Контейнер теперь мертв и больше не работает.

Как сохранить контейнеры живыми

Запустив базовый контейнер, мы теперь можем создать более сложный пример, который не завершается сразу после завершения задачи. Контейнеры часто создаются вокруг одного процесса, который может порождать больше процессов. Как только этот базовый процесс завершится, вместе с ним завершится и весь контейнер. Это может показаться ограничением, но на самом деле это очень похоже на то, как работают системы инициализации в полном ядре Linux.

Чтобы запустить постоянный пример, мы можем получить образ Nginx — веб-сервера, используемого для размещения значительного процента веб-сайтов в мире. Мы выбрали Nginx для этого примера, потому что он прост, не требует сложной настройки и легкий. Загрузите последний образ Nginx с помощью следующей команды:

$ sudo docker pull nginx

Мы добавили -п установите здесь флаг, чтобы настроить переадресацию портов из контейнера в операционную систему хоста. Порт 80 используется для незашифрованного HTTP-трафика (т. е. веб-трафика). Это позволит вам получить доступ к контейнеру с вашего хост-компьютера:

$ sudo docker run -p 80:80 nginx

Эта команда будет запущена в вашем терминале в подключенном режиме, что означает, что контейнер буквально прикреплен к вашему терминалу, поэтому все журналы из контейнера будут распечатаны там. После запуска контейнера откройте http://localhost в вашем веб-браузере. Вы увидите экран приветствия Nginx, аналогичный показанному ниже:

Контейнер Nginx теперь работает внутри вашего контейнерного движка. Хотя Nginx работает в подключенном режиме, он будет работать только до тех пор, пока он открыт. Выйти из контейнера Nginx можно, нажав Ctrl + С в вашем терминале.

Как запускать контейнеры в фоновом режиме

Чтобы запустить Nginx в фоновом режиме, мы добавим еще один флаг: -д, для автономного режима. Это запустит контейнер, отсоединенный от вашего терминала, то есть он будет работать в фоновом режиме. Например:

$ sudo docker run -d -p 80:80 nginx

Вы можете перечислить запущенные контейнеры в системе. Обратите внимание, что ваш контейнер Nginx теперь работает в фоновом режиме и ему присвоен идентификатор.

$ sudo docker ps

Запущенный фоновый контейнер можно уничтожить, используя его идентификатор. Вы также можете заметить, что контейнеру присвоено имя. Если оно не указано, Docker присвоит каждому контейнеру случайное уникальное имя.

$ sudo docker kill 

Однако вы можете проверить это на более интересных изображениях. Есть много доступных на Докер-хаб, который функционирует как центральный репозиторий для общедоступных образов контейнеров.

Погружение глубже с контейнерами

Это было краткое введение в контейнеры. Контейнеры могут быть бесконечно сложными, но они являются основополагающим строительным блоком высокораспределенных систем, которые управляют большей частью нашего современного Интернета. Однако эта сила не мешает их использованию в меньших масштабах. Знакомство с основами контейнеров и Docker может стать ключом к запуску полезных локальных сервисов, таких как Майнкрафт сервер или Plex на старом ПК.