Перейти к основному содержимому

200 вопросов по Docker

200 вопросов по Docker

Основы Docker

Вопрос

Что такое Docker?

Ответ

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


Вопрос

В чём разница между контейнером и виртуальной машиной?

Ответ

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


Вопрос

Что такое образ (image) в Docker?

Ответ

Образ — это неизменяемый шаблон, содержащий файловую систему, зависимости, код и метаданные, необходимые для запуска контейнера. Образ создаётся на основе инструкций из Dockerfile и служит основой для создания контейнеров.


Вопрос

Что такое контейнер в Docker?

Ответ

Контейнер — это запущенный экземпляр образа. Он представляет собой изолированный процесс с собственной файловой системой, сетевым стеком и ограниченными вычислительными ресурсами. Контейнер существует до завершения выполнения основного процесса внутри него.


Вопрос

Какие основные компоненты архитектуры Docker?

Ответ

Основные компоненты:

  • Docker Client — интерфейс командной строки для взаимодействия с Docker.
  • Docker Daemon (dockerd) — фоновый процесс, управляющий образами, контейнерами, сетями и томами.
  • Docker Registry — хранилище образов (например, Docker Hub).
  • Docker Objects — образы, контейнеры, сети, тома и плагины.

Вопрос

Что такое Dockerfile?

Ответ

Dockerfile — это текстовый файл, содержащий последовательность инструкций для автоматической сборки образа Docker. Каждая инструкция создаёт новый слой в образе.


Вопрос

Как собрать образ из Dockerfile?

Ответ

Используется команда:

docker build -t имя_образа:тег путь_к_dockerfile

Например:

docker build -t myapp:v1 .

Вопрос

Как запустить контейнер из образа?

Ответ

Команда:

docker run [опции] имя_образа[:тег]

Пример:

docker run -d --name web nginx:latest

Вопрос

Что делает флаг -d в команде docker run?

Ответ

Флаг -d (detached mode) запускает контейнер в фоновом режиме, не привязывая терминал к его стандартному выводу.


Вопрос

Как посмотреть список запущенных контейнеров?

Ответ

Команда:

docker ps

Вопрос

Как посмотреть все контейнеры, включая остановленные?

Ответ

Команда:

docker ps -a

Вопрос

Как остановить контейнер?

Ответ

Команда:

docker stop имя_или_id_контейнера

Вопрос

Как удалить контейнер?

Ответ

Команда:

docker rm имя_или_id_контейнера

Для принудительного удаления работающего контейнера используется флаг -f.


Вопрос

Как удалить образ?

Ответ

Команда:

docker rmi имя_образа[:тег]

Вопрос

Что такое слой (layer) в образе Docker?

Ответ

Слой — это изменение файловой системы, добавленное одной инструкцией в Dockerfile. Образ состоит из стека слоёв, каждый из которых неизменяем и может быть переиспользован другими образами.


Вопрос

Почему важно минимизировать количество слоёв в образе?

Ответ

Меньше слоёв ускоряет сборку, уменьшает размер образа и снижает поверхность атаки. Некоторые инструкции (например, RUN, COPY, ADD) создают слои, поэтому их объединяют там, где это возможно.


Вопрос

Что такое .dockerignore?

Ответ

Файл .dockerignore указывает, какие файлы и директории следует исключить из контекста сборки при передаче его в Docker daemon. Это ускоряет сборку и предотвращает попадание ненужных или чувствительных данных в образ.


Вопрос

Что такое контекст сборки (build context)?

Ответ

Контекст сборки — это набор файлов и директорий, отправляемых Docker daemon для выполнения команды docker build. Все пути в Dockerfile интерпретируются относительно этого контекста.


Вопрос

Как посмотреть логи контейнера?

Ответ

Команда:

docker logs имя_или_id_контейнера

Для потокового вывода используется флаг -f.


Вопрос

Как выполнить команду внутри работающего контейнера?

Ответ

Команда:

docker exec -it имя_контейнера команда

Пример:

docker exec -it web bash

Управление образами и контейнерами

Вопрос

Как посмотреть список всех образов на хосте?

Ответ

Команда:

docker images

Вопрос

Как переименовать образ?

Ответ

Используется команда docker tag:

docker tag старое_имя:тег новое_имя:тег

Вопрос

Как сохранить образ в файл?

Ответ

Команда:

docker save -o файл.tar имя_образа:тег

Вопрос

Как загрузить образ из файла?

Ответ

Команда:

docker load -i файл.tar

Вопрос

Как экспортировать файловую систему контейнера в архив?

Ответ

Команда:

docker export контейнер > файл.tar

Это сохраняет только файловую систему без истории слоёв и метаданных.


Вопрос

Как импортировать файловую систему как образ?

Ответ

Команда:

cat файл.tar | docker import - имя_образа:тег

Вопрос

Что делает команда docker commit?

Ответ

Создаёт новый образ из изменённого состояния контейнера. Не рекомендуется для продакшена, так как нарушает воспроизводимость.


Вопрос

Как узнать, какие порты проброшены у контейнера?

Ответ

Команда:

docker port имя_контейнера

Или посмотреть в выводе docker inspect.


Вопрос

Как перезапустить контейнер?

Ответ

Команда:

docker restart имя_контейнера

Вопрос

Как получить подробную информацию о контейнере?

Ответ

Команда:

docker inspect имя_контейнера

Возвращает JSON с деталями: IP-адрес, тома, переменные окружения, состояние и многое другое.


