Docker: практичне керівництво для новачків

Переклад статті «Docker simplified: a hands-on guide for absolute beginners».

Можливо, ви тільки розглядаєте можливість кар’єри в DevOps, а може, вже активно її будуєте, але в будь-якому разі: якщо у вашому резюме не позначений Docker, настав час його вивчити. Як виявилося, це одна з найбільш потрібних навичок для будь-якого DevOps-професіонала.

У цьому пості я постараюся розповісти про Docker якомога більш простою мовою.

Отже, що таке Docker?

Висловлюючись простими словами, Docker це платформа, яка полегшує процес складання, запуску, управління та дистрибуції застосунків. Все це він робить шляхом віртуалізації операційної системи комп’ютера, на якому він встановлений і запущений.

Написаний Docker на мові програмування Go, перша його версія була випущена у 2013 році.

У зв’язку з багатством функціоналу, що пропонує Docker, він широко застосовується у провідних світових організаціях та університетах (серед них – Visa, PayPal, Корнеллський університет і університет Індіани) для запуску та управління їх застосунками.

Компанії, що користуються Docker

А тепер давайте розберемося, яка проблема стоїть перед розробниками і яке її рішення пропонує Docker

Проблема

Скажімо, у вас є три різні програми на Python, які ви плануєте розміщувати на серверах (це можуть бути фізичні або віртуальні машини).

Кожен з цих застосунків використовує свою версію Python, а також окремий, специфічний набір бібліотек і залежностей.

Оскільки ми не можемо встановити на одній машині різні версії Python, ми не можемо і розмістити на ній і всі три застосунки одразу.

Рішення

Давайте подивимося, як ця проблема вирішується без застосування Docker. При такому сценарії ми можемо взяти три різних фізичних машини або одну, але досить потужну для розміщення трьох віртуальних машин.

Обидва варіанти дозволять нам встановити різні версії Python і пакети залежностей на кожній з цих машин. І при будь-якому з цих варіантів витрати, пов’язані з придбанням і підтримкою «заліза», будуть досить високими.

А тепер давайте розглянемо варіант рішення з застосуванням Docker і розберемося, чому воно більше економічне.

Щоб це зрозуміти, потрібно зрозуміти, як саме функціонує Docker.

Як працює Docker

Машину, на якій встановлений і запущений Docker, зазвичай називають Docker Host або просто «хост».

Щоб розгорнути застосунок на хості, на ньому спочатку створюється логічна сутність для розміщення цього застосунку. У термінології Docker ця логічна сутність називається контейнером (Container) або, якщо бути більш точним, контейнером Docker (Docker Container).

У контейнері Docker немає жодної встановленої і запущеної операційної системи. Але в ньому буде віртуальна копія таблиці процесів, мережевих інтерфейсів і точок монтування файлової системи. Все це буде успадковано від операційної системи хосту, на якому розміщений і запущений контейнер.

Таким чином, ядро ​​операційної системи хосту розділяється між всіма контейнерами, запущеними на ньому.

Це дозволяє кожному контейнеру бути ізольованим від інших, розміщених на тому ж хості. Тобто, контейнери з різними вимогами застосунків і залежностями можуть запускатися на одному хості, головне, щоб у них були однакові вимоги до операційної системи.

Коротше кажучи, замість віртуалізації компонентів «заліза», Docker віртуалізує операційну систему хосту, на якому він встановлений і запущений.

Переваги і недоліки використання Docker

Основні переваги застосування Docker

  • Велика кількість застосунків із різними вимогами та залежностями можуть розташовуватися разом на одному хості, якщо у них однакові вимоги до операційної системи.
  • Оптимізоване сховище. На одному хості може розміщуватися дуже багато застосунків, оскільки контейнери зазвичай займають всього декілька мегабайтів і споживають дуже мало дискового простору.
  • Надійність. У контейнері немає окремої операційної системи. Тому він споживає дуже мало пам’яті в порівнянні з віртуальною машиною, де встановлюється і запускається ОС. Завдяки цьому також знижується до декількох секунд час завантаження, в той час як віртуальній машині на завантаження потрібна пара хвилин.
  • Зниження витрат. Docker менш вимогливий щодо «заліза», на якому він запускається.

