Контейнер на старт: первые шаги в мире Docker
Представьте, что у вас есть приложение — как коробка с вещами. Чтобы удобно и безопасно её доставить в нужное место, вы упаковываете её в контейнер. Именно так работает Docker: он «упаковывает» приложения со всеми нужными файлами, чтобы они могли запускаться где угодно — на любом компьютере или сервере — без «сюрпризов».
В этой статье мы пошагово разберём тест на базовые знания Docker. Каждый вопрос будет сопровождаться объяснением простыми словами — так, чтобы даже сестра, далёкая от IT, могла понять суть.
Освоение этих базовых навыков особенно важно для начинающих в IT: будь вы разработчиком, тестировщиком или системным администратором — понимание Docker сегодня входит в стандартный набор требований.
Какой командой можно удалить контейнер после его остановки, чтобы освободить системные ресурсы?
- docker stop — останавливает контейнер, но не удаляет его.
- docker kill — резко завершает контейнер, не удаляя его.
- docker rmi — удаляет образы, а не контейнеры.
- docker prune — очищает различные ресурсы, но это более общее и потенциально опасное действие.
- 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?
1. может распаковывать .tar архивы автоматически;
2. может копировать файлы как с локального хоста, так и по URL, но поведение с URL считается нежелательным и может вызвать путаницу (в новых практиках рекомендуется использовать curl или wget).
Выбранный ответ: Копирует файлы и директории из хоста в образ, поддерживая распаковку архивов
Вопрос 5
Какое преимущество даёт использование инструкции COPY вместо ADD в Dockerfile?
- Инструкция COPY делает только одну задачу — копирует файлы и директории из локального контекста сборки в образ.
- В отличие от ADD, она:
3. и не делает ничего «магического», что делает её более предсказуемой и безопасной в CI/CD.
- Именно эта «ограниченность» считается её преимуществом, так как повышает явность и читаемость Dockerfile.
Выбранный ответ: COPY выполняет только копирование файлов без дополнительных операций
Вопрос 6
Какую комбинацию инструкций Dockerfile следует использовать для корректной настройки автоматического запуска приложения при старте контейнера (без дополнительных зависимостей, в минимальном образе)?
- ENTRYPOINT задаёт основную команду, которая всегда будет выполняться при запуске контейнера.
- CMD задаёт аргументы по умолчанию, которые передаются в ENTRYPOINT, но могут быть переопределены при запуске.
- Вместе они позволяют гибко задать, что запускается и с какими параметрами, особенно важно в минимальных образах, где нет shell и дополнительных инструментов.
Выбранный ответ: 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
Вы создаёте приложение из двух контейнеров, которые должны напрямую и безопасно взаимодействовать друг с другом, но быть изолированными от других контейнеров и внешней сети. Какой подход выбрать для настройки сети?
1. изолировать контейнеры от остальных;
2. обеспечить взаимную доступность по имени сервиса;
3. избежать выхода в общую сеть.
- Это наиболее безопасный и контролируемый способ при разработке микросервисов, когда нужно ограничить доступ строго между двумя контейнерами.
docker network create my_secure_net
docker run --network=my_secure_net ...
Выбранный ответ: Создать мостовую сеть с помощью команды docker network create и подключить контейнеры к этой сети
Вопрос 10
Чем использование Docker Registry предпочтительнее хранения образов на локальных машинах?
1. хранить, тегировать и версионировать образы;
2. делиться образами между машинами и командами;
3. поддерживать CI/CD процессы с централизованным доступом.
- В отличие от хранения на локальной машине, Registry обеспечивает доступность и управляемость версий.
- Остальные варианты либо некорректны (не запускает контейнеры, не удаляет автоматически, не ограничен ОС), либо не отражают суть Registry.
Выбранный ответ: Docker Registry упрощает управление версиями создаваемых образов
Пройдя тест и изучив разбор, вы поймёте, что такое Docker, зачем нужны контейнеры, как запускать простые образы и в чём преимущества контейнеризации.
Эти знания дадут вам уверенный старт и понимание современной среды разработки. Это база, на которой легко строить дальнейший рост — к автоматизации, DevOps и работе в команде над масштабными проектами