Вопрос

Как получить информацию об образе?

Ответ

Команда:

docker inspect имя_образа:тег

Вопрос

Как посмотреть историю слоёв образа?

Ответ

Команда:

docker history имя_образа:тег

Вопрос

Что такое dangling image?

Ответ

Dangling image — это образ без имени и тега, обычно возникающий после пересборки с тем же тегом. Такие образы можно удалить командой docker image prune.


Вопрос

Как удалить все неиспользуемые ресурсы Docker?

Ответ

Команда:

docker system prune

Удаляет остановленные контейнеры, неиспользуемые сети, dangling образы и кэш сборки. Для удаления всех неиспользуемых томов добавляется флаг -a.


Вопрос

Как посмотреть использование диска Docker?

Ответ

Команда:

docker system df

Вопрос

Как задать имя контейнеру при запуске?

Ответ

Флаг --name:

docker run --name my_container nginx

Вопрос

Как задать переменные окружения контейнеру?

Ответ

Флаг -e или --env:

docker run -e ENV_VAR=value nginx

Можно также использовать файл: --env-file .env.


Вопрос

Как ограничить использование памяти контейнером?

Ответ

Флаг --memory или -m:

docker run -m 512m nginx

Вопрос

Как ограничить использование CPU?

Ответ

Флаг --cpus:

docker run --cpus="1.5" nginx

Или через --cpu-shares для относительного приоритета.


Вопрос

Как запустить контейнер с пользователем, отличным от root?

Ответ

Флаг --user:

docker run --user 1000:1000 nginx

Или указать в Dockerfile через инструкцию USER.


Работа с томами и постоянным хранилищем

Вопрос

Что такое том (volume) в Docker?

Ответ

Том — это механизм хранения данных, управляемый Docker, предназначенный для сохранения информации вне жизненного цикла контейнера. Томы существуют независимо от контейнеров и могут быть переиспользованы между ними.


Вопрос

Какие типы постоянного хранения данных поддерживает Docker?

Ответ

Docker поддерживает три основных типа:

  • Volumes — управляемые Docker, хранятся в /var/lib/docker/volumes/ на Linux.
  • Bind mounts — монтирование произвольной директории или файла с хоста в контейнер.
  • tmpfs mounts — хранение данных только в памяти хоста (только для Linux).

Вопрос

Как создать том вручную?

Ответ

Команда:

docker volume create имя_тома

Вопрос

Как использовать том при запуске контейнера?

Ответ

Флаг -v или --mount:

docker run -d --name web -v my_volume:/app nginx

Или через --mount (более явный синтаксис):

docker run -d --name web --mount source=my_volume,target=/app nginx

Вопрос

В чём разница между -v и --mount?

Ответ

-v — более компактный, но менее строгий синтаксис. --mount — более многословный, но позволяет явно указывать тип (volume, bind, tmpfs) и параметры, что снижает риск ошибок.


Вопрос

Как посмотреть список всех томов?

Ответ

Команда:

docker volume ls

Вопрос

Как удалить том?

Ответ

Команда:

docker volume rm имя_тома

Удаление возможно только если том не используется ни одним контейнером.


Вопрос

Как очистить неиспользуемые тома?

Ответ

Команда:

docker volume prune

Вопрос

Что происходит с данными в томе после удаления контейнера?

Ответ

Данные в томе сохраняются. Том существует независимо от контейнеров, которые его используют.


Вопрос

Можно ли использовать один том в нескольких контейнерах одновременно?

Ответ

Да, том может монтироваться в несколько контейнеров одновременно. Однако приложение должно корректно обрабатывать конкурентный доступ к данным.


Вопрос

Как монтировать директорию хоста в контейнер (bind mount)?

Ответ

Пример:

docker run -d --name web -v /host/path:/container/path nginx

Путь на хосте должен существовать, иначе Docker создаст его как каталог.


Вопрос

В чём преимущество volumes перед bind mounts?

Ответ

Volumes:

  • Управляются Docker (безопаснее, изолированнее).
  • Работают одинаково на всех ОС (включая Windows и macOS).
  • Поддерживают драйверы томов (например, NFS, cloud storage).
  • Не зависят от структуры файловой системы хоста.

Вопрос

Как скопировать данные из контейнера в том при первом запуске?

Ответ

Если том пуст, а в образе есть данные в точке монтирования, Docker автоматически копирует содержимое из образа в том перед запуском контейнера.


Вопрос

Как получить путь к файловой системе тома на хосте?

Ответ

Команда:

docker volume inspect имя_тома

В выводе поле Mountpoint содержит путь (только на Linux; на Windows/macOS путь внутри виртуальной машины).


Сетевое взаимодействие

Вопрос

Какие сетевые драйверы поддерживает Docker по умолчанию?

Ответ

  • bridge — стандартная сеть для контейнеров на одном хосте (создаётся автоматически).
  • host — контейнер использует сетевой стек хоста напрямую.
  • none — контейнер без сетевого интерфейса.
  • overlay — для многонодовых кластеров (например, в Swarm или Kubernetes).
  • macvlan — присваивает контейнеру MAC-адрес, делая его видимым как физическое устройство.

Вопрос

Как посмотреть список сетей Docker?

Ответ

Команда:

docker network ls

Вопрос

Как создать пользовательскую bridge-сеть?

Ответ

Команда:

docker network create --driver bridge my_network

Вопрос

