Skip to main content

Общая информация

Образы (Images): неизменяемые элементы, основанные как минимум на ядре и архитектуре. Контейнер: исполняемый образ.
docker_sheme.jpg
Может быть: архитектура ПК-ядро-образ-образ-образ-контейнер
Аналогия: Образ=класс, контейнер=объект
Назначение контейнера - запуск одного приложения.
Архитектура
Docker client -> Docker engine (daemon) -> containerd -> runc-> shim
runc легкая обертка libcontainer, задача - создание контейнеров. Для создании контейнера создается экземпляр runc, он создает контейнер, запускает и завершается. Контейнер передается shim. Shim сопоставляет процесс созданного контейнера с задачей в containerd, containerd логика выполнения контейнера, управления образами, томами, сетью, модульный, можно отключать
Пример процессов:
docker run --name ctr1 -it alpine:latest sh
  • docker client преобразовывает в POST API запрос в Docker engine
  • Запрос отправляется в сокет /var/run/docker.sock
  • демон получает команду создания нового контейнера и передает вызов в containerd (CRUD-style API поверх gRPC)
  • containerd преобразовывает Docker image и направляет запрос в runc для создания нового контейнера
  • runc взаимодействует с ядром, создавая контейнер. Контейнер запускается как дочерний процесс runc. После запуска контейнера runc завершается.
Docker daemon может работать с сетью, non-TLS порт 2375, TLS port 2376
Контейнеры:
После запуска основным процессом становится приложение из параметров запуска
При отсутствии, используется приложение сконфигурированное в образе как точка запуска (Entrypoint)