Docker

Материал из llmdocs — справочник разработчика
Docker
Типплатформа контейнеризации
РазработчикDocker, Inc.
Первый выпускмарт 2013
Написан наGo
ОСLinux; Windows и macOS через Docker Desktop
Компонентыdockerd, containerd, runc, BuildKit, CLI
ЛицензияApache 2.0 (Docker Engine); Docker Desktop — проприетарная
Сайтdocker.com

Docker — платформа для упаковки приложения вместе со всеми зависимостями в стандартный образ и запуска его в виде изолированного контейнера. Контейнер использует ядро хост-системы, поэтому стартует за доли секунды и расходует меньше ресурсов, чем виртуальная машина. Docker сделал контейнеризацию массовой технологией и стал стандартным способом доставки серверного ПО, а его формат образов лёг в основу спецификаций OCI и экосистемы Kubernetes.

История

Docker вырос из внутреннего инструмента PaaS-компании dotCloud. Соломон Хайкс представил его публике в марте 2013 года на конференции PyCon, после чего компания сменила название на Docker, Inc.

Первые версии опирались на LXC, но уже в 2014 году Docker перешёл на собственную библиотеку libcontainer. В 2015 году вместе с другими компаниями была создана Open Container Initiative (OCI), которой передали формат образа и среду исполнения runc.[4] В 2017 году демон управления контейнерами containerd был передан фонду CNCF,[5] а открытая часть кода выделена в проект Moby.

В 2021 году изменились условия Docker Desktop: для компаний с более чем 250 сотрудниками или выручкой свыше 10 млн долларов в год он стал платным; Docker Engine на Linux остался открытым.[3]

Архитектура

Docker построен по клиент-серверной схеме:[1]

  • CLI (docker) отправляет команды через REST API;
  • dockerd — демон, управляющий образами, сетями и томами;
  • containerd — среда, управляющая жизненным циклом контейнеров;
  • runc — низкоуровневый исполнитель, который создаёт процесс с нужной изоляцией;
  • BuildKit — движок сборки образов, используемый по умолчанию с Docker Engine 23.0.[6]

Изоляция обеспечивается механизмами ядра Linux: пространства имён ограничивают видимость процессов, сети и файловой системы, а контрольные группы — потребление CPU и памяти (см. Namespaces и cgroups). На macOS и Windows Docker Desktop запускает лёгкую виртуальную машину с Linux.

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

Образ — неизменяемый набор слоёв файловой системы плюс метаданные (команда запуска, переменные окружения, порты). Каждый слой хранит изменения относительно предыдущего, одинаковые слои разделяются между образами и кешируются. Формат описан спецификацией OCI (см. Образ контейнера и OCI).

Контейнер — запущенный экземпляр образа с тонким записываемым слоем поверх. После удаления контейнера этот слой пропадает, поэтому долговременные данные хранят в томах (volumes).

Образы хранятся в реестрах: публичном Docker Hub или частных (Container registry).

Dockerfile

Образ описывается текстовым файлом Dockerfile — последовательностью инструкций, каждая из которых обычно создаёт слой:[2]

FROM python:3.13-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 8000
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]

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

Основные команды

Команда Действие
docker build -t app:1.0 . собрать образ из Dockerfile
docker run -d -p 8000:8000 app:1.0 запустить контейнер в фоне с пробросом порта
docker ps список запущенных контейнеров
docker logs -f <id> поток логов контейнера
docker exec -it <id> sh оболочка внутри контейнера
docker pull / docker push скачать или опубликовать образ
docker compose up -d поднять набор сервисов из compose.yaml

Для описания многоконтейнерных приложений (сервис + база данных + кеш) используется Docker Compose.

Безопасность

Контейнер — не виртуальная машина: все контейнеры делят одно ядро, и уязвимость ядра или неверная настройка может дать выход на хост. Базовые меры: не запускать процессы от root внутри контейнера, не монтировать сокет Docker в контейнеры без необходимости, не использовать флаг --privileged, регулярно обновлять базовые образы и сканировать их на уязвимости. Членство в группе docker фактически равно правам root на хосте.

Альтернативы

  • Podman — совместимый по командам инструмент без постоянного демона, с упором на работу без root;
  • containerd с утилитой nerdctl — прямое использование среды без dockerd;
  • в Kubernetes с 2022 года Docker как среда исполнения (dockershim) удалён, кластеры используют containerd или CRI-O, но образы, собранные Docker, работают без изменений.

См. также

Источники

  1. Docker overview — Docker Docs
  2. Dockerfile reference
  3. Docker Desktop license agreement
  4. Open Container Initiative — About
  5. containerd — CNCF project page
  6. BuildKit — Docker Docs