Недоліки використання Docker

  • Програми з різними вимогами до операційної системи не можуть розміщуватися на одному хості Docker. Припустимо, у нас є чотири різних застосунка, три з яких запускаються в Linux, а одне – в Windows. При такому сценарії перші три можуть розміщуватися на одному хості Docker, а для одного, який потребує Windows, треба шукати інший хост.

Основні компоненти Docker

Движок Docker (Docker Engine) це один з його ключових компонентів. Він відповідає за функціонування платформи Docker в цілому. За своєю суттю це клієнт-серверний застосунок, що складається з трьох основних компонентів:

  1. Сервер
  2. REST API
  3. Клієнт.

Сервер запускає демон під назвою dockerd (Docker Daemon), який за своєю суттю є просто процесом. Він відповідає за створення і управління образами Docker, контейнерами, мережами томами платформи Docker.

REST API визначає, яким чином додатки можуть взаємодіяти зі сервером і вказує їм, як вони повинні працювати.

Клієнт це ні що інше як інтерфейс командного рядка, що дозволяє користувачам взаємодіяти з Docker за допомогою команд.

Термінологія Docker

Давайте пробіжимося по термінах, пов’язаних з Docker.

Образи Docker (Docker Images) і контейнери Docker (Docker Containers) це дві важливі речі, з якими ви будете постійно стикатися, працюючи з Docker.

Говорячи простими словами, образ Docker це шаблон, що містить застосунок і все залежності, необхідні для запуску цього застосунку в Docker.

А контейнер Docker це логічна сутність. Більш конкретно – це запущений екземпляр образу Docker.

Що таке Docker Hub?

Docker Hub це офіційний онлайн-репозиторій, де ви можете знайти всі доступні для використання образи Docker.

Docker Hub також дозволяє нам зберігати і при бажанні поширювати наші власні образи. Ми можемо робити їх публічними або приватними залежно від наших потреб.

Будь ласка, майте на увазі, що при безкоштовному використанні Docker Hub можна зберігати приватно лише один образ Docker. Якщо вам потрібно більше, доведеться оформити платну підписку.

Редакції Docker

Docker доступний в двох редакціях:

  • Community Edition, CE (редакція спільноти)
  • Enterprise Edition, EE (корпоративна редакція)

Community Edition підходить для окремих розробників і маленьких команд. Ця редакція надає обмежений функціонал у порівнянні з Enterprise Edition.

Enterprise Edition, у свою чергу, підходить для великих команд і для використання Docker в продакшен-середовищі.

Enterprise Edition ділиться ще на три різних редакції:

  • Basic Edition
  • Standard Edition
  • Advanced Edition
Установка Docker

Установка Docker

Перш ніж приступити до роботи з Docker, давайте розглянемо, як його встановлювати.

Нижче наведені посилання на офіційні керівництва Docker по установці Community Edition. Вони досить прості, можете скористатися ними для установки Docker на вашу машину.

Якщо вам ліньки встановлювати Docker або ж у вас просто недостатньо вільних ресурсів на вашій машині для його установки, а погратися хочеться, – є рішення. Є спеціальна онлайн-«пісочниця» – Play with Docker. Там користувачі можуть попрактикуватися вводити команди, не встановлюючи нічого на свою машину. Майданчик простий у використанні і абсолютно безкоштовний.

Команди Docker

А тепер давайте, нарешті, познайомимось із основними командами, які дозволять вам почати використовувати Docker.

docker create

Ця команда Docker дозволяє вам створити новий контейнер. Ось синтаксис команди:

docker create [options] IMAGE [commands] [arguments]

Зверніть увагу: все, що забране у квадратні дужки, є опціональним. Це стосується всіх команд, які ми будемо розглядати.

Давайте розглянемо пару прикладів використання цієї команди.

$ docker create 
fedora02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03

У прикладі, наведеному вище, команда docker create створить новий контейнер з використанням останнього образу Fedora.

Перед створення контейнера команда перевірить, чи є на хості останній офіційний образ Fedora. Якщо ні, то перш ніж створити контейнер вона скачає необхідних образ із Docker Hub. Якщо ж образ Fedora вже є на хості, команда використає його і створить контейнер.