Почему стоит использовать пользовательские bridge-сети вместо стандартной?

Ответ

Пользовательские bridge-сети обеспечивают:

  • Автоматическое DNS-разрешение имён контейнеров.
  • Изоляцию от других приложений.
  • Возможность настройки параметров (подсеть, шлюз и т.д.).

Вопрос

Как подключить контейнер к пользовательской сети при запуске?

Ответ

Флаг --network:

docker run -d --name web --network my_network nginx

Вопрос

Как подключить уже запущенный контейнер к сети?

Ответ

Команда:

docker network connect my_network имя_контейнера

Вопрос

Как отключить контейнер от сети?

Ответ

Команда:

docker network disconnect my_network имя_контейнера

Вопрос

Как два контейнера в одной пользовательской bridge-сети общаются друг с другом?

Ответ

Они могут обращаться друг к другу по имени контейнера как к хосту. Например, если контейнер db запущен в той же сети, то web может использовать http://db:5432.


Вопрос

Что делает флаг --network host?

Ответ

Контейнер использует сетевой стек хоста напрямую: все порты хоста становятся доступны контейнеру без проброса. Это повышает производительность, но снижает изоляцию.


Вопрос

Как пробросить порт контейнера на хост?

Ответ

Флаг -p (publish):

docker run -d -p 8080:80 nginx

Это делает порт 80 контейнера доступным на хосте через порт 8080.


Вопрос

В чём разница между -p 8080:80 и -p 127.0.0.1:8080:80?

Ответ

Первый вариант делает порт доступным со всех интерфейсов хоста. Второй — только с localhost (локального интерфейса), что повышает безопасность.


Вопрос

Как посмотреть сетевые настройки контейнера?

Ответ

Команда:

docker inspect имя_контейнера

Или конкретно сеть:

docker network inspect имя_сети

Вопрос

Можно ли изменить сеть контейнера после его создания?

Ответ

Нельзя изменить сеть «на лету», но можно подключить или отключить от дополнительных сетей с помощью docker network connect / disconnect.


Вопрос

Что такое Docker DNS?

Ответ

В пользовательских bridge-сетях Docker автоматически запускает внутренний DNS-сервер, который разрешает имена контейнеров в их IP-адреса.


Docker Compose

Вопрос

Что такое Docker Compose?

Ответ

Docker Compose — инструмент для определения и запуска многоконтейнерных приложений с помощью одного YAML-файла (docker-compose.yml). Он управляет жизненным циклом всех сервисов: сборка, запуск, остановка, удаление.


Вопрос

Какой минимальный пример docker-compose.yml?

Ответ

version: '3.8'
services:
web:
image: nginx:latest
ports:
- "8080:80"

Вопрос

Как запустить приложение с помощью Compose?

Ответ

Команда:

docker compose up

Для фонового режима:

docker compose up -d

Вопрос

Как остановить и удалить приложение Compose?

Ответ

docker compose down

Эта команда останавливает и удаляет контейнеры, сети, но по умолчанию не удаляет тома.


Вопрос

Как удалить тома вместе с приложением?

Ответ

Флаг -v:

docker compose down -v

Вопрос

Как задать имя проекта в Compose?

Ответ

По умолчанию имя проекта — имя директории. Можно задать явно:

docker compose -p myproject up

Или через переменную окружения:

export COMPOSE_PROJECT_NAME=myproject

Вопрос

Как определить зависимости между сервисами?

Ответ

Ключ depends_on:

services:
web:
image: nginx
depends_on:
- db
db:
image: postgres

📌 Внимание
depends_on гарантирует только порядок запуска, но не ждёт, пока сервис станет готов к работе. Для этого нужны health checks.


Вопрос

Как добавить health check в Compose?

Ответ

Пример:

services:
db:
image: postgres
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5

Вопрос

Как использовать переменные окружения в docker-compose.yml?

Ответ

Можно ссылаться на переменные хоста:

environment:
DB_HOST: ${DB_HOST}

Или загружать из файла:

env_file:
- .env

Вопрос

Как собрать образ внутри Compose?

Ответ

Указать путь к Dockerfile:

services:
app:
build: ./app

Можно также указать контекст и Dockerfile отдельно:

build:
context: .
dockerfile: Dockerfile.prod

Вопрос

Как масштабировать сервис в Compose?

Ответ

Команда:

docker compose up --scale web=3

Или в файле через deploy (только в режиме Swarm).


Вопрос

Что делает docker compose ps?

Ответ

Показывает состояние всех контейнеров текущего Compose-проекта.


Вопрос

Как посмотреть логи всех сервисов сразу?

Ответ

Команда:

docker compose logs

Для потокового вывода:

docker compose logs -f

Вопрос

Как выполнить команду в контейнере сервиса через Compose?

Ответ

Команда:

docker compose exec web bash

Вопрос

Как пересобрать и перезапустить только изменившиеся сервисы?

Ответ

Команда:

docker compose up --build

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

Вопрос

Почему запуск контейнеров от root небезопасен?

Ответ

Контейнеры по умолчанию запускаются от пользователя root внутри изолированной среды. Однако при компрометации контейнера злоумышленник может использовать уязвимости ядра или неправильные настройки томов для получения доступа к хосту с правами root.


Вопрос

Как запустить контейнер без прав root?

Ответ

Указать пользователя в Dockerfile:

USER 1000

Или при запуске:

docker run --user 1000 nginx

