Перейти до вмісту

Docker

Матеріал з K2 ERP Wiki

істотно: Docker — сильний інструмент, але не кожен проєкт потребує контейнеризації.; :contentReference [oaicite:5]{index=5}

Контейнер зазвичай містить:

Тематичні мітки

Bind mounts корисні для:

Docker дає ізоляцію, але контейнер не є собою абсолютним security boundary.; -v pgdata:/var/lib/postgresql/data \ FROM node:22-alpine

</div>

<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">

 build: .; Docker у production потребує дисципліни.;== Docker Image ==

* build image;
* run tests in container;
* run database for integration tests;
* push image to registry;
* deploy by tag or digest;
* scan image;
* generate SBOM;
* promote image between environments;
* rollback.; Вона лише пакує й запускає застосунок зручніше.; Docker добре підходить, якщо потрібно:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

Тести піднімають тимчасову базу даних у контейнері, проганяють сценарії й видаляють середовище після завершення.; Вона надає можливість пакувати застосунки з їхніми залежностями в images, запускати їх як containers, описувати середовище через Dockerfile і Docker Compose, використовувати registries, автоматизувати CI/CD і спрощувати шлях від локальної розробки до production.; * Документація щодо containers, images, registries, volumes, networks, BuildKit, multi-stage builds, CI/CD, Kubernetes, Docker Swarm, SBOM і container security.; Сценарії:
<syntaxhighlight lang="dockerfile">
'''Контейнер''' — це ізольований бізнес-процес або група процесів, які запускаються з Docker image.; '''Практична роль:''' якщо завтра знайдуть уразливість у бібліотеці, SBOM допоможе оперативно зрозуміти, чи є собою вона у вашому image.; Офіційна документація описує Docker Engine як open source containerization technology for building and containerizing applications.;<syntaxhighlight lang="dockerfile">
Kubernetes краще для:
== Root user у контейнері ==
== SBOM ==
|-
| Ізоляція
| На рівні ОС і namespaces
| Повна guest OS через hypervisor
|-
| Розмір
| Зазвичай менший
| Зазвичай більший
|-
| Старт
| Швидкий
| Повільніший
|-
| Kernel
| Ділить kernel із host
| Має власне guest OS kernel
|-
| Типовий сценарій
| Application packaging
| Повна ізольована ОС
|}

</div>
</div>
</div>

<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

'''Критично:''' якщо secret потрапив у image layer, просте видалення файлу в наступному Dockerfile-кроці має змогу не прибрати його з історії.; * Контейнер має змогу стартувати за секунди, бо не завантажує повну guest OS як VM.; Контейнер має власну файлову систему, network namespace, process namespace і набір налаштувань, але використовує ядро host-системи.; postgres:18

* license compliance;
* vulnerability management;
* supply chain security;
* audits;
* incident response;
* dependency tracking;
* enterprise governance;
* customer requirements.; * `latest` — це без ускладнень tag, а не гарантія найкращої або стабільної версії.; '''HEALTHCHECK''' надає можливість Docker або orchestrator зрозуміти, чи контейнер здоровий.; Іноді найкращий перший крок — без ускладнень добре контейнеризований моноліт.; :contentReference [oaicite:1]{index=1}
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

 POSTGRES_USER: app

=== Production deployment ===

Docker застосовується для:

BuildKit дає:
docker stop container_name
</div>
COPY .; * кожен сервіс має свій image;
* незалежні dependencies;
* простіше scaling;
* CI/CD по сервісах;
* isolation;
* легше локально підняти stack через Compose;
* deployment через Kubernetes або інший orchestrator.; '''Bind mount''' підключає директорію host-системи в контейнер.;{{SEO
|title=Docker — платформа контейнеризації для застосунків, образів, Dockerfile, Compose, Docker Engine і DevOps
|description=Docker — Wiki-стаття про платформу контейнеризації для розробки, доставки й запуску застосунків. Розглянуто Docker Engine, Docker Desktop, Docker CLI, Dockerfile, Docker Image, Docker Container, Docker Compose, Docker Hub, registry, volumes, networks, BuildKit, multi-stage builds, Dockerfile best practices, Docker Swarm, Kubernetes, безпеку, CI/CD, DevOps, переваги, обмеження, цікаві факти і хороші практики.
|keywords=Docker, Docker Engine, Docker Desktop, Docker CLI, Dockerfile, Docker Image, Docker Container, Docker Compose, Docker Hub, containerization, containers, container image, registry, volume, Docker network, BuildKit, multi-stage build, Docker Compose file, Docker Engine 29, DevOps, CI/CD, Kubernetes, Docker Swarm, container security
|alternativeTo=віртуальні машини для легших application packaging сценаріїв; ручне встановлення залежностей на сервер; Vagrant для частини dev environment задач; system packages без ізоляції; Kubernetes для простих локальних сценаріїв; Podman у Docker-compatible workflows; LXC для application container packaging; bare-metal deployment без reproducibility; складні shell scripts для розгортання застосунків
}}