Після успішного створення контейнера Docker поверне його ID. У нашому прикладі 02576e880a2ccbb4ce5c51032ea3b3bb8316e5b626861fc87d28627c810af03 це ID контейнера, який повернув Docker.

Кожен контейнер має унікальний ID. З його допомогою ми звертаємось до контейнера, коли здійснюємо якісь операції з ним (запуск, зупинка, перезапуск і так далі).

Давайте розглянемо інший приклад використання команди docker create, з опціями та додатковими командами.

$ docker create -t -i ubuntu bash 
30986b73dc0022dbba81648d9e35e6e866b4356f026e75660460c3474f1ca005

У цьому прикладі команда docker create створює контейнер, використовуючи образ Ubuntu. Як вже згадувалось, якщо на хості потрібного образу не буде знайдено, він буде скачаний з Docker Hub.

Опції -t і -i говорять Docker призначити контейнеру термінал, щоб користувач міг взаємодіяти з контейнером. Також Docker одержав інструкцію виконувати команду bash при кожному старті.

docker ps

Команда docker ps дає нам можливість побачити усі контейнери, що запущені на хості.

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30986b73dc00 ubuntu "bash" 45 minutes ago Up About a minute elated_franklin

Відображаються лише ті контейнери, що запущені на даний час. Якщо ви хочете побачити геть усі контейнери, створені на цьому хості, незалежно від їх поточного статусу, треба додати до команди опцію -а.

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
30986b73dc00 ubuntu "bash" About an hour ago Up 29 minutes elated_franklin
02576e880a2c fedora "/bin/bash" About an hour ago Created hungry_sinoussi

Перш ніж піти далі, давайте розберемося у виводі цієї команди.

CONTAINER ID: унікальний рядок, що складається цифр і літер, прив’язаний до кожного контейнера.

IMAGE: ім’я образу, який використаний для створення цього контейнера.

COMMAND: будь-яка команда застосунку, що має бути виконана при запуску контейнера.

CREATED: показує поточний статус контейнера, а також те, скільки часу він перебуває у поточному стані.

Якщо контейнер запущений, час буде показаний як Up About an hour або Up 3 minutes.

Якщо контейнер зупинений, буде написано Exited, у скобках буде вказаний код стутусу виходу, а потім – час, що минув з моменту виходу. Наприклад, Exited (0) 3 weeks ago або Exited (137) 15 seconds ago, де 0 і 137 це коди виходу.

PORTS: показує, які порти призначені контейнеру.

NAMES: крім CONTAINER ID, кожен контейнер має ще й унікальне ім’я. Звертатися до нього можна і по ID, і по імені. При створенні контейнерів Docker автоматично призначає їм беззмістовні, але унікальні імена. Якщо хочете, щоб у вашого контейнера було обране вами ім’я, додайте до команди docker create або docker run (про неї пізніше) опцію –name (спереду подвійний дефіс).

Сподіваюсь, тепер ви краще розумієте вивід команди docker ps.

Контейнеризація - Docker

docker start

Ця команда запускає будь-який зупинений контейнер. Її синтаксис:

