![]()
Docker — программное обеспечение для автоматизации развёртывания и управления приложениями в средах с поддержкой контейнеризации, контейнеризатор приложений.
Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть развёрнут на любой Linux-системе с поддержкой контрольных групп в ядре, а также предоставляет набор команд для управления этими контейнерами. Изначально использовал возможности LXC, с 2015 года начал использовать собственную библиотеку, абстрагирующую виртуализационные возможности ядра Linux — libcontainer. С появлением Open Container Initiative начался переход от монолитной к модульной архитектуре.
Разрабатывается и поддерживается одноимённой компанией-стартапом, распространяется в двух редакциях — общественной (Community Edition) по лицензии Apache 2.0 и для организаций (Enterprise Edition) по проприетарной лицензии[9]. Написан на языке Go.
История
Проект начат как внутренняя собственническая разработка компании dotCloud, основанной Соломоном Хайксом (Solomon Hykes) в 2008 году с целью построения публичной PaaS-платформы с поддержкой различных языков программирования. Наряду с Хайксом в первоначальной разработке значительное участие приняли инженеры dotCloud Андреа Лудзарди (Andrea Luzzardi) и Франсуа-Ксавье Бурле (François-Xavier Bourlet).
В марте 2013 года код Docker был опубликован под лицензией Apache 2.0. В июне 2013 года генеральным директором в dotCloud приглашён Бен Голуб (англ. Ben Golub), ранее руководивший фирмой Gluster (разрабатывавшей технологию распределённого хранения GlusterFS и поглощённой за $136 млн Red Hat в 2011 году). В октябре 2013 года, подчёркивая смещение фокуса к новой ключевой технологии, dotCloud переименована в Docker (при этом PaaS-платформа сохранена под прежним названием — dotCloud).
В октябре 2013 года выпущен релиз Havana тиражируемой IaaS-платформы OpenStack, в котором реализована поддержка Docker (как драйвер для OpenStack Nova). С ноября 2013 года частичная поддержка Docker включена в дистрибутив Red Hat Enterprise Linux версии 6.5 и полная — в 20-ю версию дистрибутива Fedora, ранее было достигнуто соглашение с Red Hat о включении с 2014 года Docker в тиражируемую PaaS-платформу OpenShift. В декабре 2013 года объявлено о поддержке развёртывания Docker-контейнеров в среде Google Compute Engine.
С 2014 года ведутся работы по включению поддержки Docker в среду управления фреймворка распределённых приложений Hadoop; по результатам тестирования вариантов платформы виртуализации для Hadoop, проведённом в мае 2014 года, Docker показал на основных операциях (по массовому созданию, перезапуску и уничтожению виртуальных узлов) существенно более высокую производительность, нежели KVM, в частности, на тесте массового создания виртуальных вычислительных узлов прирост потребления процессорных ресурсов в Docker зафиксирован в 26 раз ниже, чем в KVM, а прирост потребления ресурсов оперативной памяти — втрое ниже.
С 2017 года вдобавок к свободно распространяемой под лицензией Apache 2.0 редакции продукта выпускается редакция для организаций, продаваемая по ценам от $750 до $2 тыс. в год на узел в зависимости от доступных функций.
Источники
- Википедия
- Сайт разработчика
- Хабр Полное практическое руководство по Docker: с нуля до кластера на AWS
- The Register Google: 'EVERYTHING at Google runs in a container'
Терминология
Images (образы) - Схемы нашего приложения, которые являются основой контейнеров. В примере выше мы использовали команду docker pull чтобы скачать образ busybox.
Containers (контейнеры) - Создаются на основе образа и запускают само приложение. Мы создали контейнер командой docker run, и использовали образ busybox, скачанный ранее. Список запущенных контейнеров можно увидеть с помощью команды docker ps.
Docker Daemon (демон Докера) - Фоновый сервис, запущенный на хост-машине, который отвечает за создание, запуск и уничтожение Докер-контейнеров. Демон — это процесс, который запущен на операционной системе, с которой взаимодействует клиент.
Docker Client (клиент Докера) - Утилита командной строки, которая позволяет пользователю взаимодействовать с демоном. Существуют другие формы клиента, например, Kitematic, с графическим интерфейсом.
Docker Hub - Регистр Докер-образов. Грубо говоря, архив всех доступных образов. Если нужно, то можно содержать собственный регистр и использовать его для получения образов.
Тестирование на стендах
Ubuntu
- How To Install Docker on Ubuntu 20.04 and 22.04
- Уютный VPS-сервер для маленьких проектов: как настроить
- How To Install and Use Docker on Ubuntu 22.04 26.04.2022
Debian 12.9 Trixie
- Поднимаем OpenConnect SSL VPN сервер (ocserv) в docker для внутренних проектов | Вороний блог
- Собираем OpenConnect (ocserv) версии 1.3 из исходников в Debian 12 + docker образ
- Установка Docker engine на Linux сервер под управлением Debian
Стенд на VPS Singularity
2 CPU, 4 GB RAM, 50 GB NVMi SSD
liv@singularity:~$ hostnamectl
Static hostname: singularity
Icon name: computer-vm
Chassis: vm
Machine ID: c3f3c2a325254275b58ddc82c9068b5c
Boot ID: d12220948d0540a78e3b43fe8fe70c81
Virtualization: kvm
Operating System: Ubuntu 22.04.4 LTS
Kernel: Linux 5.15.0-100-generic
Architecture: x86-64
Hardware Vendor: QEMU
Hardware Model: Standard PC _i440FX + PIIX, 1996_
liv@singularity:~$ docker --version
Docker version 25.0.4, build 1a576c5
liv@singularity:~$ docker compose version
Docker Compose version v2.24.7
Стенд на Microsoft Windows Server 2019 Datacenter Hyper-V
4 vCPU, 8 GB vRAM, SCSI ID 0:0 до 127 GB
Пример PowerShell-скрипта - установка признака в SC VMM "Содержит операционную систему для виртуальной машины"
$VirtualDiskDrive = Get-SCVirtualDiskDrive -VMMServer upra-scvmm -All | where {$_.ID -eq "5614825f-ad13-43ee-8871-a2e2e15c1f51"}
Set-SCVirtualDiskDrive -VirtualDiskDrive $VirtualDiskDrive -Bus 0 -LUN 0 -VolumeType BootAndSystem -SCSI -JobGroup e458d117-c0c0-4257-b412-835ffd2c8f35 -IOPSMaximum 0
$VM = Get-SCVirtualMachine -VMMServer upra-scvmm -Name "ocserv (OpenConnect VPN Server - Debian12)" -ID "b57031c9-c8c7-4b7b-8600-dc3437c935ca" | where {$_.VMHost.Name -eq "<Хост_Hyper-V>.<Домен>"}
$OperatingSystem = Get-SCOperatingSystem -VMMServer upra-scvmm -ID "5c8bad7f-fcd3-44dd-9c2e-27ee4e5a6364" | where {$_.Name -eq "Debian GNU/Linux 10 (64 bit)"}
$CPUType = Get-SCCPUType -VMMServer upra-scvmm | where {$_.Name -eq "3.60 GHz Xeon (2 MB L2 cache)"}
Set-SCVirtualMachine -VM $VM -Name "ocserv (OpenConnect VPN Server - Debian12)" -Description "20.02.2025 И.В. Лыткин Сервер OpenConnect VPN Server"
-OperatingSystem $OperatingSystem
-CPUCount 4
-MemoryMB 8192
-DynamicMemoryEnabled $false
-MemoryWeight 5000
-CPUExpectedUtilizationPercent 20
-DiskIops 0
-CPUMaximumPercent 100
-CPUReserve 0
-NumaIsolationRequired $false
-NetworkUtilizationMbps 0
-CPURelativeWeight 100
-HighlyAvailable $false
-DRProtectionRequired $false
-SecureBootEnabled $false
-CPULimitFunctionality $false
-CPULimitForMigration $false
-CheckpointType Production
-CPUType $CPUType
-Tag "OpenConnect VPN Server"
-CostCenter "IT"
-QuotaPoint 1
-JobGroup e458d117-c0c0-4257-b412-835ffd2c8f35 -RunAsynchronously
-StartAction TurnOnVMIfRunningWhenVSStopped
-StopAction SaveVM
-DelayStartSeconds 0
-BlockDynamicOptimization $false
-EnableOperatingSystemShutdown $true
-EnableTimeSynchronization $true
-EnableDataExchange $true
-EnableHeartbeat $true
-EnableBackup $true
-EnableGuestServicesInterface $false
Описание скрипта (ChatGPT)
ChatGPT 4 | DeepSeek | Midjourney, [24.02.2025 11:29]
Этот сценарий PowerShell, похоже, предназначен для настройки существующей виртуальной машины в System Center Virtual Machine Manager (SCVMM). Давайте разберёмся, что он делает, и отметим несколько моментов, на которые стоит обратить внимание.
Что делает сценарий:
1. Находит виртуальный диск:
Get-SCVirtualDiskDrive -VMMServer upra-scvmm -All | where {$_.ID -eq "5614825f-ad13-43ee-8871-a2e2e15c1f51"}: эта строка извлекает конкретный виртуальный диск с сервера SCVMM с именем "upra-scvmm" по его идентификатору.
Set-SCVirtualDiskDrive ...: Эта строка затем изменяет свойства найденного виртуального дискового накопителя:
-Bus 0 -LUN 0: устанавливает для шины SCSI и номера LUN значение 0. Это типично для загрузочного диска.
-VolumeType BootAndSystem: определяет тип тома как загрузочный и системный.
-SCSI: определяет тип интерфейса как SCSI.
-JobGroup e458d117-c0c0-4257-b412-835ffd2c8f35: назначает операцию определенной группе заданий.
-IOPSMaximum 0: устанавливает максимальное количество операций ввода-вывода в секунду равным 0, фактически удаляя любое ограничение IOPS.
2. Находит виртуальную машину:
• Get-SCVirtualMachine -VMMServer upra-scvmm -Name "ocserv (VPN-сервер OpenConnect — Debian12)" -ID "b57031c9-c8c7-4b7b-8600-dc3437c935ca" | where {$_.VMHost.Name -eq "<Хост_Hyper-V>.<Домен>"}: эта строка извлекает конкретную виртуальную машину из "upra-scvmm" по имени и идентификатору. Он также фильтрует по имени хоста виртуальной машины. Вам нужно будет заменить <Хост_Hyper-V>.<Домен> на фактическое полное доменное имя вашего хоста Hyper-V.
3. Находит профиль операционной системы:
• Get-SCOperatingSystem -VMMServer upra-scvmm -ID "5c8bad7f-fcd3-44dd-9c2e-27ee4e5a6364" | where {$_.Имя -eq "Debian GNU/Linux 10 (64-разрядная версия)"}: эта строка извлекает профиль операционной системы из SCVMM по идентификатору и имени. Здесь может возникнуть потенциальная проблема. Имя вашей виртуальной машины — "Debian12", но вы выбираете профиль операционной системы "Debian GNU/Linux 10 (64-разрядная версия)". Это, скорее всего, неверно, если ваша виртуальная машина на самом деле работает под управлением Debian 12.
4. Поиск профиля типа процессора:
• Get-SCCPUType -VMMServer upra-scvmm | where {$_.Name -eq "3,60 ГГц Xeon (кэш-память 2 МБ L2)"}: эта строка извлекает конкретный профиль типа процессора по имени. Это может быть актуально для вашей среды.
5. Настройка виртуальной машины:
Set-SCVirtualMachine -VM $VM ...: эта строка применяет широкий спектр настроек к виртуальной машине, найденной ранее. Давайте разберём ключевые параметры:
-Name «ocserv (OpenConnect VPN-сервер — Debian12)»: задаёт имя виртуальной машины.
-Description «20.02.2025 И.В. Лыткин Сервер OpenConnect VPN-сервер»: задаёт описание виртуальной машины (на русском языке).
-OperatingSystem $OperatingSystem: применяет профиль операционной системы. Как упоминалось ранее, это может указывать на Debian 10, в то время как ваша виртуальная машина называется Debian 12.
-CPUCount 4: устанавливает количество виртуальных процессоров равным 4.
-MemoryMB 8192: устанавливает объём памяти равным 8 ГБ (8192 МБ).
-DynamicMemoryEnabled $false: отключает динамическую память.
-MemoryWeight 5000: устанавливает вес памяти (при отключенной динамической памяти это менее важно, но все равно устанавливается).
-CPUExpectedUtilizationPercent 20: устанавливает ожидаемый процент загрузки ЦП.
-DiskIops 0: устанавливает ограничение IOPS для диска на 0 (без ограничения).
-CPUMaximumPercent 100: устанавливает максимальный процент загрузки ЦП на 100%.
-CPUReserve 0: устанавливает резерв ЦП на 0.
-NumaIsolationRequired $false: отключает изоляцию NUMA.
-NetworkUtilizationMbps 0: устанавливает ограничение на использование сети на 0 (без ограничений).
-CPURelativeWeight 100: устанавливает относительный вес ЦП.
-HighlyAvailable $false: отключает высокую доступность.
-DRProtectionRequired $false: отключает защиту от сбоев.
-SecureBootEnabled $false: отключает безопасную загрузку.
-CPULimitFunctionality $false: отключает функцию ограничения ЦП.
-CPULimitForMigration $false: отключает ограничение ЦП для миграции.
-CheckpointType Production: устанавливает тип контрольной точки как «Производство».
-CPUType $CPUType: применяет профиль конкретного типа ЦП.
-Tag «Сервер OpenConnect VPN»: добавляет тег к виртуальной машине.
-CostCenter «ИТ»: устанавливает центр затрат.
-QuotaPoint 1: устанавливает точку квоты.
-JobGroup e458d117-c0c0-4257-b412-835ffd2c8f35: назначает операцию той же группе заданий.
-RunAsynchronously: запускает команду асинхронно.
-StartAction TurnOnVMIfRunningWhenVSStopped: устанавливает действие при запуске.
-StopAction SaveVM: устанавливает действие при остановке для сохранения виртуальной машины.
-DelayStartSeconds 0: устанавливает значение задержки запуска в секундах равным 0.
-BlockDynamicOptimization $false: отключает блокировку динамической оптимизации.
-EnableOperatingSystemShutdown $true: включает службу интеграции выключения операционной системы.
-EnableTimeSynchronization $true: включает службу интеграции синхронизации времени.
-EnableDataExchange $true: включает службу интеграции обмена данными.
-EnableHeartbeat $true: Включает службу интеграции с Heartbeat.
-EnableBackup $true: Включает службу интеграции с резервным копированием.
-EnableGuestServicesInterface $false: Отключает службу интеграции с интерфейсом гостевых служб. Возможно, вы захотите включить это, если вам необходимо воспользоваться услугами для гостей.
Рекомендации для проверки и возможные проблемы:
1. Несоответствие профиля операционной системы (Debian 10 и Debian 12): это самый важный момент. Если ваша виртуальная машина действительно работает под управлением Debian 12, вы ДОЛЖНЫ изменить команду Get-SCOperatingSystem, чтобы получить профиль операционной системы Debian 12. Вам нужно проверить, есть ли у вас профиль ОС Debian 12 в SCVMM. Если есть, обновите условие поиска (например, по имени).
Если у вас нет профиля ОС Debian 12, вам может потребоваться импортировать или создать его в SCVMM. Использование профиля Debian 10 для виртуальной машины Debian 12 может привести к неправильным настройкам гостевой ОС и, возможно, к другим проблемам.
2. Заполнитель имени хоста виртуальной машины: не забудьте заменить <Хост_Hyper-V>.<Домен> на фактическое полное доменное имя вашего хоста Hyper-V.
3. Специфичность профиля типа ЦП: профиль типа ЦП «Xeon 3,60 ГГц (кэш-память 2 МБ)» является очень специфичным. Убедитесь, что этот профиль подходит для вашей среды и хоста Hyper-V, на котором работает виртуальная машина. Если вы планируете переместить эту виртуальную машину на другие хосты с потенциально другими типами ЦП, более универсальным профилем ЦП может быть более подходящий, или вам может потребоваться изменить этот параметр в зависимости от хоста.
4. Включить интерфейс гостевых служб $false: подумайте, нужна ли вам служба интеграции интерфейса гостевых служб. Если вы планируете использовать функции, которые зависят от гостевых служб (например, расширенное управление или операции, инициированные гостем), вам следует установить для этого параметра значение $true.
5. Зафиксированные идентификаторы. Хотя использование идентификаторов может быть точным, сильная зависимость от фиксированных идентификаторов (например, для VirtualDiskDrive и OperatingSystem) делает скрипт менее переносимым и сложным для повторного использования в других виртуальных машинах или средах. Если вы планируете использовать этот скрипт для других виртуальных машин, подумайте о том, чтобы сделать поиск объектов более динамичным (например, более надёжным поиск профиля ОС по имени). Однако, если эти идентификаторы совпадают в вашей среде и этот скрипт предназначен только для этой виртуальной машины, это может быть приемлемо.
6. Высокая доступность и аварийное восстановление: для параметров HighlyAvailable $false и DRProtectionRequired $false установлено значение $false. Это может быть намеренно сделано для тестовой или разрабатываемой виртуальной машины. Если это производственный сервер, вам, скорее всего, следует пересмотреть эти настройки и включить высокую доступность и аварийное восстановление, если это соответствует вашей среде и требованиям.
Рекомендации:
Исправьте профиль операционной системы: Это самый важный шаг. Убедитесь, что вы используете правильный профиль операционной системы для Debian 12, если ваша виртуальная машина действительно работает на Debian 12.
Замените заполнитель хоста виртуальной машины: обновите <Хост_Hyper-V>.<Домен> до правильного полного доменного имени хоста виртуальной машины.
Просмотрите профиль типа ЦП: убедитесь, что профиль типа ЦП подходит, или рассмотрите возможность использования более универсального профиля.
Просмотрите интерфейс гостевых служб: решите, нужен ли вам параметр EnableGuestServicesInterface $true.
Рассмотрите HA/DR: если это рабочая виртуальная машина, просмотрите и, возможно, включите высокую доступность и аварийное восстановление.
Перед запуском этого сценария в рабочей среде настоятельно рекомендуется сначала протестировать его в тестовой среде. Обратите пристальное внимание на настройки профиля операционной системы, чтобы избежать неправильной настройки.
$GuestOSProfileName = "Debian GNU/Linux 12 (64-bit)"
$GuestOSProfile = Get-SCGuestOSProfile -VMMServer upra-scvmm | where {$_.Name -eq $GuestOSProfileName}
if ($GuestOSProfile) {
$UserRole = Get-SCUserRole -VMMServer upra-scvmm -Name "Администратор"
Set-SCGuestOSProfile -GuestOSProfile $GuestOSProfile -Name $GuestOSProfileName -Description "24.02.2025 И.В. Лыткин Профиль операционной системы Debian 12 64-бит." -TimeZone 207 -Owner 'DOMAIN\Admin' -UserRole $UserRole # Убраны лишние параметры для Linux и некорректный OperatingSystem
Write-Host "Профиль гостевой ОС '$GuestOSProfileName' успешно обновлен." -ForegroundColor Green
} else {
Write-Error "Профиль гостевой ОС '$GuestOSProfileName' не найден. Убедитесь, что он существует в SCVMM."
}
Внутри ВМ:
root@ocserv:~# hostnamectl
Static hostname: ocserv
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: 510d306312e546f18f193589519995ce
Boot ID: a9ff1c4c12bd4a4580440802f05fada3
Product UUID: c4dc2255-0d42-4958-86b3-15447d4eac57
Virtualization: microsoft
Operating System: Debian GNU/Linux trixie/sid
Kernel: Linux 6.12.15-amd64
Architecture: x86-64
Hardware Vendor: Microsoft Corporation
Hardware Model: Virtual Machine
Hardware Serial: 0868-4273-9533-7483-1970-6721-59
Firmware Version: Hyper-V UEFI Release v4.0
Firmware Date: Tue 2019-12-17
Firmware Age: 5y 2month 1w 2d
Portainer - панель управления Docker
Install Portainer CE with Docker on Linux
docker volume create portainer_data
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
sudo docker stop portainer
sudo docker rm portainer
sudo docker pull portainer/portainer-ce:latest
sudo docker run -d -p 8000:8000 -p 9443:9443 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
Обновление агента
sudo docker stop portainer_agent
sudo docker rm portainer_agent
Заметки по технологиям Docker
Docker удобен для организации процесса разработки ПО в команде разработчиков + DevOps-инженеров там, где важна минимизация времени от изменения кода до ввода его в эксплуатацию у клиентов. Процесс разработки новых версий ПО можно свести к разработке и публикации нового образа с сервисом в публичном или приватном репозитории образов. Разработчик может организовать себе быстро личный стенд для разработки своей части кода без влияния на других разработчиков.