Що Docker змінює у запуску програм

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

Ілюстрація до статті: Що Docker змінює у запуску програм

Оновлено:

«У мене працює, а на сервері — ні» — фраза, яка десятиліттями коштувала розробникам ночей. Програма залежить від версії мови, бібліотек, системних пакетів, змінних середовища; на іншій машині щось із цього інше, і все ламається. Docker розв’язує це, пакуючи програму разом з усім її оточенням у контейнер — стандартизований, переносний, відтворюваний. Ця стаття пояснює, що таке контейнери, чим вони відрізняються від віртуальних машин, як влаштований Docker і навіщо він людині, яка не пише код, а лише хоче запустити сервіс удома чи на VPS.

Образи, контейнери та шари

Контейнер — це ізольований процес (або група процесів), який бачить власну файлову систему, власну мережу й власний список процесів, але використовує ядро операційної системи хоста. Ізоляцію забезпечують механізми ядра Linux: namespaces (окремі простори імен для процесів, мережі, файлів, користувачів) і cgroups (обмеження процесора, пам’яті, диска). Контейнер стартує за частку секунди, бо не завантажує операційну систему — ядро вже працює.

Образ (image) — це «фотографія» файлової системи контейнера: програма, її залежності, налаштування. Образи будуються шарами: базовий шар (наприклад, мінімальний Debian чи Alpine), поверх — встановлені пакети, поверх — сама програма. Шари кешуються й перевикористовуються, тому десять образів на основі одного базового не займають місце десять разів. Образи публікуються в реєстрах (Docker Hub, GitHub Container Registry, приватні); docker pull nginx завантажує готовий образ вебсервера.

Dockerfile — рецепт збірки образу: з чого почати, що встановити, що скопіювати, яку команду запускати:

FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm ci --omit=dev
COPY . .
CMD ["node", "server.js"]

Той самий Dockerfile дає той самий образ на будь-якій машині — це і є відтворюваність.

Контейнери й віртуальні машини

Віртуальна машина емулює цілий комп’ютер із власною операційною системою: гігабайти на диску, хвилина на запуск, повна ізоляція на рівні обладнання. Контейнер ділить ядро з хостом: мегабайти, секунда, ізоляція на рівні процесів. Контейнери легші й швидші, ВМ — суворіше ізольовані. На практиці вони поєднуються: хмарний сервер — це ВМ, усередині якої працюють десятки контейнерів. Оскільки контейнери використовують Linux-ядро, Docker Desktop на Windows і macOS непомітно запускає невелику Linux-ВМ, всередині якої й живуть контейнери.

  • Однаковість середовищ. Розробка, тестування і продакшн запускають той самий образ; «у мене працює» перестає бути аргументом.
  • Ізоляція залежностей. Одна програма потребує Python 3.8, інша — 3.12, третя — специфічну версію бібліотеки; у контейнерах вони не конфліктують.
  • Просте розгортання. Запустити базу даних, Nextcloud, Home Assistant чи медіасервер — одна команда замість години налаштувань. Видалити — контейнер зникає, не лишаючи слідів у системі.
  • Масштабування. Треба більше потужності — запускаємо ще копії контейнера; оркестратори (Docker Compose для однієї машини, Kubernetes для кластерів) керують цим автоматично.

Docker Compose описує кілька контейнерів як одну систему в файлі compose.yaml: вебзастосунок, база даних, кеш, їхні мережі й томи. docker compose up піднімає все разом.

Дані й безпека

Файлова система контейнера тимчасова: видалили контейнер — дані зникли. Для того, що має жити, використовують томи (volumes) або прив’язку папок хоста — база даних пише в том, контейнер можна оновити чи перестворити, дані лишаються. Щодо безпеки: контейнер — не панацея. Процес з правами root у контейнері за вразливості ядра може вийти на хост; тому запускають від непривілейованого користувача, не монтують сокет Docker у контейнери, беруть образи з офіційних джерел і оновлюють їх, бо базовий шар містить системні бібліотеки зі своїми вразливостями. Секрети (паролі, ключі) передають через змінні середовища чи менеджери секретів, не запікаючи в образ.

Як почати з Docker на своєму комп’ютері

  • Для домашнього сервера чи VPS Docker Compose — найпростіший спосіб запускати кілька сервісів, не засмічуючи систему.
  • Використовуйте офіційні або перевірені образи, фіксуйте версію тегом (postgres:16, не latest) і регулярно оновлюйте.
  • Усі дані — в томах; регулярно копіюйте їх, як будь-які дані.
  • Не запускайте контейнери від root без потреби; не публікуйте порти в інтернет без брандмауера й обґрунтування.
  • Тримайте Dockerfile і compose.yaml у системі контролю версій — це документація вашого середовища.

Часті запитання

Чи Docker — це єдина реалізація контейнерів?

Ні. Podman, containerd, LXC працюють з тими самими стандартами (OCI); образи Docker запускаються в них. Docker — найпоширеніший інструмент, не єдиний.

Чи повільніша програма в контейнері?

На Linux — практично ні, це звичайний процес із ізоляцією. На Windows/macOS накладні витрати від прихованої ВМ, особливо на файлових операціях.

Чи можна запустити Windows-програму в Docker на Linux?

Ні: контейнер використовує ядро хоста. Windows-контейнери існують, але лише на Windows-хостах. Для крос-платформного запуску потрібна віртуальна машина.

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

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