* контейнер не є собою повною VM;
* security boundary не абсолютний;
* storage для stateful apps складний;
* networking має змогу заплутувати;
* Docker Desktop має змогу споживати багато ресурсів;
* неправильні images можуть бути небезпечними;
* secrets без зайвих зусиль випадково включити в image;
* production потребує orchestration і monitoring;
* debugging іноді складніший;
* Windows/macOS використовують додатковий virtualization layer;
* root і privileged containers створюють ризики;
* image bloat має змогу уповільнювати builds і deploy.; * Docker Engine documentation.; * Docker Engine;
* Docker CLI;
* Docker Compose;
* GUI;
* Kubernetes у частині сценаріїв;
* інтеграцію з файловою системою;
* керування images і containers;
* extensions;
* конфігурація resources;
* інтеграцію з WSL 2 на Windows.; Монолітний застосунок додатково можна контейнеризувати.; volumes:
WORKDIR /app
</div>

Бази даних можна запускати в Docker, особливо для локальної розробки й тестів.; '''Multi-stage build''' надає можливість мати кілька етапів у Dockerfile й переносити в фінальний image тільки потрібні файли.; Docker популяризував підхід, де застосунок описується через Dockerfile, збирається в image, пушиться в registry і запускається через одну команду.; POSTGRES_DB: appdb

Docker і бази даних

переважні аспекти Docker

Практична роль: цей Compose-файл піднімає застосунок і базу як один локальний stack.; * Docker Build documentation.; Критерій Docker Compose застосовується для: істотно: tag має змогу змінитися, а digest вказує на конкретний вміст.; LXC

image: postgres:18

Найлюдяніший факт: Docker став популярним не з цієї причини, що контейнери були новими, а з цієї причини, що він зробив їх зрозумілими для звичайного розробника.; Офіційна документація Docker описує Docker як open platform for developing, shipping, and running applications.;</syntaxhighlight>

HEALTHCHECK --interval=30s --timeout=3s \

Docker Engine — це основна технологія Docker для створення й запуску контейнерів.; * Docker security documentation.;== .dockerignore ==

volumes:
  • захисту host;
  • стабільності;
  • multi-service environments;
  • production isolation;
  • тестування поведінки при нестачі ресурсів;
  • cost control.; USER app
  • base image;
  • installed packages;
  • application files;
  • dependencies;
  • environment variables;
  • metadata;
  • default command;
  • exposed ports;
  • filesystem layers.;</syntaxhighlight>

Docker надає можливість зібрати застосунок разом із його залежностями в образ і запускати його однаково на різних машинах: ноутбуці розробника, тестовому сервері, CI/CD, хмарі або production-інфраструктурі.; * Docker image складається з шарів, з цієї причини порядок інструкцій у Dockerfile впливає на cache і швидкість build.; Не монтуйте чутливі директорії без потреби.; * Docker добре підходить і для монолітів, і для мікросервісів.; Офіційна довідка Docker описує Compose file як файл, що визначає multi-container application.; depends_on:

  • писати logs у stdout/stderr;
  • збирати logs централізовано;
  • не зберігати важливі logs лише в контейнері;
  • контролювати log rotation;
  • не писати secrets у logs.; Головна думка: Docker — це не без ускладнень спосіб “запустити щось у контейнері”.; * локальної розробки;
  • збірки images;
  • простих контейнерів;
  • Compose-сценаріїв;
  • навчання container basics.; Якщо він залежить від випадкових ручних кроків, Docker втрачає одну зі своїх головних переваг.;</syntaxhighlight>

Можливі проблеми:

</syntaxhighlight>

Docker не є собою магічною заміною архітектури, безпеки, backup або моніторингу.; db_data:

WORKDIR /app

</syntaxhighlight>

Контейнери можуть обмежувати CPU і memory.; Практична роль: image — це “зліпок” застосунку, а container — запущений екземпляр цього зліпка.;

services:
Scanning сприяє перевіряти:
Resource limits корисні для:

