Ръководство за контейнери на Linux: Въведение в контейнерите

Контейнерите са модна дума от години... но какви точно са те?

Контейнерите са метод за стартиране на виртуализирани приложения на вашия компютър, подобни на виртуалните машини, но използващи различен набор от основни технологии. Те могат да бъдат сложни за разбиране, но са от съществено значение за управлението на всичко Minecraft сървъри към Google. И ние ще ви покажем как да ги настроите.

Ще използваме Linux, операционна система, създадена с акцент върху преносимостта, модулността и стабилността. Linux присъства във всичко - от сървъри до микровълнови печки до конзоли за видеоигри. Контейнерите не са ограничени до работа на Linux, но технологиите зад тях са най-подходящи и работят най-добре на Linux. Ако сте нов в Linux, бихме ви препоръчали да разгледате нашия ръководство за начинаещи преди да се потопите.

Виртуални машини ли са контейнерите?

Контейнерите могат да бъдат сложна тема, но е най-добре да започнете с една ключова точка: контейнерът е не виртуална машина. Виртуалната машина е симулирана версия на специфичен хардуер и неговия софтуер, който работи в това, което е известно като хипервизор. Ако някога сте използвали софтуер като VirtualBox или

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

Хипервайзорът обикновено работи или като собствена операционна система (известна като хипервизор тип 1), или в границите на друга операционна система като Windows или Ubuntu (хипервизор тип 2). Отговорността на хипервайзора е да представи на гост операционната система със симулирания хардуер, който изисква да работи. След това пълната операционна система може да работи отгоре. Това включва всичко от симулиран CPU и RAM до шини за данни, дискови устройства или мрежови адаптери. Тази симулация е скъпа от изчислителна гледна точка, така че виртуалните машини обикновено имат значителни разходи.

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

Контейнерът е подобен на виртуална машина, тъй като съдържа и изпълнява софтуер в изолирана среда на хост система. Контейнерите обаче заместват традиционната хардуерна виртуализация, като разчитат директно на хост операционната система. Контейнерите споделят библиотеките и двоичните файлове на хост операционната система и имат само ресурсите и зависимостите, необходими за изпълнение на конкретното приложение, което съдържат. Това означава, че няма нужда от пълна операционна система за контейнер, тъй като всички контейнери, работещи на a системата може да споделя единствената хост операционна система, като същевременно запазва сегрегацията, която получавате с virtual машини.

Контейнерите имат достъп до хост операционната система чрез acontainer engine, който управлява работещите контейнери и контролира техния достъп до основната операционна система. Това може да включва налагане на сигурност между контейнерите и предоставяне или отказ на достъп до файлове на операционната система или мрежови връзки.

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

Докато виртуалните машини и контейнерите са подобни, използването на контейнери има своите недостатъци. От една страна, виртуалните машини се считат за по-сигурни, тъй като повърхността за атака за „бягство“ от виртуалната машина е значително по-малка и по-трудна за проникване. Даден контейнер може да не е подходящ например за тестване на зловреден софтуер.

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

Тъй като контейнерите не изискват пълна операционна система, те могат лесно да бъдат пакетирани в по-малки изображения и разпространени. Докато едно пълно изображение на виртуална машина лесно може да бъде десетки гигабайти, контейнерите могат да се предлагат в изображения с размер до 15 Kb. Това го прави изключително лесен за разпространение и използване на контейнери. Ще демонстрираме това, като изпълним някои прости примерни контейнери в 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 Kb на нашата тестова машина), както и неговия етикет. Етикетът на изображение всъщност е неговата версия. По подразбиране Docker ще изтегли най-новата версия на изображение. Стартирайте контейнер въз основа на това изображение, като използвате:

$ sudo docker run hello-world: latest

Това ще изведе hello-world spiel на 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 във фонов режим, ще добавим друг флаг, -д, за самостоятелен режим. Това ще стартира контейнера, отделен от вашия терминал, което означава, че е във фонов режим. Например:

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

Можете да изброявате работещи контейнери в системата. Забележете как вашият контейнер Nginx сега работи във фонов режим и му е присвоен идентификатор.

$ sudo docker ps

Работещ фонов контейнер може да бъде унищожен с помощта на неговия идентификатор. Може също да забележите, че на контейнера е дадено име. Когато такъв не е посочен, Docker ще даде на всеки контейнер произволно, уникално име.

$ sudo docker kill 

Можете обаче да тествате това с някои по-интересни изображения. Има много налични в Докер хъб, който функционира като централно хранилище за публични изображения на контейнери.

Гмуркане по-дълбоко с контейнери

Това беше кратко въведение в контейнерите. Контейнерите могат да бъдат неограничено сложни, но те са основен градивен елемент на силно разпределените системи, които управляват голяма част от съвременния ни интернет. Тази сила обаче не отнема от използването им в по-малък мащаб. Познаването на основите на контейнерите и Docker може да бъде портал за стартиране на полезни локални услуги като a Minecraft сървър или Plex на стар компютър.