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, работают без изменений.