June 7

Контейнер на старт: первые шаги в мире Docker

Представьте, что у вас есть приложение — как коробка с вещами. Чтобы удобно и безопасно её доставить в нужное место, вы упаковываете её в контейнер. Именно так работает Docker: он «упаковывает» приложения со всеми нужными файлами, чтобы они могли запускаться где угодно — на любом компьютере или сервере — без «сюрпризов».
В этой статье мы пошагово разберём тест на базовые знания Docker. Каждый вопрос будет сопровождаться объяснением простыми словами — так, чтобы даже сестра, далёкая от IT, могла понять суть.
Освоение этих базовых навыков особенно важно для начинающих в IT: будь вы разработчиком, тестировщиком или системным администратором — понимание Docker сегодня входит в стандартный набор требований.

Вопрос 1

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

Обоснование:

  • docker stop — останавливает контейнер, но не удаляет его.
  • docker kill — резко завершает контейнер, не удаляя его.
  • docker rmi — удаляет образы, а не контейнеры.
  • docker prune — очищает различные ресурсы, но это более общее и потенциально опасное действие.
  • docker rm — именно эта команда удаляет контейнер, освободив системные ресурсы (например, файловую систему, тома, сетевые интерфейсы, если они не разделяемые).

Выбранный ответ: docker rm

Вопрос 2
Команда docker inspect используется для получения метаданных о Docker-объектах. В каком случае команда гарантированно не сможет выполниться?

Обоснование:

  • docker inspect извлекает информацию о существующих объектах: контейнерах, образах, сетях и т.д.
  • Если объект удален или никогда не существовал, команда завершится с ошибкой: Error: No such object.
  • Остальные ситуации:

1.     Контейнер с --read-only — допустим, это не мешает inspect, т.к. она не требует записи.

2.     Пользовательский network namespace не мешает получить метаданные.

3.     Изолированная среда или отсутствие образа — не влияют, если объект существует в Docker'е.

Выбранный ответ: Объект не существует или был удален

Вопрос 3
Как реализовать окружение из трёх сервисов с помощью Docker Compose при следующих условиях:

  • Агент сбора метрик должен передавать данные в сервис обработки.
  • Интерфейс визуализации должен быть доступен на порту 4000, но не должен напрямую взаимодействовать с агентом.
  • Все сервисы должны быть в одной сети для обмена данными, но при этом требуется ограничить связи между агентом и интерфейсом визуализации.

Обоснование:

  • Этот вариант позволяет создать раздельные алиасы и зависимости, сохранив возможность контролировать, кто с кем может взаимодействовать.
  • Использование Compose-сети позволяет явно задать, какие сервисы ссылаются на какие (через depends_on, links, networks), и таким образом предотвратить ненужные связи.
  • Прямое взаимодействие между агентом и интерфейсом визуализации должно быть исключено по условию — следовательно, нужно грамотно задать зависимости и сетевые ограничения.

Выбранный ответ: Настроить сеть в Docker Compose и описать все зависимости, ограничив взаимодействие между агентом и интерфейсом визуализации

Вопрос 4
Какую задачу решает инструкция ADD в Dockerfile?

Обоснование:

  • Инструкция ADD похожа на COPY, но имеет дополнительные возможности:

1.     может распаковывать .tar архивы автоматически;

2.     может копировать файлы как с локального хоста, так и по URL, но поведение с URL считается нежелательным и может вызвать путаницу (в новых практиках рекомендуется использовать curl или wget).

  • Основная особенность ADD — распаковка архивов, чего не делает COPY.

Выбранный ответ: Копирует файлы и директории из хоста в образ, поддерживая распаковку архивов

Вопрос 5
Какое преимущество даёт использование инструкции COPY вместо ADD в Dockerfile?

Обоснование:

  • Инструкция COPY делает только одну задачу — копирует файлы и директории из локального контекста сборки в образ.
  • В отличие от ADD, она:

