«Docker» - це набір компонентів, і розуміння їхньої ролі пояснює, чому образи, зібрані Docker, працюють у Kubernetes без Docker.
Стандарти OCI (Open Container Initiative):
- image spec - формат образу: шари, маніфест, конфігурація;
- runtime spec - як запустити контейнер з розпакованого образу;
- distribution spec - протокол реєстрів (push/pull).
Образ, зібраний Docker, - звичайний OCI-образ. Його запускають containerd, CRI-O, Podman, Kubernetes.
Шари виконання:
docker CLI → dockerd (Docker Engine) → containerd → containerd-shim → runc → процес
- docker CLI - клієнт; надсилає команди демону через API (сокет
/var/run/docker.sock); - dockerd - Docker Engine: збирання (BuildKit), мережі, томи, API, Compose-сумісність;
- containerd - керує життєвим циклом контейнерів і образами (pull, зберігання, знімки файлових систем);
- runc - низькорівневе середовище виконання OCI: створює namespaces і cgroups і запускає процес;
- shim - тримає контейнер, коли containerd перезапускається.
Чому це важливо на практиці:
- Kubernetes з версії 1.24 не використовує Docker Engine напряму - він працює з containerd чи CRI-O через CRI. Образи при цьому ті самі;
- перезапуск dockerd не обов'язково зупиняє контейнери (опція
live-restore); - альтернативні runtime: gVisor (
runsc) додає ізоляцію ядра в просторі користувача, Kata Containers - легкі віртуальні машини для кожного контейнера. Підключаються до Docker як--runtime; - Podman - сумісний з CLI Docker, без центрального демона й з rootless за замовчуванням.
Docker Desktop на macOS і Windows: контейнерам потрібне ядро Linux, тож Docker Desktop запускає легку віртуальну машину з Linux, а docker CLI на хості говорить з демоном у ній. Звідси особливості: повільніший доступ до файлів хоста (bind mount через межу віртуальної машини), окрема пам'ять і CPU, обмежені налаштуваннями VM, host.docker.internal для доступу до хоста.
Архітектура процесора: образ зібрано під конкретну архітектуру (amd64, arm64). На Mac з Apple Silicon образ amd64 запуститься через емуляцію - повільно й інколи з помилками, тому для продакшен-серверів важливі мультиплатформні образи.
Докладніше в документації: Docker: альтернативні середовища виконання