Docker – это очень популярная и мощная платформа контейнеризации с открытым исходным кодом. Она используется для создания, развертывания и запуска приложений. Docker позволяет отделить приложение/программное обеспечение от базовой инфраструктуры.
Больше информации о Docker в нашем КАНАЛЕ "DOCKER ПРОСТЫМИ СЛОВАМИ"
Один из базовых терминов, связанных с Docker, – контейнер. Docker можно представить как большой корабль (докер), перевозящий огромные коробки с продуктами (контейнеры).
Контейнер – это стандартная единица программного обеспечения с зависимостями, позволяющая быстро и надежно развертывать приложения на различных вычислительных платформах.
Контейнер Docker не требует установки отдельной операционной системы. Docker полагается на функциональность ядра и использует изоляцию ресурсов для процессора и памяти.
Примечание редакции: больше об основах Docker читайте в статье “Введение в Docker для автоматизации тестирования”.
Зачем изучать Docker?
Разработка приложений – это гораздо больше, чем просто написание кода! Она включает в себя множество “закулисных” вещей, таких как использование различных фреймворков и архитектур на каждом этапе жизненного цикла, что делает процесс более сложным. Использование контейнеризации помогает разработчикам упростить и эффективно ускорить работу над приложениями, а также дает им свободу в выборе технологий и сред разработки.
Все эти аспекты составляют основу DevOps. Знание этих вещей становится всё более важным для любого разработчика, т.к. позволяет повысить производительность, ускорить разработку, не забывая при этом о масштабируемости приложений и эффективности управления ресурсами.
Контейнер Docker можно представить как очень легкую предустановленную коробку со всеми пакетами, зависимостями и программным обеспечением, необходимыми для вашего приложения. ПО, упакованное в такую “коробку”, можно запросто развернуть в производственной среде с минимальными изменениями конфигурации.
Будучи портативными, контейнеры могут быть развернуты на различных платформах, таких как виртуальные машины, платформа Kubernetes и т. д.
Базовые вопросы по Docker
1. Можете ли вы рассказать что-нибудь о контейнере Docker?
Простыми словами, контейнеры состоят из приложений и всех их зависимостей. Они разделяют ядро и системные ресурсы с другими контейнерами и работают как изолированные системы в операционной системе хоста.
Основная цель контейнеров Docker – избавиться от зависимости от инфраструктуры при развертывании и запуске приложений. Это означает, что любое контейнеризированное приложение может работать на любой платформе, независимо от используемой на ней инфраструктуры.
Технически это просто рантайм (runtime) экземпляры образов (images) Docker.
2. Что такое образы в Docker?
Образы (images) представляют собой исполняемые пакеты (с кодом приложения и зависимостями, программными пакетами и т. д.), предназначенные для создания контейнеров. Образы Docker можно развернуть в любой среде и запустить там контейнеры для работы приложения.
3. Что такое DockerFile?
Это текстовый файл, содержащий все команды, которые необходимо выполнить для создания конкретного образа.
4. В чем заключается функциональность гипервизора?
Гипервизор – это программное обеспечение, благодаря которому происходит виртуализация. Иногда его называют монитором виртуальных машин. Он разделяет ресурсы хост-системы и распределяет их между всеми установленными гостевыми средами.
Это означает, что на одной хост-системе может быть установлено несколько ОС. Гипервизоры бывают двух типов:
- Нативный гипервизор. Этот тип также называется Bare-metal Hypervisor. Он работает непосредственно на базовой системе хоста, что также обеспечивает прямой доступ к оборудованию хоста, поэтому он не требует базовой ОС.
- Хостовый гипервизор. Этот тип использует базовую операционную систему хоста.
5. Что вы можете сказать о Docker Compose?
Это YAML-файл, состоящий из всех деталей, касающихся различных сервисов, сетей и томов, которые необходимы для настройки приложения на базе Docker. Docker Compose используется для создания нескольких контейнеров, их размещения и установления связи между ними. Для связи между контейнерами каждый из них открывает порты.
6. Можете ли вы рассказать что-нибудь о пространстве имен Docker?
Пространство имен (namespace) – это, по сути, функция Linux, которая обеспечивает разделение ресурсов ОС взаимоисключающим образом. Это формирует основную концепцию контейнеризации, поскольку пространства имен обеспечивают уровень изоляции между контейнерами. В Docker пространства имен обеспечивают переносимость контейнеров и то, что контейнеры не влияют на базовый хост. Примеры типов пространств имен, которые в настоящее время поддерживаются Docker: PID, Mount, User, Network, IPC.
7. Какая команда Docker выводит список состояния всех контейнеров?
Чтобы узнать состояние всех контейнеров, нужно выполнить команду docker ps -a
.
8.При каких обстоятельствах можно потерять данные, хранящиеся в контейнере?
Данные контейнера остаются в нем до тех пор, пока вы его не удалите.
9. Что такое реестр образов Docker?
Реестр образов Docker – это область, где хранятся образы Docker. Вместо того, чтобы каждый раз преобразовывать приложения в контейнеры, разработчик может напрямую использовать образы, хранящиеся в реестре.
Этот реестр образов может быть как публичным, так и частным, и Dockerhub является самым популярным и известным публичным реестром.
10. Сколько существует компонентов Docker?
Существует три компонента Docker: Клиент (Docker Client), Хост (Docker Host) и Реестр (Docker Registry).
- Docker Client выполняет операции
build
иrun
для открытия связи с хостом Docker. - Docker Host содержит главный демон Docker и размещает контейнеры и связанные с ними образы. Демон устанавливает соединение с реестром Docker.
- Docker Registry хранит образы Docker. Реестр может быть публичным или частным. Наиболее известными публичными реестрами являются DockerHub и Docker Cloud.
11. Что такое DockerHub?
Это публичный облачный реестр, предоставляемый компанией Docker для хранения публичных образов контейнеров, а также для их поиска и совместного использования.
Образы могут быть отправлены в DockerHub с помощью команды docker push
.
12. Какую команду можно выполнить, чтобы экспортировать образ Docker в архив?
Это можно сделать с помощью команды docker save
, синтаксис которой следующий:
docker save -o <exported_name>.tar <container-name>
13. Какую команду можно выполнить, чтобы импортировать предварительно экспортированный образ Docker в другой Docker host?
Это можно сделать с помощью команды docker load
, синтаксис которой выглядит так:
docker load -i <export_image_name>.tar
14. Можно ли удалить приостановленный контейнер из Docker?
Нет, это невозможно! Контейнер ДОЛЖЕН быть в полностью остановленном состоянии, прежде чем мы сможем его удалить.
15. Какая команда используется для проверки версии клиента и сервера Docker?
Команда, используемая для получения всей информации о версии клиента и сервера, – это docker version
. Чтобы получить только данные о версии сервера, можно выполнить следующую команду:
docker version --format '{{.Server.Version}}'
Вопросы среднего уровня сложности
1. В чем различие между виртуализацией и контейнеризацией?
Вопрос косвенно сводится к объяснению разницы между виртуальными машинами и контейнерами Docker.
Виртуализация | Контейнеризация |
---|---|
Позволяет разработчикам запускать и размещать несколько ОС на оборудовании одного физического сервера. | Помогает разработчикам развернуть несколько приложений с использованием одной и той же операционной системы на одной виртуальной машине или сервере. |
Работу виртуальных машин с гостевыми операционными системами обеспечивают гипервизоры. | Изолированное окружение/пространство пользователя для запуска приложений обеспечивают контейнеры. Любые изменения, сделанные внутри контейнера, не отражаются на хосте или других контейнерах того же хоста. |
Виртуальные машины создают абстракцию аппаратного обеспечения системы. Это означает, что каждая виртуальная машина на хосте действует как физическая машина. | Контейнеры создают абстракцию слоя приложения. Это означает, что каждый контейнер представляет собой отдельное приложение. |
2. В чем разница между командами COPY и ADD, используемыми в Dockerfile?
Обе команды имеют схожую функциональность, но COPY более предпочтительна из-за более высокого уровня прозрачности.
COPY обеспечивает только базовую поддержку копирования локальных файлов в контейнер, тогда как ADD предоставляет дополнительные возможности, такие как поддержка удаленных URL и извлечение tar.
3. Может ли контейнер перезагрузиться самостоятельно?
Это возможно только при исполнении определенных политик, заданных в Docker, при использовании команды docker run
. Вот доступные политики:
- Off. В этом случае контейнер не будет перезапущен, если он остановлен или завершил работу с ошибкой.
- On-failure. Контейнер перезапускается автоматически только при возникновении сбоев, не связанных с пользовательскими действиями.
- Unless-stopped. Используя эту политику, можно гарантировать, что контейнер будет перезапущен только при выполнении пользовательской команды для его остановки.
- Always. При использовании этого правила контейнер будет перезапускаться всегда, независимо от сбоя или остановки.
Эти политики могут быть применены следующим образом:
docker run -dit --restart [restart-policy-value] [container_name]
4. Можете ли вы определить разницу между Docker Image и Layer?
Образ (Image) строится из серии слоев инструкций, доступных только для чтения. Образ соответствует контейнеру Docker и используется для ускорения работы благодаря механизму кэширования каждого шага.
Слой (Layer) соответствует инструкции DockerFile образа. Проще говоря, слой – это тоже образ, но образ выполняемых инструкций.
Рассмотрим пример DockerFile:
FROM ubuntu:18.04 COPY . /myapp RUN make /myapp CMD python /myapp/app.py
Важно отметить, что каждый слой представляет собой лишь набор отличий от предыдущего слоя.
Результатом сборки этого DockerFile является образ. Тогда как инструкции, присутствующие в этом файле, добавляют слои к образу. Слои можно рассматривать как промежуточные образы. В приведенном выше примере есть 4 инструкции, поэтому к итоговому образу добавляется 4 слоя.
5. Каково назначение параметра volume в команде docker run?
Синтаксис команды docker run
при использовании параметров volume
следующий:
docker run -v host_path:docker_path <container_name>
Параметр volume
используется для синхронизации каталога контейнера с любым из каталогов хоста.
В качестве примера рассмотрим команду docker run -v /data/app:usr/src/app myapp
. Эта команда монтирует каталог /data/app
на хосте в каталог usr/src/app
. Мы можем синхронизировать контейнер с файлами данных с хоста без необходимости перезапускать его.
Это также обеспечивает безопасность данных в случае удаления контейнера: даже если контейнер будет удален, его данные сохранятся в томе, отображенном на хосте.
6. Где хранятся тома Docker?
Тома Docker (англ. volumes) создаются и управляются Docker и не могут быть доступны сущностям, не относящимся к Docker. Они хранятся в файловой системе хоста Docker по адресу /var/lib/docker/volumes/
.
7. Что делает команда docker info?
Эта команда позволяет получить подробную информацию о Docker, установленном на хост-системе. Это может быть информация о количестве контейнеров или образов и их состоянии, а также аппаратные характеристики, такие как общий объем выделенной памяти, скорость процессора, версия ядра и т. д.
8. Для чего нужны команды up, run и start в Docker compose?
- Используя команду
up
для поддержания Docker compose в рабочем состоянии (в идеале – постоянно), мы можем запустить или перезапустить все сети, сервисы и драйверы, связанные с приложением, которые указаны в файле docker-compose.yml. Если мы запускаем Docker compose в режиме “attached”, то нам будут доступны все логи из контейнеров. Если же Docker compose запущен в режиме “detached”, то после запуска контейнеров он просто выйдет из системы и не покажет никаких логов. - Используя команду
run
, Docker compose может запускать разовые или специальные задачи, основанные на бизнес-требованиях. Здесь необходимо указать имя сервиса, и Docker запустит только этот конкретный сервис, а также другие сервисы, от которых зависит целевой сервис (если таковые имеются). Эта команда полезна для тестирования контейнеров, а также для выполнения таких задач, как добавление или удаление данных в томах контейнеров и т. д. - С помощью команды
start
можно перезапустить только те контейнеры, которые уже были созданы и затем остановлены. Для создания новых контейнеров это не подходит.
9. Каковы основные требования для запуска Docker на любой системе?
Docker может работать как на платформах Windows, так и на Linux.
- Для платформы Windows требуется как минимум Windows 10 64bit с 2 ГБ оперативной памяти. Для более низких версий Docker можно установить с помощью набора инструментов. Docker можно скачать с сайта https://docs.docker.com/docker-for-windows/.
- Docker может работать на различных платформах Linux, таких как Ubuntu >=12.04, Fedora >=19, RHEL >=6.5, CentOS >=6 и др.
10. Как войти в реестр (registry) Docker?
С помощью команды docker login
можно ввести учетные данные для входа в собственные облачные хранилища.
11. Перечислите наиболее часто используемые инструкции в DockerFile
- FROM используется для установки базового образа для последующих инструкций. DockerFile считается действительным, если он начинается с инструкции FROM.
- LABEL используется для организации образов на основе проектов, модулей или лицензирования. Эта команда также помогает в автоматизации, поскольку при определении метки мы указываем пару ключ-значение, к которой впоследствии можно получить доступ и работать с ней программно.
- RUN используется для выполнения следующих за ней команд поверх текущего образа в новом слое. Обратите внимание, что при каждом выполнении команды RUN мы добавляем слои поверх образа и затем используем их в последующих шагах.
- CMD используется для предоставления значений по умолчанию для исполняемого контейнера. В случае нескольких команд CMD будет учитываться последняя из них.
12. В чем разница между логированием демонов и логированием контейнеров?
В Docker логирование поддерживается на двух уровнях: демона или контейнера.
Уровень демона
Этот вид логирования имеет четыре уровня – Debug, Info, Error и Fatal:
- Debug содержит все данные, которые произошли во время выполнения процесса демона
- Info несет всю информацию вместе с информацией об ошибках во время выполнения процесса демона
- Errors содержит те ошибки, которые произошли во время выполнения процесса демона
- Fatal содержит фатальные ошибки
Уровень контейнера
- Логирование на уровне контейнера может быть выполнено с помощью команды
sudo docker run -it <container_name> /bin/bash
- Чтобы проверить наличие логов на уровне контейнера, можно выполнить команду
sudo docker logs <container_id>
13. Как установить связь между хостом Docker и хостом Linux?
Это можно сделать с помощью сети, определив команду ipconfig
на хосте Docker. Эта команда гарантирует, что адаптер ethernet будет создан, пока Docker присутствует на хосте.
14. Каков наилучший способ удаления контейнера?
Для удаления контейнера нам нужно выполнить следующие два шага:
- docker stop
- docker rm
15. Можете ли вы определить разницу между CMD и ENTRYPOINT?
Команда CMD предоставляет файлы, которые запускаются по умолчанию для исполняемого контейнера. В случае если исполняемый файл должен быть опущен, необходимо использовать инструкцию ENTRYPOINT вместе с форматом массива JSON.
ENTRYPOINT указывает, что содержащаяся в ней команда всегда будет выполняться при запуске контейнера.
Эта команда предоставляет возможность настройки параметров и исполняемых файлов. Если в DockerFile нет этой команды, то она все равно будет унаследована от базового образа, указанного в инструкции FROM.
Наиболее часто используемый ENTRYPOINT для большинства базовых образов – /bin/sh
или /bin/bash
. Как правило, в каждом DockerFile должна присутствовать хотя бы одна из этих двух команд.
Вопросы повышенного уровня сложности
1. Можно ли использовать JSON вместо YAML при разработке файла docker-compose в Docker?
Да, его можно использовать. Чтобы запустить docker-compose
с JSON, может быть использована следующая команда:
docker-compose -f docker-compose.json up
2. Сколько контейнеров можно запустить в Docker и какие факторы влияют на это ограничение?
Не существует четко определенного ограничения на количество контейнеров, которые можно запускать в Docker. Все зависит от аппаратных ограничений. Размер приложения и доступные ресурсы процессора – два важных фактора, влияющих на этот предел. Если ваше приложение не очень большое и у вас достаточно ресурсов процессора, то можно запускать огромное количество контейнеров.
3. Опишите жизненный цикл контейнера Docker
Различные этапы работы контейнера Docker от начала создания до его завершения называются жизненным циклом контейнера.
Наиболее важными этапами являются:
- Created. Это состояние, когда контейнер только что создан, но еще не запущен.
- Running. В этом состоянии контейнер будет запущен со всеми связанными с ним процессами.
- Paused. Это состояние возникает, когда работающий контейнер был приостановлен.
- Stopped. Это состояние возникает, когда работающий контейнер был остановлен.
- Deleted. В этом случае контейнер будет удален.
4. Как использовать Docker для работы с несколькими приложениями?
Здесь на помощь придет функция docker-compose. В файле docker-compose мы можем определить несколько сервисов, сетей и контейнеров вместе с отображением томов (volume), а затем просто вызвать команду docker-compose up
.
Когда задействовано несколько окружений (это может быть dev-, staging-, uat- или production-сервер), нам нужно определить зависимости и процессы для запуска приложения, специфичные для конкретного сервера. В этом случае мы можем создать специфические для окружения файлы docker-compose с именами, соответствующими шаблону “docker-compose.{environment}.yml”, и затем, основываясь на окружении, настроить и запустить приложение.
5. Как обеспечить запуск контейнера 1 перед контейнером 2 при использовании docker-compose?
Docker-compose не ждет, пока какой-либо контейнер будет “готов”, прежде чем приступить к выполнению следующих контейнеров. Чтобы добиться определенного порядка запуска, мы можем использовать зависимость depends_on
. Она была добавлена во второй версии docker-compose. Пример использования в файле docker-compose.yml:
version: "2.4" services: backend: build: . depends_on: - db db: image: postgres
Команда docker-compose up
запускает службы в указанном порядке зависимостей. В приведенном выше примере контейнер db
запускается раньше backend
.
docker-compose up SERVICE_NAME
по умолчанию включает зависимости, связанные с сервисом. В приведенном примере запуск docker-compose up backend
создает и запускает db
(зависимость от backend
).
Наконец, команда docker-compose stop
также останавливает сервисы в порядке указанной зависимости. В рассматриваемом примере служба backend
останавливается раньше службы db
.
Заключение
Технологии DevOps развиваются экспоненциальными темпами. Поскольку системы становятся все более и более распределенными, разработчики обратились к контейнеризации из-за необходимости быстрее разрабатывать программное обеспечение и лучше его поддерживать. Контейнеры также помогают упростить и ускорить процесс непрерывной интеграции и деплоя, поэтому эти технологии переживают колоссальный рост.
Docker – самый известный и популярный инструмент для достижения целей контейнеризации и непрерывной интеграции/разработки, а также непрерывного деплоя. Благодаря развивающейся экосистеме Docker доказал свою полезность во многих случаях использования, что делает его изучение еще более интересным и актуальным!
Перевод статьи «Docker Interview Questions».