docker start [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

Для позначення контейнера можна брати або кілька перших унікальних символів його ID, або його ім’я. Кілька прикладів:

$ docker start 30986

У наведеному вище прикладі Docker запускає контейнер, ID якого починається з 30986.

$ docker start elated_franklin

А тут Docker запускає контейнер з ім’ям elated_franklin.

docker stop

Ця команда схожа на попередню. При зупинці контейнера до нього також можна звертатись або по імені, або по ID. Приклади:

$ docker stop 30986

Тут Docker зупиняє контейнер, ID якого починається з 30986.

$ docker stop elated_franklin

Docker зупиняє контейнер з іменем elated_franklin.

docker restart

Ця команда Docker перезапускає будь-який контейнер. Синтаксис команди:

docker restart [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

До контейнера звертаємось так само, як і раніше.

$ docker restart 30986

Перезапуск контейнера з ID 30986.

$ docker restart elated_franklin

Перезапуск контейнера з ім’ям elated_franklin.

docker run

Ця команда спочатку створює контейнер, а потім запускає його. Коротше кажучи, це комбінація команд docker create і docker start. Синтаксис цієї команди:

docker run [options] IMAGE [commands] [arguments]

Синтаксис схожий на синтаксис команди docker create. Розглянемо приклади:

$ docker run ubuntu 
30fa018c72682d78cf168626b5e6138bb3b3ae23015c5ec4bbcc2a088e67520

У цьому прикладі Docker створює контейнер, використовуючи для цього останній образ Ubuntu, і одразу запускає його.

Якщо ми виконаємо вказану вище команду, контейнер запуститься і миттєво зупиниться: в нас не буде можливості з ним взаємодіяти.

Якщо нам потрібно взаємодіяти з контейнером, ми маємо додати опції -it, щоб команда docker run надала нам термінал. З його допомогою ми зможемо вводити потрібні команди цьому контейнеру. Ось приклад такої команди:

$ docker run -it ubuntu 
root@e4e633428474:/#

Щб вийти з контейнера, треба набрати exit у терміналі.

docker rm

Ця команда використовується для видалення контейнера. Її синтаксис:

docker rm [options] CONTAINER ID/NAME [CONTAINER ID/NAME…]

Приклад використання:

$ docker rm 30fa elated_franklin

У цьому прикладі однією командою ми кажемо Docker видалити 2 контейнера. Перший ми позначаємо символами його ID, а другий – вказавши його ім’я.

Увага: перш ніж видаляти контейнери, їх треба зупинити.

docker images

Ця команда виведе усі образи Docker, які є на вашому хості.

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql latest 7bb2586065cd 38 hours ago 477MB
httpd latest 5eace252f2f2 38 hours ago 132MB
ubuntu 16.04 9361ce633ff1 2 weeks ago 118MB
ubuntu trusty 390582d83ead 2 weeks ago 188MB
fedora latest d09302f77cfc 2 weeks ago 275MB
ubuntu latest 94e814e2efa8 2 weeks ago 88.9MB

Давайте розберемо вивід команди.

REPOSITORY: унікальне ім’я образу Docker.

TAG: кожен образ має унікальний тег. Зазвичай це версія образу, позначена набором цифр або комбінацією цифр і літер.

IMAGE ID: унікальний для кожного контейнера рядок, що складається з цифр і літер.

CREATED: показує час, що минув з моменту створення образу.

SIZE: показує розмір образу.

docker rmi

Ця команда дозволяє нам видаляти образи з Docker Host. Її синтаксис:

docker rmi [options] IMAGE NAME/ID [IMAGE NAME/ID…]

Приклади використання:

docker rmi mysql

Ця команда видалить з хоста образ з ім’ям mysql.

docker rmi httpd fedora

Тут будуть видалені одразу два образи: httpd і fedora.

docker rmi 94e81

Видалення образу, ID якого починається з 94e81.

docker rmi ubuntu:trusty

Ця команда видалить з хоста образ з ім’ям ubuntu і тегом trusty.

Ми розглянули кілька основних команд Docker, але є і багато інших.

Висновки

Контейнеризація отримала заслужену увагу зовсім нещодавно, хоча існує вже досить тривалий час. Деякі топові тех-компанії, такі як Google, Amazon Web Services (AWS), Intel, Tesla і Juniper Networks, мають власні версії движків контейнерів. Вони дуже широко застосовують їх у складанні, запусках, управлінні і дистрибуції своїх додатків.

Docker це потужний движок контейнеризації, який може запропонувати вам дуже багато. Ми розглянули його лише поверхово, а в ньому є, що вивчати:

  • команди (більш потужні, ніж розглянуті тут)
  • образи (створення власних образів)
  • Docker Networking (налаштування мереж)
  • Docker Services (групування контейнерів, що використовують один образ)
  • Docker Stack (групування сервісів за додатком)
  • Docker Compose (інструмент для управління кількома контейнерами і для їх запуску)
  • Docker Swarm (групування і управління однією або великою кількістю машин, на яких запущено docker)
  • І багато іншого…

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

Для абсолютних новачків я раджу ось цей курс – він спеціально розроблений для початківців.

Якщо у вас вже є досвід роботи з Docker і ви хочете розширити свої знання, можете записатися на цей курс. Там розглядаються більш просунуті теми, що мають відношення до Docker.

Docker безумовно стане в нагоді вам в майбутньому, його застосування тільки набирає обертів. Час і гроші, витрачені на його вивчення, не пропадуть даром.

2 коментарі

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *

Back to Top