Docker Vocabulary: 30 Essential Terms for Containerization (англійською)

Вивчіть основний словниковий запас Docker — штампи, контейнери, файли Docker, томи, мережі, багатоетапні збирання і понад 20 інших термінів з поясненнями для розробників.

Docker змінив те, як ми створюємо, доставляємо і запускаємо програмне забезпечення. Якщо ви працюєте в сучасній команді розробників, ви щодня стикаєтеся з Docker — у локальних розробках, CI- конвеєрах і виробничих розгортаннях. Цей посібник містить 30 основних термінів з чіткими визначеннями і прикладами реальних розмов.


Зображення і контейнери

Image

** штамп ** Docker — це шаблон лише для читання, який містить все, що потрібно для запуску програми: ОС, середовище виконання, залежності і ваш код. Образ побудований з Dockerfile і зберігається в реєстрі. Він не виконується самостійно — ви створюєте контейнери з його допомогою.

«Витягнути останнє зображення перед запуском тестів: docker pull myapp:latest.» Образ має 1,2 ГБ — давайте оптимізуємо його за допомогою багатоетапної збірки

Container

** контейнер ** — це запущений екземпляр штампу. Він ізольований від вузла та інших контейнерів (відокремлена файлова система, мережа та процесне середовище), але поділяє ядро вузла ОС. Типово, контейнери є ефемерними — коли вони зупиняються, їх дані зникають, якщо ви не використовуєте том.

«Запустити контейнер у відокремленому режимі: docker run -d myapp:latest.» «Контейнер впав — перевірте журнали з docker logs <container-id>

Tag

** Мітка ** — це мітка, яку застосовують до зображення для ідентифікації певної версії. Типовим мітки є latest, але ви завжди повинні мітки зображень з значущою версією (наприклад, SHA git commit або номер версії).

«Позначте зображення з SHA-коммітом, щоб ми могли точно відстежити, який код працює в виробництві» «Уникайте покладатися на latest у виробництві — він змінюється беззвучно, коли ви створюєте новий образ»

Registry

** Реєстр ** — це система зберігання і розповсюдження образів Docker. Зображення надсилаються до реєстру і витягуються з нього.

«Підштовхнути зображення до реєстру після збирання CI: docker push myrepo/myapp:v1.2.0

Докер-хаб

** Docker Hub ** — типовий публічний реєстр. Він містить мільйони офіційних і спільних зображень — Node.js, Postgres, Nginx і багато інших.

«Використовуйте офіційний образ Postgres з Docker Hub як базу для нашого сервісу бази даних.»

Layer

Образи Docker складаються з шарів. Кожна інструкція в Dockerfile створює новий шар. Шари кешуються — якщо шар не змінився, Docker повторно використовує кешовану версію, що робить збирання швидшими.

«Покладіть RUN npm install перед COPY . ., щоб рівень залежності був кешований і не перевстановлювався при кожній зміні коду» «Збирання повільне, тому що крок COPY анульовує кеш і змушує виконати повний npm install


Файл Docker

FROM

** FROM ** встановлює базовий штамп для наступних інструкцій. Кожен Dockerfile починається з FROM.

Використовуйте FROM node:20-alpine замість FROM node:20 — альпійський варіант набагато менший

RUN

** RUN ** виконує команду під час збирання штампу. Кожна інструкція RUN створює новий шар.

Об’єднайте декілька команд RUN в одну з &&, щоб зменшити кількість шарів

COPY

** COPY ** копіює файли з контексту збирання (ваш каталог проекту) до штампу.

«Використовуйте COPY package*.json ./ перед копіюванням решти коду, щоб встановлення залежностей було кешовано.»

EXPOSE

** EXPOSE ** документи, на яких контейнер слухає. Це інформаційне — вам все одно потрібно буде відобразити порт за допомогою -p під час запуску контейнера.

EXPOSE 3000 повідомляє будь-кому, хто читає Dockerfile, що програма слухає на порту 3000.”

CMD

** CMD ** вказує типову команду, яку слід виконувати під час запуску контейнера. Його можна перезапустити за docker run часу.

«CMD є node server.js — ви можете перезаписати його з bash, щоб отримати оболонку всередині контейнера»

ENTRYPOINT

** ENTRYPOINT ** вказує виконавчий файл, який завжди буде запущено у контейнері. На відміну від CMD, його не легко перезаписати. Використовуйте цей параметр, якщо контейнер завжди має виконувати певний бінарний файл.

