Docker, первый выпуск которого был еще в 2013 году, — весьма удобный инструмент для сборки пакетов, поставки и запуска приложений в «контейнерах». Большинство крупных компаний, например, Google, Amazon и VMware рассматривают Docker как зрелую технологию для контейнеров, поэтому сейчас самое время изучить этот инструмент и в результате продвинуться по карьерной лестнице. Хотите? В статье будут приведены вопросы по Docker, ответы на которые нужно знать, если вы идете на собеседование.
Что такое контейнер Docker?
Контейнер — базовая единица программного обеспечения, покрывающая код и все его зависимости для обеспечения запуска приложения прозрачно, быстро и надежно независимо от окружения. Контейнер Docker может быть создан с использованием образа Docker. Это исполняемый пакет программного обеспечения, содержащий все необходимое для запуска приложения, например, системные программы, библиотеки, код, среды исполнения и настройки.
Опишите составные части архитектуры Docker
Основные составные части архитектуры Docker — это:
- сервер, содержит сервис Docker, образы и контейнеры. Сервис связывается с Registry, образы — метаданные приложений, запускаемых в контейнерах Docker.
- клиент, применяется для запуска различных действий на сервере Docker.
- registry, используется для хранения образов. Есть публичные, доступные каждому, например, Docker Hub и Docker Cloud.
Опишите Registry подробнее
Docker Registry служит для хранения образов Docker. Есть два публичных сервиса хранения: Docker Hub и Docker Cloud. Docker Hub — наиболее значимая публичная система хранения образов контейнеров, полностью поддерживаемая множеством разработчиков и другими участниками сообщества.
Расскажите кратко о жизненном цикле контейнера Docker
Жизненный цикл контейнера:
- Создание контейнера
- Работа контейнера
- Приостановка контейнера
- Возобновление работы контейнера
- Запуск контейнера
- Остановка контейнера
- Перезапуск контейнера
- Принудительная остановка контейнера
- Удаление контейнера
Назовите наиболее важные команды Docker
Наиболее важные команды Docker:
- build, сборка образа для Docker
- create, создание нового контейнера
- kill. принудительная остановка контейнера
- dockerd, запуск сервиса Docker
- commit, создание нового образа из изменений в контейнере
Что такое пространства имен в Docker?
Пространства имен Docker — это технология обеспечения изолированных рабочих пространств, известная как контейнер. Как только контейнер запускается, создается набор пространств имен для этого контейнера. Они обеспечивают уровень изоляции для контейнеров, поскольку каждый контейнер работает в отдельном пространстве имен, с ограничением доступа к другим пространствам.
Что такое Docker Swarm?
Docker Swarm (теперь это уже swarm mode, прим. переводчика) — встроенный инструмент Docker, используемый для организации кластеризации и планирования контейнеров. Разработчики и системные администраторы с его помощью могут легко собрать несколько узлов в единую виртуальную систему Docker и управлять ею.
Как определить состояние контейнера Docker?
Чтобы определить состояние, надо запустить команду:
docker ps -a
Эта команда выведет список всех доступных контейнеров с их состоянием на сервере. Из этого списка нужно выбрать требуемый контейнер и узнать его состояние.
Что такое образ Docker, что делает команда Docker run?
Образ Docker — это набор файлов, соединенный с настройками, с помощью которого можно создать экземпляры, которые запускаются в отдельных контейнерах в виде изолированных процессов. Образ строится с использованием инструкций для получения полной исполняемой версии приложения, зависящей от версии ядра сервера. Команда Docker run используется для создания таких экземпляров, называемых контейнерами, запускаемыми с использованием образов Docker. При запуске одного образа пользователь может создать несколько контейнеров.
Опишите функции и случаи применения Docker
С помощью Docker можно:
- Сделать процесс настройки проще и упростить настройку на уровне инфраструктуры;
- Помочь разработчикам сосредоточиться исключительно на коде, сокращая время разработки и увеличивая продуктивность;
- Усилить возможности отладки с использованием встроенных функций;
- Изолировать приложения;
- Улучшить плотность использования серверов в форме контейнеризации;
- Делать быстрое развертывание на уровне операционной системы.
Что такое объекты Docker?
Под объектами понимают образы, сервисы и контейнеры.
Образы — шаблоны с инструкциями только для чтения для создания контейнеров.
Контейнеры — запущенные экземпляры образов.
Сервисы — можно запустить несколько контейнеров поверх нескольких сервисов Docker, работающих совместно как swarm.
Еще объектами можно назвать сети и тома.
Какой тип приложений больше подходит для контейнеров Docker: с хранением состояния (stateful) или без хранения (stateless)?
Приложения без хранения состояния (stateless) больше подходят для работы в Docker, чем приложения с хранением (stateful). Мы можем создать контейнер для нашего приложения и принять некоторые его настройки. Таким образом мы можем запускать один и тот же контейнер с разными настройками для различных окружений. Если мы не будем хранить состояние, сможем использовать один и тот же образ в разных сценариях. Также такие приложения проще масштабировать при их работе в контейнерах Docker.
Что такое Dockerfile?
Dockerfile содержит инструкции для сборки образов, которые передаются в Docker. Также его можно описать как текстовый документ, содержащий все возможные команды, с помощью которых пользователь, последовательно их запуская, может собрать образ.
Какие сети доступны по умолчанию в Docker?
По умолчанию есть:
- bridge, сеть, к которой подключаются контейнеры, если не указано иначе.
- none, сетевой стек без наличия сетевого интерфейса в контейнере.
- host, подключение к сетевому стеку сервера.
Приведите необходимые шаги для развертывания докеризированного приложения, сохраненного в репозитории Git
Шаги, необходимые для развертывания приложения зависят от окружения, основной процесс развертывания будет таким:
- Сборка приложения с использованием Docker build в каталоге с кодом приложения
- Тестирование образа
- Выгрузка образа в Registry
- Уведомление удаленного сервера приложений, что он может скачать образ из Registry и запустить его
- Перестановка порта в прокси HTTP(S)
- Остановка старого контейнера
Чем Docker отличается от остальных технологий контейнеризации?
Docker — одна из последних разработок в контейнеризации, он стал одной из наиболее популярных. Docker, созданный в облачную эру, сделал возможным использование новых функций, ранее отсутствующих в старых технологиях контейнеризации. Самая крутая функция Docker — это работа с использованием любой инфраструктуры, неважно, у вас дома, либо в облаке.
Посредством Docker все больше приложений могут работать на старых серверах, также с его помощью можно упаковывать и поставлять программы. Существует также DockerHub, Registry для контейнеров, откуда можно легко и просто скачать образы контейнеров для использования. Еще более интересная функция — общие контейнеры для таких приложений. Также Docker хорошо задокументирован, что делает его лучше остальных технологий контейнеризации.
Если вы остановите контейнер — потеряете данные?
Если контейнер Docker останавливается, потери данных не происходит, поскольку все данные, пишутся на диск приложением с единственной целью — хранение. Этот процесс повторяется до тех пор, пока контейнер не будет однозначно удален. Более того: файловая система контейнера хранит изменения даже после полной остановки контейнера.
Как выполняется мониторинг Docker в производственных окружениях?
Для мониторинга есть инструменты Docker stats и Docker events. С их помощью можно получить отчеты по важной статистике. Если запустить stats с некоторым идентификатором контейнера, он вернет использование оперативной памяти и процессорного времени в контейнере. Это схоже с использованием команды top. С другой стороны есть events, показывающая список активностей в процессе работы сервиса Docker. Вот некоторые из них: подключение к консоли контейнера, commit, переименование, удаление и т.п., а также есть возможность фильтрации нужных событий.
Расскажите о рабочем процессе использования Docker
Краткое пояснение рабочего процесса с использованием Docker:
- Все начинается c Dockerfile, поскольку это исходный код образа.
- Как только он создан, его можно использовать для сборки образа контейнера. Образ — собранная версия Dockerfile.
- Образ можно распространять, используя Registry, работающий как репозиторий образов.
- Далее образ используется для запуска контейнеров. Контейнер при работе весьма похож на виртуальную машину, но без гипервизора.
Поясните разницу между docker run
и docker create
Главная разница между этими командами заключается в том, что вторая создаст контейнер в остановленном состоянии. Также docker create
может быть использована для хранения и вывода идентификатора контейнера для будущего использования. Лучше всего это делать с помощью docker run
, добавляя --cidfile FILENAME
, поскольку повторный запуска не перезаписывает файл.
Что такое виртуализация?
Виртуализация, как только понятие появилось, обозначала способ логического разделения мейнфреймов для обеспечения одновременной работы нескольких приложений. Но со временем, с появлением в отрасли возможности одновременной работы нескольких операционных систем на одном сервере x86, смысл виртуализации значительно поменялся.
Что же в сухом остатке? С помощью виртуализации можно запустить две различных операционных системы на одном и том же оборудовании. Первая операционная система используется для административных целей, все остальные гостевые — загружаются как обычно, включая инициализацию, загрузку ядра и т.д. Это также идеально для безопасности, поскольку гостевая ОС не может получить полного доступа к управляющей (host) ОС, что могло бы привести к дырам в безопасности.
Есть три типа виртуализации:
- Паравиртуализация
- Эмуляция
- Контейнерная виртуализация
В чем разница между Registry и Repository?
Registry — это сервис хранения и распространения образов, также DockerHub — это Registry по умолчанию. Repository — это набор связанных образов. У них одно и то же имя, но разные метки.
Можно ли использовать JSON вместо YAML в файле для docker-compose, если да — как?
Да, так можно сделать. Для этого нужно явно указать имя файла, например так:
docker-compose -f docker-compose.json up
Расскажите о CMD и ENTRYPOINT в Dockerfile
Эти инструкции Dockerfile задают команду, исполняемую при запуске контейнера. При их использовании есть несколько правил, например:
- Должна быть минимум одна из них, CMD или ENTRYPOINT, в Dockerfile.
- Если контейнер используется как исполняемый файл — ENTRYPOINT должна быть определена.
- Если контейнер запускается с другими аргументами — CMD будет переопределена.
Опишите процесс запуска приложения внутри контейнера Linux, используя Docker
- Установите и запустите Docker;
- Скачайте базовый образ с Docker Hub;
- Загрузите ваше приложение в базовый образ;
- Запустите контейнер в интерактивном режиме, используя полученный образ;
- Проверьте контейнеры в системе;
- Запустите или остановите контейнер;
- Зайдите внутрь контейнера;
- Удалите контейнер и образ.
Что такое гипервизор?
Гипервизор, он же монитор виртуальных машин, — это программное обеспечение для создания и запуска виртуальных машин. С его помощью можно запустить на одном компьютере несколько гостевых операционных систем. Это достигается с помощью разделения ресурсов, например, оперативной памяти, процессорного времени и т.п., сокращая требования к памяти, дисковому пространству и обслуживанию. Есть два типа гипервизоров:
- первого типа, легковесная операционная система, запускаемая на оборудовании;
- второго типа, программное обеспечение, запускаемое из операционной системы.
Расскажите о ключевом различии между виртуализацией и контейнеризацией
Виртуализация позволяет запустить несколько операционных систем на одном физическом сервере. Контейнеризация работает на одной и той же операционной системе, в которой приложения упакованы в контейнеры и запускаются на одном сервере/виртуальной машине.
Расскажите об образах Docker, DockerHub, Dockerfile
Образы: файлы, содержащие несколько слоев, используемые для выполнения кода внутри контейнера. Они собираются по инструкциям для получения исполняемой версии приложения. Образы могут ускорить сборку в Docker с помощью кэширования каждого этапа.
DockerHub: сервис для поиска и совместного использования образов контейнеров. Вы можете выгружать туда свои образы, скачивать их оттуда, работать с частными репозиториями образов контейнеров, собирать автоматически образы с помощью GitHub (Bitbucket), а затем закачивать их в DockerHub. Этот сервис предоставляет компания Docker.
Dockerfile: текстовый файл, используемый для сборки образа. Он содержит инструкции и команды по сборке образа. Docker читает их и автоматически собирает образ.
Как проверить версии Docker client и Docker server?
Версию Docker можно проверить с помощью docker version [параметры]
. Если не указывать параметры, команда выдаст всю информацию, связанную с версией клиента и сервера. Чтобы получить только версию сервера, можно запустить такую команду:
docker version --format '{{.Server.Version}}'
Расскажите о процедуре входа в Docker Repository
Чтобы войти в Docker Repository, используется следующая команда:
docker login [OPTIONS] [SERVER]
Например, для входа в registry, размещенную на своих мощностях (локально), команда будет такой:
$ docker login localhost:8080
Расскажите о наиболее общих командах Docker
- docker push: Закачать репозиторий или образ в Registry;
- docker run: Запустить команду в новом контейнере;
- docker pull: Скачать репозиторий или образ из Registry;
- docker start: Запустить один или несколько контейнеров;
- docker stop: Остановить один или несколько контейнеров;
- docker search: Поиск образа на DockerHub;
- docker commit: Сохранить изменения в новый образ.
Чем отличается контейнеризация в виде Docker от других технологий?
Docker может быть легко развернут в любой облачной платформе. Также разработчики могут создать готовые к запуску контейнеризированные приложения быстрее, могут легко развертывать приложения и управлять ими. Кроме того, контейнеры могут быть общими для приложений. Эти функции не работают в других технологиях контейнеризации.
На каких платформах запускается Docker?
Docker работает на Windows (x86_64), Linux (x86_64, ARM, s390x, ppc64le).
Возможен ли самостоятельный перезапуск контейнера?
Да, возможен. Docker задает различные политики перезапуска контейнера:
- Off: контейнер не перезапускается, если он остановился или аварийно завершил работу;
- On-failure: перезапуск только в случае аварийной остановки, но не по команде пользователя;
- Unless-stopped: перезапуск будет работать до тех пор, пока пользователь его не остановит;
- Always: перезапуск в любом случае, независимо от ошибок или других проблем.
Политику можно задать так:
$ docker run -dit — restart [unless-stopped|off|on-failure|always] [CONTAINER]
Можно ли сравнить облака по возможностям контейнеризации с Docker?
Здесь можно высказать свое мнение, например, я думаю, что несмотря на то, что облака — хороший конкурент, они не смогут заменить контейнеризацию. Большинство компаний используют облака и контейнеризацию вместе, чтобы получить лучшее от обеих технологий.
Опишите все возможные состояния контейнера Docker
Created — контейнер создан, но не активен.
Restarting — контейнер в процессе перезапуска.
Running — контейнер работает.
Paused — контейнер приостановлен.
Exited — контейнер закончил свою работу.
Dead — контейнер, который сервис попытался остановить, но не смог.
Расскажите о средствах оркестрации и случаях их использования
Оркестрация позволяет управлять работой контейнеров, запущенных в больших и динамических окружениях. С ее помощью можно автоматизировать и управлять следующими задачами:
- Создание и развертывание контейнеров;
- Балансировка нагрузки;
- Разделение ресурсов между контейнерами;
- Мониторинг контейнеров и серверов;
- Масштабирование контейнеров;
- Перенос контейнеров с одного сервера на другой, если на первом возникает недостаток ресурсов.
Опишите параметр memory-swap
С помощью параметра memory-swap можно разрешить контейнеру записывать на диск данные, превышающие размер оперативной памяти, выделенной контейнеру. Он работает, только если используется одновременно с параметром memory. Например, если memory = "400m" и memory-swap = "1g", то контейнер может использовать 400мб оперативной памяти и 600мб подкачки (1гб-400мб).
Где хранятся тома Docker?
Тома, создаваемые и управляемые Docker (у не-Docker процессов к ним нет доступа), хранятся в файловой системе сервера Docker по пути /var/lib/docker/volumes/
. Тома — наиболее эффективный способ сохранения данных в Docker.
Назовите продвинутые команды Docker
Наиболее важные из них:
docker -version: узнать установленную версию Docker;
docker ps: перечислить все запущенные контейнеры вместе с дополнительной информацией о них;
docker ps -a: перечислить все контейнеры, включая остановленные, вместе с дополнительной информацией о них;
docker exec: войти в контейнер и выполнить в нем команду;
docker build: собрать образ из Dockerfile;
docker rm: удалить контейнер с указанным идентификатором;
docker rmi: удалить образ с указанным идентификатором;
docker info: получить расширенную информацию об установленном Docker, например, сколько запущено контейнеров, образов, версию ядра, доступную оперативную память и т.п.;
docker cp: сохранить файл из контейнера в локальную систему;
docker history: показать историю образа с указанным именем.
Расскажите о командах systemd для управления Docker
Для запуска Docker многие дистрибутивы Linux используют systemd. Для запуска сервисов используется команда systemctl
. Если ее нет, следует использовать команду service
.
$ sudo systemctl start docker
$ sudo service docker start
Чтобы добавить сервис в автозагрузку, либо убрать его:
$ sudo systemctl enable docker
$ sudo systemctl disable docker
Для проверки параметров запуска сервиса и их изменения:
$ sudo systemctl edit docker
Просмотра связанных с сервисом журналов:
$ journalctl -u docker
Опишите процесс масштабирования контейнеров Docker
Контейнеры могут быть масштабированы с использованием команды docker-compose scale
. Процесс масштабирования такой:
- Масштабируем контейнер и запускаем n экземпляров:
$ docker-compose --file docker-compose-run-srvr.yml scale <service_name>=<n>
В вышеприведенном примере имя сервиса задается в файле docker-compose-run-srvr.yml
, а также запускается n копий контейнеров, где n — любое целое положительное число.
- После масштабирования контейнера для проверки можно использовать такую команду:
$ docker ps -a
Что такое CNM?
CNM или Container Network Model — описание, формально определяющее шаги, требуемые для предоставления сети контейнерам, где обслуживающая абстракция применяется для поддержки нескольких сетевых драйверов. CNM основан на трех компонентах: sandbox (песочница), оконечная точка и сеть.
Какие типы монтирования доступны в Docker?
- Bind mount: подключаются к любой точке файловой системы сервера;
- Volume mount: управляются Docker и хранятся как часть файловой системы сервера;
- tmpfs mount: хранятся в оперативной памяти сервера, поэтому никогда не пишутся на реальную файловую систему сервера.
Расскажите о Docker Trusted Registry
Это хранилище образов для безопасного хранения и управления образами Docker. Его можно установить на своих мощностях, либо в частном облаке. DTR применятся в процессах CI/CD для сборки, поставки и запуска приложений. Его также можно развернуть в отказоустойчивом варианте, есть встроенная система управления доступом.
Каково назначение docker_host?
Он задает URL или путь к сокету unix, используемые для соединения с API Docker. Значение по умолчанию — unix://var/run/docker.sock
Для подключения к удаленному серверу обычно используется TCP, например:
tcp://192.0.1.20:3230
Возможен ли запуск нескольких копий одного и того же compose файла на одном и том же сервере? Как именно?
Это можно сделать с помощью docker-compose, использующего файл YAML для настройки сервисов приложения. После его создания вы можете в одну команду создать и запустить все сервисы. Для того, чтобы начать им пользоваться:
- Задайте окружение приложения в Dockerfile, так что оно сможет быть реплицировано везде
- Определите все сервисы вашего приложения в файле docker-compose.yml
- Запустите docker-compose up для создания и запуска приложения целиком
Объясните метки объектов в Docker
Метки объектов Docker — это пары ключ-значение, сохраняемые в виде строк. Мы можем применить метаданные с их помощью. Метки могут быть применены к любому объекту, например, образу, контейнеру, тому, сети, локальным сервисам, узлам swarm и непосредственно сервисам. Каждая пара должна быть уникальной для объекта, сами метки не меняются динамически на протяжении существования объекта.
Результаты
Это был список вопросов для собеседования по Docker. Как много ответов вы знали? Просим принять участие в опросе ниже. Также рекомендуем вам ознакомиться с руководствами от сообщества