docker images
Приклад:
Docker Engine є собою open source containerization technology.; Приклад:
</div>
Dockerfile має змогу містити:
'''SBOM''' або '''Software Bill of Materials'''  список компонентів у software artifact, зокрема container image.; * Docker daemon;
* Docker CLI;
* REST API;
* container runtime;
* image management;
* networking;
* volumes;
* build functionality;
* registry interaction.; * network complexity;
* distributed tracing;
* service discovery;
* versioning;
* observability;
* latency;
* data consistency;
* operational complexity.; Docker
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

Основні команди:

'''Висновок:''' Docker зручніший для пакування застосунків, а LXC  для сценаріїв, ближчих до легкої віртуалізації Linux-систем.; Docker Engine є собою open source container engine, а Docker Desktop  окремий desktop-продукт із власними умовами використання.; Для публікації потрібен `-p` або відповідна Compose-конфігурація.;== Контейнер ==

* баз даних;
* uploaded files;
* кешів;
* persistent data;
* logs у частині сценаріїв;
* shared data між контейнерами;
* local development state.; * config;
* connection strings;
* feature flags;
* environment-specific settings;
* runtime behavior.; Image складається з шарів і зазвичай створюється з Dockerfile.; {| class="wikitable"
Volumes використовують для:

CMD ["python", "app.py"]
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Приклад логіки:
Docker має змогу бути не найкращим вибором, якщо:
Це корисно для:

</div>
<syntaxhighlight lang="bash">
docker run --privileged some-image

Docker має власну network model.; * bridge;
* host;
* none;
* overlay;
* macvlan;
* custom bridge networks.; * Docker зробив контейнери масовим developer tool, хоча Linux-контейнери існували й до нього.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

</div>
== Docker Network ==
<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
!; Застосунок деплоїться як image з конкретним tag або digest, а rollback означає повернення до попереднього image.; * Docker Engine release notes.; FROM golang:1.24-alpine AS build

</div>
Docker надає можливість переглядати logs контейнера.;</div>

Docker корисний не лише для мікросервісів.; Docker має обмеження.; Для компанії це потрібно перевіряти окремо.; Для production часто краще pin version або digest, а не покладатися на `latest`.; * Найбільша сила Docker  не “магічна ізоляція”, а повторюваність середовища.;== Docker CLI ==

'''Практична роль:''' Docker робить CI/CD чистішим, бо pipeline функціонує з конкретним artifact  container image.; - db
Push to registry

docker version

!; '''LXC'''  Linux containers на нижчому рівні, які часто більше схожі на lightweight system containers.; Run tests

== Docker і LXC ==

* Docker Hub;
* GitHub Container Registry;
* GitLab Container Registry;
* Amazon ECR;
* Google Artifact Registry;
* Azure Container Registry;
* self-hosted registry;
* Harbor;
* private enterprise registry.;== Приклади сценаріїв використання ==

Приклад:

Найлюдяніший факт: Docker — це спосіб перестати сперечатися, у кого яка реліз Node, Python або PostgreSQL стоїть локально, і без ускладнень запустити однакове середовище.;== Dockerfile ==

Потрібно продумати:

Проста різниця: Docker сприяє створити й запустити контейнер, а Kubernetes керує великою кількістю контейнерів у кластері.;
node_modules
.git

'''Критично:''' не монтуйте Docker socket у контейнер без дуже вагомої причини.;== Docker Swarm ==
|-
| технічна архітектура
| Зазвичай daemon-based
| Daemonless підхід
|-
| Rootless
| Підтримується, але історично Docker часто асоціювали з daemon
| Сильний rootless focus
|-
| CLI
| Docker CLI
| Docker-compatible команди в багатьох сценаріях
|-
| Ecosystem
| Дуже широка
| Сильна в Linux/Red Hat ecosystem
|}

'''Практична роль:''' registry  це як складський облік контейнерних образів, з якого production або CI/CD бере потрібні версії.; volumes:
!; Потрібно перевіряти джерело, теги, актуалізація й репутацію image.;</div>
`--privileged` дає контейнеру дуже широкі права.; * застосунок;
* runtime;
* бібліотеки;
* конфігурацію;
* environment variables;
* entrypoint;
* filesystem layer;
* exposed ports.;

</syntaxhighlight>

environment:

</syntaxhighlight>

  • однакових toolchains;
  • швидкого onboarding;
  • VS Code Dev Containers;
  • ізоляції dependencies;
  • різних версій мов;
  • навчальних середовищ;
  • reproducible development;
  • командної роботи.; Краще використовувати:

переважні аспекти:

Docker дуже часто застосовується в CI/CD.; Вони корисні для:

Docker Hub застосовується для: </syntaxhighlight> Типові network modes:

