Общие вопросы, которые вы должны знать перед собеседованием

Я дал много интервью как интервьюер, так и интервьюируемый. Я составляю этот список на основе своего опыта, и мы не можем собрать все в одной статье, поэтому я делю эти статьи на 15 вопросов в каждой. Посмотрим, во сколько частей это войдет. Вот вторые 15 распространенных вопросов в Docker.

Вот первая часть этой статьи

Вопросы на собеседовании с докером - Часть 1

16. Объясните архитектуру контейнера?

Давайте посмотрим на следующую диаграмму, у нас есть три раздела 1) Docker Engine предоставляет API для отдыха для клиента докера, а также имеет другие функции, такие как создание образов и управление ими, безопасность, базовая сеть и т. Д. 2) среда выполнения контейнера имеет два модуля containerd и runc, которые отвечают за выполнение контейнера 3) Операционная система Linux

17. Расскажите о Docker Engine?

Когда Docker был впервые выпущен, у него был один монолитный двоичный файл, который включает в себя клиент Docker, API Docker, среду выполнения контейнера, сборки образа и т. Д. Но позже он был разделен на отдельные компоненты в соответствии с OCI (инициатива открытого контейнера). OCI создал две спецификации, связанные с контейнерами.

  1. Характеристики изображения
  2. Спецификация среды выполнения контейнера

Как показано на следующем рисунке, все двоичные файлы, относящиеся к образам и контейнерам, были перемещены из демона докера и реализованы как отдельные модули.

Клиент Docker принимает команды и отправляет их демону через API. Демон Docker отвечает за реализацию этих команд с помощью библиотек containerd и runc.

Вот еще одна диаграмма, демонстрирующая назначение каждого модуля.

Клиент Docker: в основном это интерфейс командной строки, с помощью которого вы отправляете команды докера демону докера. Если вы устанавливаете Docker на любую ОС, например Windows (cmd), mac (терминал) или Linux, вы действительно взаимодействуете с Docker.

Демон Docker: это сервер, который предоставляет Restful API для приема команд докера от клиента Docker. Он отвечает за выполнение этих команд, создание образов, аутентификацию, безопасность, работу в сети и т. Д.

containerd: он находится между демоном и runc на уровне OCI и отвечает за операции жизненного цикла контейнера. Он начинался как облегченное управление контейнерами. Но у него больше функциональных возможностей, чем выполнение контейнера.

runc: Создает контейнеры. containerd использует новый экземпляр runc каждый раз, когда мы создаем контейнер. Процесс runc завершается сразу после создания контейнера, поэтому нам не нужно создавать столько экземпляров runc, сколько контейнеров.

Shim: Shim - это не что иное, как библиотека, которая позволяет использовать контейнеры без демонов. Причина, по которой он работает без демона, заключается в том, что процесс runc завершается, как только он создает контейнер. Оттуда за контейнер отвечает прокладка. Он сообщает демону о статусе выхода контейнера.

18. Что такое контейнеры?

Работающий экземпляр изображения называется контейнером. Мы можем запустить контейнер с любым образом, который мы создали или извлекли из концентратора докеров, с помощью следующей команды docker container run

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

docker container run -it --name my-node node:latest /bin/bash

у нас нет образа локального узла, поэтому он извлекается из концентратора докеров и обрабатывает, что мы запускаем /bin/bash, как только контейнер запускается. Мы можем немедленно взаимодействовать с оболочкой bash, чтобы проверить версии узла, как показано ниже. мы можем выйти с помощью команды exit.

Мы также можем запустить контейнер в автономном режиме с флагом -d. Когда мы запускаем контейнер таким образом, он просто возвращает идентификатор.

Мы также можем опустить контейнер в команде, как показано ниже.

19. Всякий раз, когда мы создаем образ на корневом уровне, весь контекст отправляется демону Docker. Иногда нам не нужно отправлять весь контент демону Docker. Как избежать отправки всех элементов в текущем каталоге демону Docker?

.dockerignore
Those files or directories should be added to this .dockerignore file.

20. Объясните команду запуска Docker?

docker container run -it --name my-node node:latest /bin/bash

21. Как вы взаимодействуете с работающими контейнерами?

