Контейнеризация
1.
Контейнеризация отличается от виртуализации прежде всего тем что:
Примеры виртуализации: KVW, VMware, Proxmox.
Каждая виртуальная машина использует свою операционную систему, свое ядро, своей огружение.
Примеры контейнеризации: Docker, LXC.
Каждый контейнер использует ядро операционной системы.
2.
Типы namespace используемые в Linux OS.
Namespace — использование пространство имен, механизм Linux использующий изоляцию процессов друг от друга.
Виды namespace:
- PID — pid процесса (в каждом контейнере создается своя ветка процессов как при изначальной инициализации ОС Linux, т.е. в каждом контейнере существует свой systemd с pig = 1)
- Network — сеть (создается отдельный lookback интерфейс, также можно создавать отдельные подсети и конечно отдельные интерфейсы для каждого контейнера)
- User — пользователь
- Mount — точки мониторирования (создается отдельная изолированная файловая система)
- IPS — потоки
- UTC — имя хоста, доменное имя.
Для создания пространство имен используется системный вызов clone()
3.
Для контейнеров используется механизм ядра Linux для ограничения ресурсов при создании контейнеров называется Cgroups.
Ограничения могут касаться как CPU, RAM и HDD.
4.
Пример Container engine: Docker, Podman
Пример Conteiner runtime: runc, crun
Conteiner engine управляет создание контейнеров (скачивается образ, создает слои, разделы и тд), а conteiner runtime более низкоуровненый механизм, который запускается контейнер в Linux (он выделяет ресурсы используя cgroups, общается с ядром линукса, создает namespaces и запускает сам процесс)
5.
При выполнение команды docker run -p 8080:80 nginx в консоли Linux, происходит следующее:
- Docker engine проверят есть ли локально образ контейнера если нет, идет в docker hub.
- Создает конфигурацию согласно yaml файлу
- Передает данную информацию containerd
- conteinerd готовит конфиг и вызывает runc
- runc общается с ядром и запускает контейнер в изолированной среде согласно namespaces и cgroups.
6.
Слов в контейнерах это имутабельные изменения файловой системы. Каждая инструкция описанная в конфигурационном файле является новым слоем в контейнере. И если к примеру в одной из инструкции мы удаляем файл из образа, он все равно будет существовать с более низких слоях.
Преимущество слоев это быстрота сборки контейнеров за счет кеширования данных, экомия трафика, и история изменения слоев. Каждый слой хранит информация только об изменении а не весь образ целиков.
Одно из свойств слоев это Copy-on-Write, т.е. при изменении файла в одном из слоев он не меняется в слое ниже.
7.
Команды COPY, ADD, CMD и Encrypoint
COPY — осуществляет только копирование файлов и домашней директории в контейнер.
ADD — может не только копировать, но и по умолчанию распаковывает файлы, также может скачивать файлы через URL.
CMD — осуществляет мягкий запуск команды в контейнере, но его можно переопределить при запуске самого контейнера.
Entrypoint — так осуществляет обязательный запуск команды с флагами при запуске контейнера.
Пример лучшей практики:
- ENTRYPOINT [«myapp»]
- CMD [«—help»]
Multi-stage build — это создание контейнера без артефактов (ничего лишнего)
смысл в том чтобы уменьшить объем контейнера.
Пример:
- FROM node:18 as build
- WORKDIR: /app
- COPY . .
- RUN npm run install
- RUN npm run build
- FROM nginx:apline
- COPY —from=build /app/dist /usr/share/nginx/html
Filed under: Без рубрики - @ 22.04.2026 09:33