Вопрос

Что такое capability в контексте безопасности Docker?

Ответ

Capability — это разрешение на выполнение определённых привилегированных операций в Linux (например, NET_ADMIN, SYS_TIME). По умолчанию контейнер запускается с ограниченным набором capabilities.


Вопрос

Как удалить все capabilities из контейнера?

Ответ

Флаг --cap-drop:

docker run --cap-drop ALL nginx

Вопрос

Как добавить конкретную capability?

Ответ

Флаг --cap-add:

docker run --cap-add NET_ADMIN nginx

Вопрос

Что делает флаг --privileged?

Ответ

Запускает контейнер со всеми capabilities и полным доступом к устройствам хоста. Это эквивалентно запуску вне контейнера и крайне небезопасно в продакшене.


Вопрос

Как предотвратить монтирование чувствительных директорий хоста?

Ответ

Не использовать bind mounts для путей вроде /, /etc, /proc, /sys. Использовать только явно выделенные рабочие директории. На уровне инфраструктуры — применять политики через AppArmor, SELinux или OPA.


Вопрос

Что такое seccomp в Docker?

Ответ

Seccomp (secure computing mode) — механизм ядра Linux, ограничивающий системные вызовы, доступные процессу. Docker использует профиль по умолчанию, блокирующий опасные вызовы.


Вопрос

Как использовать свой seccomp-профиль?

Ответ

Флаг --security-opt:

docker run --security-opt seccomp=мой_профиль.json nginx

Вопрос

Что такое AppArmor и SELinux в контексте Docker?

Ответ

AppArmor (Linux) и SELinux (RHEL/CentOS) — системы мандатного контроля доступа. Docker автоматически применяет профили, если они настроены в ОС, дополнительно ограничивая действия контейнера.


Вопрос

Как сканировать образы на уязвимости?

Ответ

Можно использовать:

  • docker scan имя_образа (интеграция с Snyk)
  • Clair, Trivy, Anchore — внешние инструменты анализа
  • Встроенные средства CI/CD или платформ (например, AWS ECR image scanning)

Вопрос

Почему важно обновлять базовые образы?

Ответ

Базовые образы содержат ОС и библиотеки, в которых регулярно находят уязвимости. Использование устаревших образов увеличивает риск компрометации.


Оптимизация образов

Вопрос

Как уменьшить размер образа Docker?

Ответ

Основные методы:

  • Использовать минимальные базовые образы (alpine, distroless)
  • Объединять команды в один RUN
  • Удалять кэш пакетного менеджера в той же строке
  • Использовать multi-stage сборки
  • Избегать копирования ненужных файлов (через .dockerignore)

Вопрос

Почему alpine часто используется как базовый образ?

Ответ

Alpine Linux основан на musl libc и busybox, имеет очень маленький размер (~5 МБ), содержит только необходимый минимум пакетов и поддерживает менеджер пакетов apk.


Вопрос

В чём недостаток alpine?

Ответ

Использует musl вместо glibc, что может вызывать несовместимость с некоторыми бинарными зависимостями (особенно в Python, Java native libs). Сборка может быть медленнее из-за отсутствия предварительно собранных пакетов.


Вопрос

Что такое distroless-образы?

Ответ

Distroless-образы (от Google) содержат только runtime и зависимости приложения, без shell, пакетного менеджера и других утилит. Это повышает безопасность и уменьшает размер.


Вопрос

Как объединить установку и очистку в одном слое?

Ответ

Пример для Ubuntu:

RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*

Для Alpine:

RUN apk add --no-cache curl

Вопрос

Зачем нужен .dockerignore при оптимизации?

Ответ

Он исключает ненужные файлы (например, node_modules, .git, IDE-файлы) из контекста сборки, ускоряя передачу данных и предотвращая случайное копирование в образ.


Вопрос

Как проверить размер слоёв образа?

Ответ

Команда:

docker history имя_образа

Или использовать сторонние инструменты: dive, docker-image-size-report.


Вопрос

Что такое кэш слоёв в Docker?

Ответ

Docker кэширует каждый слой при сборке. Если инструкция и её аргумент не изменились, слой берётся из кэша, что ускоряет повторную сборку.


Вопрос

Как принудительно игнорировать кэш при сборке?

Ответ

Флаг --no-cache:

docker build --no-cache -t myapp .

Вопрос

Почему порядок инструкций в Dockerfile важен для кэширования?

Ответ

Изменение в одной инструкции делает недействительными все последующие слои. Поэтому стабильные шаги (установка зависимостей) следует размещать до изменяющихся (копирование исходного кода).


Работа с реестрами образов

Вопрос

Что такое Docker Registry?

Ответ

Registry — это сервис хранения и распространения образов Docker. Docker Hub — публичный registry по умолчанию. Можно развернуть частный registry (например, на основе registry:2).


Вопрос

Как отправить образ в Docker Hub?

Ответ

  1. Авторизоваться:
    docker login
  2. Добавить тег с именем пользователя:
    docker tag myapp username/myapp:v1
  3. Отправить:
    docker push username/myapp:v1

Вопрос

Как получить образ из частного registry?

Ответ

Сначала авторизоваться:

docker login registry.example.com

Затем указать полный путь:

docker run registry.example.com/myapp:v1

Вопрос

Как развернуть локальный registry?

Ответ

Команда:

docker run -d -p 5000:5000 --name registry registry:2

Образы будут доступны по адресу localhost:5000.