істотно: Dockerfile має бути відтворюваним.; Контейнер із доступом до Docker socket часто фактично отримує контроль над host.; * використовувати `.dockerignore`;

  • не зберігати secrets в image;
  • не використовувати `latest` у production без контролю;
  • робити multi-stage builds;
  • запускати бізнес-процес від non-root user;
  • мінімізувати base image;
  • оновлювати base images;
  • сканувати images;
  • використовувати healthchecks;
  • писати logs у stdout/stderr;
  • використовувати volumes для persistent data;
  • обмежувати resources;
  • не монтувати Docker socket без потреби;
  • pin versions або digests;
  • використовувати CI/CD для build і push;
  • документувати Compose setup;
  • видаляти непотрібні images і volumes обережно.; * Docker Engine;
  • Docker CLI;
  • Docker Desktop;
  • Docker Compose;
  • Docker Hub;
  • Docker Scout;
  • Docker Hardened Images;
  • commercial services.; Для реального використання потрібно розрізняти open source компоненти, desktop-продукти, hosted services і commercial features.;

postgres:18

Docker і ліцензії

Підказка: найкращий перший Docker-сценарій — підняти локальні залежності проєкту через Compose: базу, кеш і застосунок.; * services;

  • replicated containers;
  • overlay networks;
  • rolling updates;
  • secrets;
  • configs;
  • простіших cluster deployments.;

