Контейнери були модним словом протягом багатьох років... але які вони саме?
Контейнери — це спосіб запуску віртуалізованих програм на вашому комп’ютері, подібний до віртуальних машин, але з використанням іншого набору основних технологій. Вони можуть бути складними для розуміння, але вони необхідні для запуску всього Minecraft серверів Google. І ми покажемо вам, як їх налаштувати.
Ми будемо використовувати Linux, операційну систему, розроблену з упором на портативність, модульність і стабільність. Linux є в усьому, від серверів до мікрохвильових печей і ігрових консолей. Контейнери не обмежуються роботою в Linux, але технології, що лежать в їх основі, найкраще підходять і найкраще працюють у Linux. Якщо ви новачок у Linux, ми рекомендуємо вам переглянути наш посібник для початківців перед зануренням.
Чи є контейнери віртуальними машинами?
Контейнери можуть бути складною темою, але найкраще почати з одного ключового моменту: контейнер є ні віртуальна машина. Віртуальна машина — це змодельована версія певного апаратного забезпечення та його програмного забезпечення, яке працює в тому, що називається гіпервізором. Якщо ви коли-небудь використовували таке програмне забезпечення, як VirtualBox або
багатопрохідний, то ви використовували гіпервізор.Гіпервізор зазвичай працює або як власна операційна система (відома як гіпервізор типу 1), або в межах іншої операційної системи, наприклад Windows або Ubuntu (гіпервізор типу 2). Відповідальність гіпервізора полягає в тому, щоб надати гостьовій операційній системі змодельоване апаратне забезпечення, яке потрібне для роботи. Після цього повна операційна система може працювати поверх. Це включає в себе все, починаючи від імітації ЦП і оперативної пам'яті до шин даних, дисків або мережевих адаптерів. Це моделювання є дорогим з точки зору обчислень, тому віртуальні машини зазвичай мають значні накладні витрати.
Отже, що таке контейнер?
Контейнер схожий на віртуальну машину, оскільки він містить і запускає програмне забезпечення в ізольованому середовищі на хост-системі. Однак контейнери замінюють традиційну апаратну віртуалізацію, покладаючись безпосередньо на операційну систему хоста. Контейнери спільно використовують бібліотеки та двійкові файли головної операційної системи та мають лише ресурси та залежності, необхідні для запуску конкретної програми, яку вони містять. Це означає, що немає потреби в повній операційній системі для кожного контейнера, оскільки всі контейнери працюють на система може спільно використовувати одну операційну систему хоста, зберігаючи сегрегацію, яку ви отримуєте з віртуальною машини.
Контейнери отримують доступ до операційної системи хоста через механізм контейнерів, який керує запущеними контейнерами та контролює їх доступ до основної операційної системи. Це може включати забезпечення безпеки між контейнерами та надання або заборону доступу до файлів операційної системи або мережевих з’єднань.
Які є компроміси при використанні контейнерів?
Хоча віртуальні машини та контейнери подібні, використання контейнерів має свої недоліки. По-перше, віртуальні машини вважаються більш безпечними, оскільки поверхня атаки для «втечі» віртуальної машини значно менша, і її важче проникнути. Наприклад, контейнер може бути непридатним для тестування зловмисного програмного забезпечення.
Основна перевага використання контейнерів полягає в тому, що вони легкі, уникнення необхідності віртуалізації всієї операційної системи означає мінімальний час запуску та зменшення накладних витрат на систему. Це означає, що на одному хості може працювати набагато більше контейнерів, що було б неможливо з віртуальними машинами.
Оскільки для контейнерів не потрібна повна операційна система, їх можна легко упаковувати в менші зображення та розповсюджувати. У той час як повний образ віртуальної машини може легко складати десятки гігабайт, контейнери можуть бути зображеннями розміром лише 15 Кб. Це робить розповсюдження та використання контейнерів надзвичайно простим. Ми продемонструємо це, запустивши кілька простих прикладів контейнерів у Docker.
Встановлення Docker
Це багато теорії, тож перейдемо до практики. Щоб показати вам, як налаштувати контейнер, ми встановимо Docker в Ubuntu 23.10 і використаємо його для запуску простого контейнера Hello World. Наші кроки тестуються на віртуальній машині, але ви також можете виконати подвійне завантаження з ПК з Windows або скористатися a чудовий ноутбук для 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
Це призведе до розмови 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 + C у вашому терміналі.
Як запускати контейнери у фоновому режимі
Щоб запустити Nginx у фоновому режимі, ми додамо ще один прапорець, -d, для відокремленого режиму. Це запустить контейнер, від’єднаний від вашого терміналу, тобто він працює у фоновому режимі. Наприклад:
$ sudo docker run -d -p 80:80 nginx
Ви можете перерахувати запущені контейнери в системі. Зверніть увагу, що ваш контейнер Nginx тепер працює у фоновому режимі та йому присвоєно ідентифікатор.
$ sudo docker ps
Працюючий фоновий контейнер можна вимкнути за допомогою його ідентифікатора. Ви також можете помітити, що контейнер отримав назву. Якщо його не вказано, Docker надасть кожному контейнеру випадкову унікальну назву.
$ sudo docker kill
Однак ви можете перевірити це за допомогою кількох цікавіших зображень. Є багато доступних на Докер хаб, який функціонує як центральне сховище загальнодоступних зображень контейнерів.
Пірнання глибше з контейнерами
Це був короткий вступ до контейнерів. Контейнери можуть бути безмежно складними, але вони є основоположним будівельним блоком високорозподілених систем, на яких працює більша частина нашого сучасного Інтернету. Однак ця сила не позбавляє їх використання в менших масштабах. Знайомство з основами контейнерів і Docker може стати шлюзом для запуску корисних локальних служб, таких як a Майнкрафт сервер або Plex на старому ПК.