«Ми використовуємо ENTRYPOINT, тому контейнер завжди запускає наш двійковий файл програми, незалежно від будь-яких додаткових аргументів, які були передані»


Збудувати контекст

Збудувати контекст

** context build ** — це набір файлів, які Docker надсилає фоновій службі під час запуску docker build. Типово, це буде поточний каталог. Великі контексти збирання (з node_modules, .git, тощо) сповільнюють збирання.

«Додати node_modules до .dockerignore — немає ніяких причин включати його в контекст збирання»

.dockerignore

** .dockerignore ** працює так само, як .gitignore — виключає файли і каталоги з контексту збирання. Завжди виключайте node_modules, .git, і секрети.

Множинне будівництво

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

«Фінальний образ містить тільки скомпільований бінарний файл — все інше було відкинуто в багатоетапній збірці» «Ми перейшли від 900 МБ образу до 60 МБ за допомогою багатоетапної збірки»

Distroless

Не дистрибутивні штампи містять лише програму і її залежності часу виконання — без оболонки, без менеджера пакунків, без інструментів ОС. Вони менші і мають набагато меншу атакуючу поверхню.

«Продукційний образ не має дистрибутиву — ви не можете виконувати в ньому, тому переконайтеся, що ваші перевірки журналювання і стану в порядку.»


Рух і мережа

Volume

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

«Змонтувати том для каталогу даних бази даних, щоб він зберігся, коли контейнер буде відновлений.» «Використовуйте названий том для бази даних — анонімні томи важко управляти.»

Мережевий місток / вузол / накладання

Docker підтримує декілька мережевих драйверів:

  • ** Bridge ** — типове значення. Контейнери, що знаходяться у одній мережі мосту, можуть спілкуватися між собою; мережа ізольована від вузла.
  • ** вузол ** — вилучає мережеву ізоляцію; контейнер ділиться мережевим стеком вузла. Швидше, але менш безпечно.
  • ** Накладання ** — з’ єднує контейнери у декількох вузлах. Використовується в Docker Swarm і Kubernetes.

“Обидва контейнери знаходяться в одній мережі мосту, тому вони можуть досягти один одного за назвою контейнера.” «Використовуйте накладну мережу, щоб дозволити контейнерам на різних вузлах спілкуватися.»

Докер Композит

Docker Compose визначає і запускає багатоконтейнерні програми за допомогою файлу docker-compose.yml. Це стандартний інструмент для локальних середовищ розробки.

«Запустити весь стек з docker compose up -d — це запускає додаток, базу даних і Redis разом» «docker-compose.yml визначає послуги, обсяги і мережі для місцевого середовища.»

Healthcheck

Інструкція ** HEALTHCHECK ** у файлі Dockerfile (або Docker Compose) вказує Docker, як перевірити, чи є контейнер здоровим. Docker періодично запускає перевірку і позначає контейнер healthy або unhealthy.

Додати HEALTHCHECK до Dockerfile, щоб Docker знав, коли програма готова приймати трафік

Толкать и тащить

** Push ** вивантажить зображення до реєстру. ** Pull ** звантажить зображення з реєстру.

«Конвейєр розгортання створює образ, відсилає його до реєстру, а потім сервер витягує і запускає нову версію.»


Як використовувати цю функцію в прикладі

В местном развитии:

“Запустити docker compose up для запуску середовища. База даних і Redis запускаються автоматично»

В CI/CD:

Конвейєр створює зображення, запускає тести всередині контейнера, а потім відсилає зображення до ECR, якщо всі тести пройшли

** В перегляді коду: **

«Інструкція COPY . . занадто рано — пересунути її після встановлення залежностей, щоб кеш працював правильно»

В ответ на инцидент:

«Контейнер був OOMKilled — він досяг свого обмеження пам’яті. Або збільшити обмеження або дослідити використання пам’яті.”

** При запуску когось: **

“Контейнер - це лише ізольований процес. Зображення є проектом; контейнер є запущеним екземпляром — як клас проти об’єкта.”

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

Поширені запитання

Про що ця стаття "Docker Vocabulary: 30 Essential Terms for Containerization (англійською)"?

Вивчіть основний словниковий запас Docker — штампи, контейнери, файли Docker, томи, мережі, багатоетапні збирання і понад 20 інших термінів з поясненнями для розробників.

Чи безкоштовна ця стаття?

Так. Усі статті на CoderSlingo, включно з цією, доступні безкоштовно без реєстрації.

Скільки часу займає читання "Docker Vocabulary: 30 Essential Terms for Containerization (англійською)"?

Приблизно 9 min.