Приклад: `.dockerignore` виключає файли з build context.; .; {| class="wikitable"

Приклад простого Docker Compose

docker info

Docker і Podman

Deploy to staging

BuildKit — сучасний backend для збірки Docker images.; FROM alpine:3.22 EXPOSE 3000 USER app

nginx:1.27-alpine

Небезпека: найболючіша помилка Docker-початківця — видалити контейнер із важливими даними й тільки потім дізнатися, що volume не був налаштований.; істотно: `EXPOSE` у Dockerfile документує порт, але не завжди відкриває його назовні.; * Dockerfile описує не тільки файли image, а й startup behavior контейнера.; Це комфортно, але ризиково.; * Docker Documentation.;</syntaxhighlight>

Integration tests

docker run -d \ Docker image tag — це людська назва версії, як ілюстрація: Docker став одним із головних інструментів сучасного DevOps, cloud-native розробки, microservices, CI/CD і локальних середовищ розробки.; :contentReference [oaicite:2]{index=2}

CI/CD

Цікаві факти про Docker

істотно: не кожен image у registry є собою безпечним або офіційним.; Висновок: Docker має найширше developer adoption, а Podman часто цікавий там, де важливий daemonless і rootless Linux-підхід.; * Docker reference documentation.;== Docker і мікросервіси ==

  • production orchestration;
  • multi-node clusters;
  • service discovery;
  • autoscaling;
  • complex deployments;
  • cloud-native platforms.; app:
  • secret manager;
  • Docker secrets у Swarm-сценаріях;
  • Kubernetes Secrets із додатковим захистом;
  • cloud secret managers;
  • BuildKit secrets для build-time secrets;
  • least privilege credentials.; RUN npm ci --omit=dev
--name db \

Deploy to production

dist

Краще: Приклад небезпечного запуску:

web:
  • локальних dev environments;
  • multi-service apps;
  • test stacks;
  • databases;
  • queues;
  • cache;
  • reverse proxy;
  • small deployments у частині сценаріїв.; Він знаходить відомі проблеми, але не замінює code review, тестування й threat modeling.; app:

переважні аспекти для моноліту: Приклад:

Практична роль: Docker CLI — це центральний інструмент розробника для швидкої роботи з контейнерами.; Приклад:

  • однакове dev/test/prod середовище;
  • оперативно піднімати залежності;
  • пакувати застосунок із dependencies;
  • запускати integration tests;
  • використовувати CI/CD;
  • створювати microservices;
  • запускати локальний PostgreSQL або Redis;
  • робити reproducible builds;
  • деплоїти container images;
  • працювати з Kubernetes;
  • спростити onboarding;
  • ізолювати toolchains.; image: postgres:18

Docker Image — це шаблон, з якого запускаються контейнери.; До Docker контейнеризація вже існувала у світі Linux забезпечується через Docker не винайшов саму ідею контейнерів, але зробив її масовою; додатково реалізовано але була складнішою, менш зручною й не мала такого простого developer experience.; * Dockerfile reference.; POSTGRES_USER: app

Registry зберігає:

docker pull nginx:alpine

Практична роль: у контейнерному світі лог краще сприймати як потік подій, який забирає зовнішня платформа логування.; COPY .;== Цікавий факт == docker run -p 8080:80 nginx:alpine WORKDIR /src Потрібно контролювати: Приклад:

- db

Docker і віртуальні машини

Висновок

Практична роль: Docker Engine — це “двигун”, який реально створює, запускає, зупиняє й керує контейнерами.; Висновок: Docker легший і швидший для застосунків, а VM краще, коли потрібна повна ізоляція ОС або інша guest operating system.;

Практична роль: Docker network надає можливість контейнерам спілкуватися між собою без ручного прописування IP-адрес.; !; Run checks

Docker зазвичай фокусується на application containers.;</syntaxhighlight>

CMD wget -qO- http://localhost:3000/health || exit 1
* застосунок дуже простий і не має складних dependencies;
* потрібна повна VM-ізоляція;
* потрібна GUI-heavy desktop application без спеціальної підготовки;
* команда не готова вчити container basics;
* production storage не продуманий;
* потрібно запускати системні сервіси як у повній ОС;
* security policy забороняє Docker daemon;
* потрібна дуже проста static deployment без runtime;
* проблему можна вирішити пакетним менеджером або single binary.;
; Приклад:

</syntaxhighlight>

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

== Типові помилки початківців ==

'''Проста аналогія:''' контейнер  це не цілий будинок, а окрема кімната з потрібними інструментами, яка ділить фундамент із будівлею.; '''Практична роль:''' запуск від non-root user зменшує ризики, якщо застосунок або dependency має вразливість.; '''Головне правило:''' хороший Docker-проєкт має маленький image, зрозумілий Dockerfile, безпечні secrets, reproducible build і чіткий шлях до deployment.; db:

* database passwords;
* API keys;
* tokens;
* private keys;
* certificates;
* cloud credentials.; Docker Engine має client-server архітектуру.; !; Docker

== Приклад безпечнішого Dockerfile-фрагмента ==
Docker-проєкти часто працюють із секретами:
Docker CLI застосовується для:

.env

'''Docker Desktop'''  це застосунок для Windows, macOS і Linux, який спрощує використання Docker на робочому комп’ютері.; FROM python:3.13-slim
<syntaxhighlight lang="dockerfile">
FROM node:22-alpine

'''Docker CLI'''  command-line інтерфейс для роботи з Docker.; docker rm container_name

* однакове середовище;
* простіший deploy;
* isolation dependencies;
* rollback через image tag;
* CI/CD;
* локальна розробка програмного забезпечення;
* staging parity;
* менше “works on my machine”.; Docker Engine version 29 є собою актуальною гілкою release notes, у якій Docker публікує зміни, known issues і fixes.;=== Dev container ===

== Docker у production ==

'''Docker Swarm'''  вбудований у Docker підхід до orchestration, який надає можливість керувати кластером Docker nodes.;</div>
Погані практики:
my-app:2026-05-09
Image містить:
 image: redis:latest
</div>
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

== Приклад простого Dockerfile для Python ==

* запуску контейнерів;
* збірки образів;
* перегляду логів;
* керування volumes;
* керування networks;
* роботи з registry;
* debugging;
* автоматизації;
* CI/CD.; '''Docker'''  це одна з найважливіших платформ контейнеризації для сучасної розробки.; :contentReference [oaicite:4]{index=4}
'''істотно:''' Docker Swarm простіший за Kubernetes, але має меншу ecosystem і менше поширення в сучасному cloud-native production.; .; * Docker Compose file reference.; Podman

 build: .; Для Compose сервіси в одній мережі можуть звертатися один до одного за service name.; Багато container images за замовчуванням запускають бізнес-процес від root.;<syntaxhighlight lang="yaml">

Але Docker ecosystem ширший за Docker Engine:

 environment:
COPY requirements.txt .; '''Практична роль:''' BuildKit робить Docker builds швидшими, безпечнішими й краще придатними для CI/CD.; *.log
<syntaxhighlight lang="bash">

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

* менших build contexts;
* швидших builds;
* захисту secrets;
* чистіших images;
* уникнення випадкового копіювання зайвого.; Критерій
<syntaxhighlight lang="yaml">
Для production потрібно уважно продумати:

 redis:

 - "3000:3000"

</div>

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
</div>
docker logs app

== Registry ==

* порт 8080 на host;
* перенаправляється в порт 80 контейнера.; Він легший, швидше стартує й використовує менше ресурсів, але має іншу модель ізоляції.; Це спосіб зробити середовище застосунку відтворюваним, переносимим і керованим.; environment:
POSTGRES_PASSWORD: secret
depends_on:

розробників.; Virtual machine

  • копіювати весь проєкт без `.dockerignore`;
  • класти `.env` у image;
  • використовувати `latest` скрізь;
  • запускати усе від root;
  • робити один гігантський image;
  • не розуміти різницю між image і container;
  • втрачати інформаційні дані через відсутність volume;
  • плутати container port і host port;
  • не читати logs;
  • не налаштовувати healthcheck;
  • використовувати privileged container без потреби;
  • монтувати Docker socket у контейнер;
  • не оновлювати base images;
  • не сканувати images;
  • не розуміти, що Compose не дорівнює Kubernetes.; Для секретів краще використовувати secret manager або спеціальні механізми платформи.; Приклад:
docker build -t my-app .; :contentReference [oaicite:3]{index=3}

WORKDIR /app
== Bind mounts ==

WORKDIR /app
docker run hello-world
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

Docker часто застосовують, коли потрібно для створення container images, які потім запускаються в Kubernetes.; |-
| ключовий фокус
| Application containers
| System containers
|-
| Типовий image
| Один застосунок або сервіс
| Ближче до повної Linux-системи
|-
| Developer workflow
| Dockerfile, images, registry
| Більш системний контейнерний підхід
|}