1.     не распаковывает архивы;

2.     не поддерживает URL;

3.     и не делает ничего «магического», что делает её более предсказуемой и безопасной в CI/CD.

  • Именно эта «ограниченность» считается её преимуществом, так как повышает явность и читаемость Dockerfile.

Выбранный ответ: COPY выполняет только копирование файлов без дополнительных операций

Вопрос 6
Какую комбинацию инструкций Dockerfile следует использовать для корректной настройки автоматического запуска приложения при старте контейнера (без дополнительных зависимостей, в минимальном образе)?

Обоснование:

  • ENTRYPOINT задаёт основную команду, которая всегда будет выполняться при запуске контейнера.
  • CMD задаёт аргументы по умолчанию, которые передаются в ENTRYPOINT, но могут быть переопределены при запуске.
  • Вместе они позволяют гибко задать, что запускается и с какими параметрами, особенно важно в минимальных образах, где нет shell и дополнительных инструментов.

Примеры:

FROM scratch

ENTRYPOINT ["/myapp"]

CMD ["--default-arg"]

Выбранный ответ: CMD и ENTRYPOINT

Вопрос 7
У вас есть два файла Docker Compose. В одном описан один сервис, в другом — несколько, объединённых в сеть. Чем отличаются подходы использования этих двух секций services?

Обоснование:

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

Выбранный ответ: Первый файл удобен для тестирования отдельных компонентов, второй обеспечивает полноценное многоконтейнерное окружение

Вопрос 8
Как настроить Docker Compose для среды разработки, если:

1.     Все контейнеры должны запускаться/останавливаться одновременно,

2.     Кэш должен сохранять данные между перезапусками,

3.     API-сервер должен автоматически перезапускаться при сбое.

Обоснование:

  • services — описывает все три контейнера и их конфигурации.
  • volumes — позволяет сохранить данные кеша между перезапусками.
  • restart: always — обеспечивает автоматический перезапуск API-сервера в случае сбоя.

Остальные опции не охватывают все три требования одновременно:

  • docker-compose up/down — это команды, а не настройки.
  • depends_on управляет только порядком запуска, но не автоперезапуском.
  • build — не гарантирует синхронный запуск или устойчивость.
  • networks — важны, но не решают проблему хранилища и перезапуска.

Выбранный ответ: Создать файл с секциями services для всех контейнеров, добавить volumes для кэша и установить параметр restart: always для API-сервера

Вопрос 9
Вы создаёте приложение из двух контейнеров, которые должны напрямую и безопасно взаимодействовать друг с другом, но быть изолированными от других контейнеров и внешней сети. Какой подход выбрать для настройки сети?

Обоснование:

  • Создание отдельной bridge-сети позволяет:

1.     изолировать контейнеры от остальных;

2.     обеспечить взаимную доступность по имени сервиса;

3.     избежать выхода в общую сеть.

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

Примеры:

docker network create my_secure_net

docker run --network=my_secure_net ...

Выбранный ответ: Создать мостовую сеть с помощью команды docker network create и подключить контейнеры к этой сети

Вопрос 10
Чем использование Docker Registry предпочтительнее хранения образов на локальных машинах?

Обоснование:

  • Docker Registry (например, Docker Hub или частный registry) позволяет:

1.     хранить, тегировать и версионировать образы;

2.     делиться образами между машинами и командами;

3.     поддерживать CI/CD процессы с централизованным доступом.

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

Выбранный ответ: Docker Registry упрощает управление версиями создаваемых образов

Заключение

Пройдя тест и изучив разбор, вы поймёте, что такое Docker, зачем нужны контейнеры, как запускать простые образы и в чём преимущества контейнеризации.
Эти знания дадут вам уверенный старт и понимание современной среды разработки. Это база, на которой легко строить дальнейший рост — к автоматизации, DevOps и работе в команде над масштабными проектами