We can interact with the running containers in two ways exec and attach
we can directly interact with the container when we start a container by providing the process we want to run at the end.
for instance, if we are running node, we can provide bash at the end to interact with it
docker container run -it --name my-node node:latest /bin/bash

22. Объясните разницу между командами attach и exec?

attach: this is used to interact with the container with the same process that container is running. Let’s run the following commands.
// run the container in detached mode
docker container run -dit --name mynode1 node bash
// make sure container is up
docker container ls
// attach the running container
docker attach mynode
// exit out of the running process
exit
// check whether conatiner is running or not
docker ps

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

exec: Эта команда используется для взаимодействия с контейнером с отдельным процессом. Таким образом, если мы выйдем из процесса, контейнер все еще будет работать в другом процессе.

// run the container in detached mode
docker container run -dit --name mynode1 node bash
// make sure container is up
docker container ls
// using exec, takes two arguments
docker exec -it mynode bash
// exit out of the running process
exit
// check whether conatiner is running or not
docker ps

23. В чем разница между командами container stop и container rm?

The difference is that docker container stop sends SIGTERM to container process and docker container rm sends SIGKILL to container process. SIGKILL wait for 10 sec before it ends container’s life.

24. Каковы некоторые из лучших практик использования контейнеров Docker?

Always stop containers before removing. Graceful shutdown is always the best practice
Use volumes for persistent data. Make sure removing volumes if not necessary
use one application per container. For instance, don’t use nodejs app and MongoDB in one container.
Use docker cache to our advantage while building images using dockerfiles
always build the smallest image possible so that container starts quickly and will be fewer disk usages.
make use of docker multi-stage dockerfile to build small and secure images.
when it comes to usage of public image, should be chosen carefully as we don’t have complete control over it.
tags are mutable so we should use these tags properly. Use digest since it is immutable.
Always build the image only with the necessary tools. Always reduce the usage of tools, it will have less surface for attacks.
whenever we are sharing data between containers with volumes, make sure only one container is writing into the volume to avoid concurrency.

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

We can create volumes with this command docker volume create mydata
//create volumes
docker volume create mydata//list volumes
docker volume ls//inspect volumes
docker volume inspect mydata

Фактически мы можем видеть, где именно данные в томе сохраняются в качестве точки подключения.

docker VM скрыта в macOS, мы должны использовать следующую команду, чтобы попасть в виртуальную машину

// get into shell
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
// cd into Mountpoint location
cd /var/lib/docker/volumes
//list the volumes
ls -a

Запустим контейнер с объемом

// run container with volume
docker container run --name volumetest -it -v mydata:/data alpine sh
//cd into data
cd data
//create one file there
echo "This is some data" > somedata.txt

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

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

26. Как вы проверяете контейнеры?

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

docker container inspect <container name>

Эта команда печатает большой объем информации в формате JSON, такой как сведения о сети, хранилище, имя и т. Д.

Если мы хотим узнать конкретную информацию, мы можем передать ее в grep, как показано ниже.

docker container inspect mynode | grep IPAddress

27. Как вы видите журналы запущенных контейнеров?

We can access logs of the running container with the following command
// container logs
docker container logs mynode
// last 10 lines
docker container logs tail -10 mynode
// follow the logs
docker container logs --tail 10--follow mynode

28. Зачем вам нужны тома?

we need to understand how containers work and save data before we dive into volumes.
All layers in the images are immutable and read-only. If we look at the following diagram, whenever we create a container from the image, it creates a writable layer on top of immutable image layers. whatever we create or save data inside the container, it will be saved into this writable layer.

The downside of it is that if we remove the container, all the data will be lost with the container. One way to solve this problem is to use volumes. Volumes go beyond container lifecycle and persist data.

29. Приведите пример использования Volumes?

VOLUME is used to create a mount point with the specified name. Following are the examples of Dockerfile and running instructions.

использование тома в Dockerfile

// build command
docker build -t dockerfile13 -f Dockerfile13 .

Вот статья для более подробного объяснения объемов.

Понимание Docker Volumes на примере

30. Какую команду следует использовать для определения томов в Dockerfile?

VOLUME /dockerexample

Следите за другими частями этого места !!

Часть 3.

Скоро будет!!