<syntaxhighlight lang="dockerfile">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
</div>

 DATABASE_URL: postgres://app:secret@db:5432/appdb

Для production істотно:

<syntaxhighlight lang="bash">

* base images;
* vulnerability scanning;
* non-root users;
* capabilities;
* seccomp;
* AppArmor або SELinux;
* read-only filesystem;
* secrets;
* network exposure;
* mounted volumes;
* Docker socket;
* image provenance;
* supply chain;
* registry access;
* updates.; '''Практична порада:''' якщо застосунку не потрібен root, не запускайте його від root.; Для важливих даних потрібні volumes, backups і перевірений restore.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

Приклад:
'''істотно:''' Docker Engine і Docker Desktop — не одне й те саме.; * images;
* tags;
* digests;
* layers;
* metadata;
* signatures у відповідних сценаріях;
* vulnerability scan results у частині платформ.; * Docker overview.; Digest — це content-addressed ідентифікатор image.; '''Проста аналогія:''' multi-stage build — це як приготувати їжу на кухні, але в коробку покласти тільки готову страву, а не всю кухню.; * швидші builds;
* кращий cache;
* parallel build steps;
* secrets під час build;
* SSH forwarding;
* multi-platform builds;
* better output;
* advanced Dockerfile features;
* buildx.;== Dev containers ==
</div>
Scan image

'''Podman''' — альтернатива Docker для запуску контейнерів, популярна в Linux-середовищах.; * reproducible environments;
* швидкий запуск контейнерів;
* ізоляція залежностей;
* Dockerfile як infrastructure-as-code;
* Docker Compose для локальних stacks;
* велика ecosystem;
* Docker Hub і registries;
* CI/CD-friendly workflow;
* multi-stage builds;
* BuildKit;
* простіший onboarding;
* зручність для microservices;
* переносимість між середовищами;
* менше ручної інсталяції на сервері;
* зручність для тестування.; :contentReference [oaicite:6]{index=6}

'''Практична порада:''' Docker варто обирати, коли проблема звучить як “нам потрібне однакове середовище для запуску застосунку”.;

Code push

істотно: Docker полегшує мікросервіси, але не робить distributed systems простими.; - postgres_data:/var/lib/postgresql/data

build: .; Розробник запускає застосунок, PostgreSQL і Redis через Docker Compose, не встановлюючи всі залежності напряму в систему.; EXPOSE 8000

BuildKit

db:
'''Docker volume'''  механізм для збереження даних поза життєвим циклом контейнера.; Docker Engine складається з:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
</div>

docker run --memory=512m --cpus=1.0 my-app:1.0

* локальної розробки;
* live reload;
* тестування;
* доступу до локальних файлів;
* dev containers;
* build tasks.; .; У production його потрібно уникати, якщо немає чіткої й перевіреної причини.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
'''Практична роль:''' Compose надає можливість підняти цілий маленький “світ застосунку” однією командою.; Приклад:

<syntaxhighlight lang="dockerfile">

Це означає:

Команда описує середовище розробки в контейнері, щоб усі мали однакові версії інструментів.; * Docker Hub documentation.; '''Помилка:''' думати, що Docker автономно робить застосунок безпечним, масштабованим і production-ready.; COPY package*.json ./

Приклад:

COPY package*.json ./

* створити non-root user;
* використовувати `USER`;
* мінімізувати capabilities;
* не запускати privileged container;
* не монтувати host filesystem без потреби;
* використовувати read-only root filesystem у частині сценаріїв.; Офіційна довідка Docker описує Dockerfile як файл, що визначає вміст і startup behavior одного контейнера.;<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">