Вопрос

Как использовать insecure registry (без HTTPS)?

Ответ

На клиенте нужно добавить registry в список доверенных в файле /etc/docker/daemon.json:

{
"insecure-registries": ["my-registry.local:5000"]
}

После этого перезапустить Docker daemon.


Вопрос

Что такое digest образа?

Ответ

Digest — это SHA256-хэш манифеста образа. Он уникален и неизменяем, в отличие от тега, который можно переназначить. Использование digest гарантирует запуск именно той версии образа.


Вопрос

Как получить digest образа после push?

Ответ

Команда:

docker inspect имя_образа --format='{{.RepoDigests}}'

Вопрос

Как запустить контейнер по digest?

Ответ

Пример:

docker run nginx@sha256:abc123...

Вопрос

Почему лучше использовать digest вместо latest в продакшене?

Ответ

Тег latest может быть перезаписан новой версией, что нарушает воспроизводимость и может внезапно сломать приложение. Digest гарантирует неизменность образа.


Multi-stage сборки

Вопрос

Что такое multi-stage сборка?

Ответ

Multi-stage сборка — это техника, при которой несколько FROM в одном Dockerfile используются для разделения этапов: сборка и финальный образ. Итоговый образ содержит только результат, без инструментов сборки.


Вопрос

Приведи пример multi-stage сборки для Go-приложения.

Ответ

# Этап 1: сборка
FROM golang:1.22 AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# Этап 2: финальный образ
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]

Вопрос

Как скопировать файл из одного stage в другой?

Ответ

Инструкция COPY --from=имя_stage:

COPY --from=builder /path/in/builder /path/in/final

Вопрос

Можно ли использовать внешний образ как stage?

Ответ

Да:

COPY --from=nginx:1.25 /etc/nginx/nginx.conf /nginx.conf

Вопрос

Как назвать stage?

Ответ

Указать имя после AS:

FROM ubuntu AS build-env

Вопрос

Почему multi-stage сборка уменьшает размер образа?

Ответ

Инструменты сборки (компиляторы, SDK, исходники) остаются в промежуточных stage и не попадают в финальный образ, который содержит только исполняемый файл и минимальные зависимости.


Вопрос

Можно ли иметь несколько финальных stage?

Ответ

Да, но команда docker build по умолчанию использует последний. Чтобы собрать конкретный, указывают target:

docker build --target builder -t myapp-builder .

Вопрос

Как использовать multi-stage для фронтенда (например, React)?

Ответ

# Сборка
FROM node:18 AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# Финал
FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

Вопрос

Что происходит с промежуточными stage после сборки?

Ответ

Они сохраняются как dangling образы и могут быть удалены командой docker image prune.


Вопрос

Поддерживает ли Docker Compose multi-stage сборки?

Ответ

Да, Compose использует стандартный docker build, поэтому multi-stage работает без изменений.


Жизненный цикл контейнеров

Вопрос

Как настроить ротацию логов Docker?

Ответ

В файле /etc/docker/daemon.json указывают драйвер логирования и параметры:

{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}

После этого перезапускают Docker daemon.


Вопрос

Какие драйверы логирования поддерживает Docker?

Ответ

Основные драйверы:

  • json-file (по умолчанию)
  • syslog
  • journald
  • gelf
  • fluentd
  • awslogs
  • none

Выбор зависит от инфраструктуры сбора логов.


Вопрос

Как проверить, работает ли контейнер корректно?

Ответ

Используют health check — механизм, определяющий готовность приложения внутри контейнера. Без него Docker считает контейнер «работающим», даже если основной процесс не обрабатывает запросы.


Вопрос

Как задать health check в Dockerfile?

Ответ

Пример:

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD curl -f http://localhost/ || exit 1

Вопрос

Как обновить запущенный контейнер без простоя?

Ответ

Полностью остановить старый и запустить новый — стандартный подход для одиночных контейнеров. Для нулевого простоя используют оркестраторы (Swarm, Kubernetes), которые поддерживают rolling update.


Вопрос

Как пересоздать контейнер с новым образом?

Ответ

Последовательность:

docker stop myapp
docker rm myapp
docker run -d --name myapp myapp:new-tag

В Compose: docker compose up -d --force-recreate.


Вопрос

Что такое restart policy?

Ответ

Политика перезапуска определяет, должен ли Docker автоматически перезапускать контейнер при его остановке. Указывается флагом --restart.


Вопрос

Какие значения поддерживает --restart?

Ответ

  • no — не перезапускать (по умолчанию)
  • on-failure[:max-retries] — только при ненулевом коде выхода
  • always — всегда перезапускать
  • unless-stopped — всегда, кроме случаев ручной остановки

Вопрос

Как мониторить использование ресурсов контейнерами?

Ответ

Команда:

docker stats

Показывает CPU, память, сеть и I/O в реальном времени.


Вопрос

Как получить метрики контейнера в формате JSON?

Ответ

Команда:

docker stats --no-stream --format "{{json .}}"

Интеграция с CI/CD

Вопрос

Как использовать Docker в пайплайне CI/CD?

Ответ

Типичный сценарий:

  1. Собрать образ из исходного кода
  2. Протестировать образ (unit, integration, security scan)
  3. Отправить в registry
  4. Задеплоить на целевое окружение

Вопрос

Как авторизоваться в registry из CI?

Ответ

Используют секреты (например, DOCKERHUB_TOKEN) и команду:

echo $DOCKERHUB_TOKEN | docker login -u username --password-stdin

Вопрос

Почему важно использовать теги с хэшем коммита в CI?

Ответ

Тег вида myapp:git-abc123 однозначно связывает образ с конкретным состоянием кода, обеспечивая воспроизводимость и трассируемость.


Вопрос

Как избежать отправки образа при каждом пуше в main?

Ответ

Добавляют условие в пайплайн:

only:
- main

(в GitLab CI) или аналог в GitHub Actions / Jenkins.


Вопрос

Как кэшировать слои Docker в CI?

Ответ

Используют внешний кэш:

  • В GitHub Actions — actions/cache + buildkit
  • В GitLab CI — docker build --cache-from с предыдущим образом
  • Или монтируют volume с кэшем между job’ами

Вопрос

Что такое BuildKit и зачем он нужен в CI?

Ответ

BuildKit — современный движок сборки Docker, поддерживающий параллельную сборку, кэширование по сети, секреты и лучшую производительность. Включается через переменную:

DOCKER_BUILDKIT=1 docker build ...

Вопрос

Как передать секрет в процесс сборки без сохранения в образе?

Ответ

С помощью BuildKit и флага --secret:

DOCKER_BUILDKIT=1 docker build --secret id=mysecret,src=./secret.txt .

В Dockerfile:

RUN --mount=type=secret,id=mysecret cat /run/secrets/mysecret

Вопрос

Почему нельзя использовать .env с чувствительными данными в Dockerfile?

Ответ

Переменные из .env или -e попадают в метаданные образа и могут быть раскрыты через docker inspect. Для секретов используют --secret, тома или внешние менеджеры (Vault, AWS Secrets Manager).


Вопрос

Как тестировать контейнер после сборки в CI?

Ответ

Запускают его и выполняют проверки:

docker run -d --name test myapp
sleep 5
docker exec test curl -f http://localhost/health
docker stop test && docker rm test

Вопрос

Как убедиться, что образ содержит только необходимые файлы?

Ответ

Используют инструменты вроде dive в CI или добавляют проверку через docker export и анализ содержимого.


Оркестрация: Docker Swarm и Kubernetes

Вопрос

Что такое Docker Swarm?

Ответ

Swarm — встроенный оркестратор контейнеров в Docker Engine. Позволяет объединять несколько хостов в кластер и управлять сервисами, репликами, сетями и секретами.


Вопрос

Как инициализировать Swarm-кластер?

Ответ

Команда на manager-ноде:

docker swarm init --advertise-addr <IP>

Вопрос

Как добавить worker-ноду в Swarm?

Ответ

Выполнить команду, выданную при swarm init:

docker swarm join --token <TOKEN> <MANAGER-IP>:2377

Вопрос

Что такое сервис в Swarm?

Ответ

Сервис — это описание желаемого состояния: образ, количество реплик, порты, сети, переменные. Swarm автоматически распределяет задачи (контейнеры) по нодам.


Вопрос

Как создать сервис в Swarm?

Ответ

Команда:

docker service create --replicas 3 --name web -p 8080:80 nginx

Вопрос

Как обновить сервис в Swarm?

Ответ

Команда:

docker service update --image nginx:1.25 web

По умолчанию используется rolling update.


Вопрос

Как удалить сервис?

Ответ

Команда:

docker service rm web

Вопрос

Что такое stack в Swarm?

Ответ

Stack — это группа сервисов, описанных в одном Compose-файле, развернутых вместе. Аналог deployment в Kubernetes.


Вопрос

Как развернуть stack?

Ответ

Команда:

docker stack deploy -c docker-compose.yml mystack

Вопрос

В чём основное отличие Swarm от Kubernetes?

Ответ

Swarm проще в освоении, встроен в Docker, но менее гибкий. Kubernetes мощнее, стандартизирован, поддерживает больше сценариев, но сложнее в настройке и управлении.


Вопрос

Поддерживает ли Kubernetes нативно Docker?

Ответ

Kubernetes использует Container Runtime Interface (CRI). Современные версии Kubernetes не используют Docker напрямую, а работают через containerd или CRI-O. Однако образы Docker полностью совместимы.


Вопрос

Как деплоить Docker-образы в Kubernetes?

Ответ

Определяют Pod или Deployment с указанием image: registry/name:tag. Образ должен быть доступен в registry, видимом для нод кластера.


Вопрос

Что такое Init Container в Kubernetes?

Ответ

Init Container — вспомогательный контейнер, который запускается до основного и завершается успешно. Используется для подготовки среды (загрузка конфигов, миграции БД).


Вопрос

Можно ли использовать Docker Compose в Kubernetes?

Ответ

Напрямую — нет. Но существуют инструменты конвертации (kompose), которые переводят Compose-файл в манифесты Kubernetes.


Вопрос

Как масштабировать приложение в Kubernetes?

Ответ

Через HorizontalPodAutoscaler (HPA) или вручную:

kubectl scale deployment/web --replicas=5

Расширенные темы

Вопрос

Что такое BuildKit?

Ответ

BuildKit — современный, высокопроизводительный движок сборки образов, заменяющий legacy-движок. Поддерживает параллелизм, продвинутое кэширование, монтирование секретов и SSH-ключей.


Вопрос

Как включить BuildKit?

Ответ

Установить переменную окружения:

export DOCKER_BUILDKIT=1

Или включить глобально в /etc/docker/daemon.json:

{ "features": { "buildkit": true } }

Вопрос

Как использовать SSH-ключи в сборке через BuildKit?

Ответ

Флаг --ssh:

DOCKER_BUILDKIT=1 docker build --ssh default .

В Dockerfile:

RUN --mount=type=ssh git clone git@github.com:user/repo.git

Вопрос

Что такое Docker Content Trust (DCT)?

Ответ

DCT — механизм подписи образов цифровой подписью, гарантирующий их подлинность и целостность. Включается через DOCKER_CONTENT_TRUST=1.


Вопрос

Как подписать образ?

Ответ

При первом docker push с DOCKER_CONTENT_TRUST=1 создаются ключи и подписывается образ. Последующие push автоматически подписываются.


Вопрос

Что такое rootless mode в Docker?

Ответ

Rootless mode позволяет запускать Docker daemon и контейнеры от обычного пользователя без прав root, повышая безопасность на shared-хостах.


Вопрос

Как включить rootless mode?

Ответ

Устанавливают docker-rootless-setuptool.sh или через пакетный менеджер (например, docker-ce-rootless-extras). Запускают dockerd-rootless.sh.


Вопрос

Поддерживает ли rootless mode все функции Docker?

Ответ

Большинство функций работают, но есть ограничения:

  • Нет поддержки --privileged
  • Порты ниже 1024 недоступны без дополнительной настройки
  • Некоторые сетевые драйверы ограничены

Вопрос

Как передать конфигурационный файл в контейнер безопасно?

Ответ

Используют Docker Configs (в Swarm) или ConfigMap (в Kubernetes). В одиночном Docker — том или bind mount с правами только на чтение.


Вопрос

Как передать секрет в контейнер в Swarm?

Ответ

Создают секрет:

echo "mypassword" | docker secret create db_pass -

Используют в сервисе:

docker service create --secret db_pass --name app myapp

Секрет монтируется в /run/secrets/db_pass.


Отладка и диагностика

Вопрос

Как узнать, почему контейнер завершился с ошибкой?

Ответ

Команда:

docker logs имя_контейнера

Также полезен вывод:

docker inspect имя_контейнера --format='{{.State.ExitCode}} {{.State.Error}}'

Вопрос

Как подключиться к контейнеру, если в нём нет shell?

Ответ

Запускают временный контейнер в той же сети и с теми же томами:

docker run -it --rm --network container:целевой_контейнер alpine sh

Вопрос

Как проверить сетевую доступность изнутри контейнера?

Ответ

Выполняют команду внутри контейнера:

docker exec -it имя_контейнера ping хост

Или:

docker exec -it имя_контейнера nslookup домен

Вопрос

Как посмотреть открытые порты внутри контейнера?

Ответ

Команда:

docker exec -it имя_контейнера netstat -tuln

Если netstat недоступен, используют ss или устанавливают net-tools.


Вопрос

Как отследить системные вызовы процесса в контейнере?

Ответ

Используют strace на хосте, указав PID процесса из контейнера:

docker top имя_контейнера        # получить PID
strace -p <PID>

Вопрос

Почему контейнер может зависнуть при запуске?

Ответ

Возможные причины:

  • Основной процесс ожидает ввода (например, запущен интерактивно без -i)
  • Блокировка на файловой системе или сети
  • Неправильный CMD или ENTRYPOINT
  • Отсутствие health check при медленной инициализации

Вопрос

Как определить, какой слой добавил конкретный файл в образ?

Ответ

Используют инструмент dive:

dive имя_образа

Он визуализирует слои и позволяет просматривать изменения между ними.


Вопрос

Как проверить, использует ли образ уязвимые пакеты?

Ответ

Команда:

docker scan имя_образа

Или сторонние сканеры: trivy image имя_образа, grype имя_образа.


Вопрос

Как узнать, какие процессы запущены в контейнере?

Ответ

Команда:

docker top имя_контейнера

Вопрос

Как проверить использование диска внутри контейнера?

Ответ

Выполняют:

docker exec -it имя_контейнера df -h

Или анализируют том через docker volume inspect.


Windows-контейнеры

Вопрос

Поддерживает ли Docker контейнеры на Windows?

Ответ

Да. Docker поддерживает два типа контейнеров на Windows:

  • Windows-контейнеры (требуют Windows Server или Windows 10/11 Pro/Enterprise)
  • Linux-контейнеры (работают через WSL2 или Hyper-V)

Вопрос

Можно ли запускать Linux- и Windows-контейнеры одновременно?

Ответ

Нет. Docker Desktop позволяет переключаться между режимами, но одновременный запуск невозможен из-за различий в ядре.


Вопрос

Какие базовые образы используются для Windows-контейнеров?

Ответ

Основные:

  • mcr.microsoft.com/windows/servercore — полная среда Windows
  • mcr.microsoft.com/windows/nanoserver — минимальный образ без GUI и многих компонентов

Вопрос

Что такое процессный и гипер-V режимы в Windows-контейнерах?

Ответ

  • Процессный режим — контейнеры делят ядро с хостом (требует совпадения версий ОС).
  • Гипер-V режим — каждый контейнер работает в легковесной виртуальной машине, обеспечивая изоляцию даже при несовпадении версий.

Вопрос

Как собрать Windows-образ?

Ответ

Dockerfile начинается с Windows-базового образа:

FROM mcr.microsoft.com/windows/servercore:ltsc2022
SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop';"]
RUN Install-WindowsFeature NET-Framework-45-ASPNET
COPY app C:\\app
WORKDIR C:\\app
CMD ["app.exe"]

Вопрос

Поддерживает ли Docker Compose Windows-контейнеры?

Ответ

Да, при условии, что Docker Desktop переключён в режим Windows-контейнеров.


Вопрос

Какие ограничения есть у Windows-контейнеров?

Ответ

  • Большой размер образов
  • Требование совместимости версий ОС (в процессном режиме)
  • Меньше готовых образов в реестрах
  • Ограниченная поддержка некоторых инструментов (например, exec в старых версиях)

Вопрос

Можно ли использовать тома в Windows-контейнерах?

Ответ

Да. Поддерживаются как volumes, так и bind mounts. Пути указываются в формате Windows: C:\path.


Вопрос

Как монтировать том в Windows-контейнер?

Ответ

Пример:

docker run -v my_volume:C:\data my_windows_app

Вопрос

Как пробросить порт в Windows-контейнере?

Ответ

Так же, как в Linux:

docker run -p 8080:80 my_windows_app

Производительность и ограничения ресурсов

Вопрос

Как ограничить использование CPU одним контейнером?

Ответ

Флаг --cpus:

docker run --cpus="0.5" nginx

Это даёт контейнеру половину одного ядра.


Вопрос

Как задать относительный приоритет CPU?

Ответ

Флаг --cpu-shares:

docker run --cpu-shares=512 nginx

Значение по умолчанию — 1024. Чем выше, тем больше CPU в условиях конкуренции.


Вопрос

Как ограничить память?

Ответ

Флаг -m или --memory:

docker run -m 256m nginx

Вопрос

Что такое swap в контексте ограничения памяти?

Ответ

Swap — это использование диска как расширения оперативной памяти. По умолчанию Docker разрешает swap в объёме, равном лимиту RAM. Можно ограничить:

docker run -m 256m --memory-swap=256m nginx

Это запрещает swap полностью.


Вопрос

Как ограничить I/O диска?

Ответ

Используют флаги --blkio-weight и --device-read-bps / --device-write-bps:

docker run --device-write-bps /dev/sda:1mb nginx

Вопрос

Как измерить производительность контейнера?

Ответ

Используют:

  • docker stats — общее потребление ресурсов
  • time docker run ... — время запуска
  • Сторонние инструменты: perf, iostat, htop внутри контейнера

Вопрос

Почему один и тот же контейнер может работать медленнее на разных хостах?

Ответ

Причины:

  • Разная файловая система (aufs vs overlay2 vs btrfs)
  • Настройки ядра (cgroups, swappiness)
  • Антивирус или другие фоновые процессы
  • Использование WSL2 вместо нативного Linux

Вопрос

Какой драйвер хранилища рекомендуется для production?

Ответ

overlay2 — современный, быстрый и стабильный драйвер, поддерживаемый большинством Linux-дистрибутивов.


Вопрос

Как проверить текущий драйвер хранилища?

Ответ

Команда:

docker info --format '{{.Driver}}'

Вопрос

Влияет ли размер образа на производительность запуска?

Ответ

Да. Большой образ дольше загружается с диска и требует больше времени на распаковку слоёв. Минимизация образа ускоряет старт.


Best practices и анти-паттерны

Вопрос

Почему не следует использовать latest в продакшене?

Ответ

Тег latest может быть переназначен на новый образ без уведомления, что нарушает воспроизводимость и может внезапно изменить поведение приложения.


Вопрос

Почему не стоит запускать несколько процессов в одном контейнере?

Ответ

Контейнер предназначен для одного основного процесса. Несколько процессов усложняют мониторинг, управление жизненным циклом и масштабирование. Каждый сервис должен быть в отдельном контейнере.


Вопрос

Почему нужно избегать сохранения состояния внутри контейнера?

Ответ

Контейнеры эфемерны: их можно остановить, удалить или заменить в любой момент. Все важные данные должны храниться во внешних томах или сервисах (БД, объектное хранилище).


Вопрос

Почему важно явно указывать версии базовых образов?

Ответ

Использование ubuntu:latest может привести к неожиданному обновлению ОС. Лучше указывать точный тег: ubuntu:22.04.


Вопрос

Почему не следует копировать весь проект без .dockerignore?

Ответ

Это увеличивает размер контекста сборки, замедляет передачу данных и может привести к попаданию чувствительных файлов (ключи, истории git) в образ.


Вопрос

Почему нужно удалять кэш пакетного менеджера в том же слое?

Ответ

Если очистка выполняется в отдельной инструкции, кэш остаётся в предыдущем слое и увеличивает итоговый размер образа.


Вопрос

Почему не стоит использовать docker commit для создания образов?

Ответ

docker commit создаёт образ без истории сборки, что нарушает воспроизводимость, затрудняет аудит и делает невозможным CI/CD-интеграцию.


Вопрос

Почему важно задавать health check для сервисов?

Ответ

Без health check оркестратор не может определить, готово ли приложение принимать трафик, что приводит к ошибкам при старте или маршрутизации запросов к нерабочему экземпляру.


Вопрос

Почему не следует монтировать корневую файловую систему хоста в контейнер?

Ответ

Это создаёт критическую уязвимость: при компрометации контейнера злоумышленник получает полный доступ к хосту.


Вопрос

Почему нужно регулярно обновлять образы в продакшене?

Ответ

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