<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
Registry має змогу бути:
Рекомендовано:

'''Цікавий факт:''' Docker не змушує переходити на мікросервіси.; services:
Kubernetes додає:
Воно корисне для:

'''істотно:''' для production краще додати non-root user, healthcheck, точні dependency versions і не копіювати зайві файли.;</div>

volumes:

* orchestration;
* monitoring;
* logging;
* backups;
* secrets;
* image scanning;
* healthchecks;
* restart policies;
* resource limits;
* network policies;
* storage;
* updates;
* rollback;
* registry availability;
* base image maintenance.; Compose зручний для локальної розробки, де застосунку потрібні кілька сервісів.;== Docker Compose ==

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

== Docker logs ==

</div>
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Приклад:
<syntaxhighlight lang="bash">
'''Docker Compose'''  інструмент для опису й запуску multi-container applications.; EXPOSE 3000

'''Практична порада:''' без resource limits один контейнер має змогу з’їсти більше пам’яті або CPU, ніж ви очікували.; Docker надає можливість відокремлювати застосунки від інфраструктури, щоб швидше доставляти програмне забезпечення.;<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
== Tags і digests ==

<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">

'''Практична роль:''' dev container сприяє новому розробнику стартувати не за день налаштувань, а за кілька команд.; .;== Docker і Kubernetes ==
переважні аспекти:

Порти дозволяють відкрити сервіс контейнера назовні.; docker run -e NODE_ENV=production -e PORT=3000 my-app:1.0
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
COPY .;== Хороші практики Docker ==

<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">

Docker-контейнери й virtual machines вирішують схожі, але різні задачі.;== Volumes ==
Docker краще для:
docker run --rm -v "$PWD":/app -w /app node:22-alpine npm test

== Environment variables ==

'''Container registry'''  це сховище для container images.; DATABASE_URL: postgres://app:secret@db:5432/appdb

<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">

COPY .;<syntaxhighlight lang="dockerfile">
</div>

RUN pip install --no-cache-dir -r requirements.txt

== Docker Desktop ==

Environment variables часто використовують для конфігурації контейнерів.; coverage

docker logs -f app

'''Критично:''' база даних у контейнері  це нормально, але інформаційні дані мають жити не “в контейнері”, а в правильно керованому storage з backup.;</div>

Сьогодні Kubernetes значно популярніший для великих production-сценаріїв, але Swarm має змогу бути простішим для невеликих Docker-native кластерів.; Healthcheck корисний для:
COPY --from=build /src/app /app/app
== Privileged containers ==

Це має змогу бути потрібно для деяких low-level або lab-сценаріїв, але в production зазвичай небажано.; Він дуже сильний у відтворюваності, пакуванні, ізоляції залежностей і developer experience, але потребує правильних практик: `.dockerignore`, non-root users, volumes для даних, image scanning, secrets management, healthchecks, resource limits і продуманий deployment.; '''істотно:''' healthcheck має перевіряти реальну готовність сервісу, а не без ускладнень факт, що бізнес-процес ще не завершився.; services:

'''істотно:''' bind mount дає контейнеру доступ до host-файлів.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
 ports:

</div>

</div>

Docker часто використовують у microservices architecture.;=== Локальна розробка програмного забезпечення web app ===

docker volume create pgdata

Добрі сценарії:

Головна перевага: Docker робить середовище застосунку частиною самого проєкту, а не усною інструкцією для адміністратора.; істотно: image scanning не гарантує безпеку.; docker run -p 8080:80 nginx:latest

  • менший final image;
  • менше build tools у production image;
  • менша attack surface;
  • чистіша структура;
  • швидші deployments.;== Docker Engine ==

docker pull nginx:latest

істотно: контейнеризація не замінює production-архітектуру.; Docker container

RUN go build -o app ./cmd/app Приклад: CMD ["node", "server.js"]

== Безпека Docker ==
== Загальний характеристика ==

<div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;">
<syntaxhighlight lang="bash">
</div>

<syntaxhighlight lang="text">

!; - db_data:/var/lib/postgresql/data
Build Docker image

Docker Hub — популярний registry для Docker images.;== Secrets ==

  • публікації images;
  • завантаження official images;
  • private repositories;
  • automated builds у частині сценаріїв;
  • image tags;
  • team collaboration;
  • base images;
  • open source images;
  • CI/CD.;== Обмеження Docker ==

docker ps

Container image scanning шукає відомі вразливості в base image і packages.;

Критично: privileged container сильно зменшує ізоляцію.; У документації встановлення Docker Engine згадується Apache License, Version 2.0.; Основні переважні аспекти Docker:

</syntaxhighlight>

- "8000:8000"
POSTGRES_DB: appdb

Контейнер не є собою повною віртуальною машиною.;== Ports ==

CI збирає Docker image, запускає тести, сканує image і пушить його в registry.;</syntaxhighlight>

Критично: якщо контейнер видалити, його writable layer має змогу зникнути.; ports:

  • `FROM`;
  • `WORKDIR`;
  • `COPY`;
  • `RUN`;
  • `ENV`;
  • `ARG`;
  • `EXPOSE`;
  • `CMD`;
  • `ENTRYPOINT`;
  • `USER`;
  • `HEALTHCHECK`.;

CI pipeline

  • local PostgreSQL;
  • test MySQL;
  • Redis для dev;
  • integration tests;
  • temporary databases;
  • demo environments.; SBOM корисний для:

docker pull postgres:18

істотно: ліцензування Docker Engine і умови Docker Desktop або Docker Hub можуть відрізнятися.; `.dockerignore` дуже важливий.; Саме ця простота зробила контейнери звичним інструментом навіть для невеликих команд.; docker buildx build --platform linux/amd64,linux/arm64 -t my-app:1.0 .; Основна ідея: Docker пакує застосунок і його залежності в контейнер, щоб він запускався передбачувано, а не “тільки на моєму комп’ютері”.; * локальної розробки;

  • запуску залежностей, як ілюстрація PostgreSQL, Redis або RabbitMQ;
  • CI/CD pipeline;
  • тестування;
  • microservices;
  • web applications;
  • API;
  • background workers;
  • build environments;
  • DevOps;
  • deployment;
  • cloud workloads;
  • Kubernetes images;
  • reproducible environments;
  • навчальних лабораторій;
  • ізоляції застосунків;
  • швидкого запуску сервісів.; postgres_data:
  • класти secrets у Dockerfile;
  • комітити `.env`;
  • передавати secrets через build args без захисту;
  • друкувати secrets у logs;
  • зберігати secrets у image layers;
  • використовувати один secret для всіх середовищ.; depends_on:
; Критерій
POSTGRES_PASSWORD: secret

docker pull redis:latest

Див.; додатково

Критично: secrets не варто бездумно зберігати в environment variables, особливо в shared environments.; * orchestration;

  • scheduling;
  • services;
  • deployments;
  • scaling;
  • rolling updates;
  • config maps;
  • secrets;
  • persistent volumes;
  • cluster management;
  • self-healing.; це платформа контейнеризації, яка сприяє розробляти, пакувати, доставляти й запускати застосунки в ізольованих середовищах, які називаються контейнерами виступає ключовою рисою Docker.; Поширені помилки:
  • volumes;
  • backups;
  • restore;
  • disk performance;
  • upgrades;
  • monitoring;
  • replication;
  • graceful shutdown;
  • data corruption risks;
  • orchestration.;

Критично: якщо `.env`, private keys або tokens потрапили в image layer, їх має змогу бути складно в цілому прибрати з історії image.; Docker Desktop зазвичай охоплює:

Коли Docker має змогу бути невдалим вибором

</syntaxhighlight>

Приклад: Приклад:

RUN addgroup -S app && adduser -S app -G app

  • monitoring;
  • restart policies;
  • orchestration;
  • load balancers;
  • production diagnostics;
  • zero-downtime deployment;
  • readiness/liveness logic у ширших платформах.;

У цьому прикладі `app` має змогу звертатися до `redis` за hostname `redis`.;== Multi-stage builds ==

- redis

</syntaxhighlight>

== Джерела ==

== Resource limits ==

 environment:
'''Перевага:''' Docker надає можливість описати середовище застосунку як код, а не як список ручних команд на сервері.; :contentReference [oaicite:7]{index=7}
* Docker Compose починався як зручний інструмент для локальних multi-container stacks, але став стандартною частиною багатьох dev workflows.; Але мікросервіси додають:

== Healthcheck ==
CMD ["./app"]
CMD ["node", "server.js"]
!;== Image scanning ==
== Docker і моноліт ==
Приклад:

</div>

== Docker Hub ==

== Коли варто використовувати Docker ==

* OS packages;
* language dependencies;
* CVE;
* outdated libraries;
* risky images;
* supply chain;
* policy compliance;
* SBOM.;
image@sha256:...;

RUN npm ci --omit=dev Dev container — контейнеризоване середовище розробки.; RUN addgroup -S app && adduser -S app -G app <syntaxhighlight lang="text">

Dockerfile — це файл інструкцій для збірки Docker image.; * Контейнеризація

Swarm має змогу використовуватися для: