-
Dockerizing MCP – Bringing Discovery, Simplicity, and Trust to the Ecosystem
Discover the Docker MCP Catalog and Toolkit, a new way to source, use, and scale with MCP tools.
Read now
-
Update on the Docker DX extension for VS Code
Learn about the latest changes to the Docker DX extension for VS Code, new features for authoring, and what’s coming next to enhance your container workflows.
Read now
-
Docker Desktop 4.41: Docker Model Runner supports Windows, Compose, and Testcontainers integrations, Docker Desktop on the Microsoft Store
Docker Desktop 4.41 brings new tools for AI devs and teams managing environments at scale — build faster and collaborate smarter.
Read now
-
How to build and deliver an MCP server for production
In December of 2024, we published a blog with Anthropic about their totally new spec (back then) to run tools with AI agents: the Model Context Protocol, or MCP. Since then, we’ve seen an explosion in developer appetite to build, share, and run their tools with Agentic AI – all using MCP. We’ve seen new…
Read now
Содержание:
-
1.
Предыстория -
2.
Windows контейнер -
3.
В мире контейнеров Windows -
4.
Связь с Docker -
5.
Мир Windows
Начиная с Windows Server 2016 в операционной системе от Microsoft включена нативная поддержка контейнеров. Это не Linux контейнеры, это контейнеры, которые работают на Windows, и запускают Windows внутри себя.
Данный факт является результатом присоединения Microsoft к Open Container Initiative (OCI). Контейнеры в Windows позволяют запускать приложения, которые изолированы от остальной части системы в переносимых контейнерах. Эти контейнеры включают в себя все, чтобы ваше приложение было полностью функциональным. Так же как это произошло с Linux, Microsoft надеется, что контейнеры изменят характер поставки программного обеспечения для пользователей и в Windows.
Предыстория
Контейнеры являлись основой вычислений в Linux в течение целого ряда лет. Google, например, уже очень давно использует решения, основанные на контейнерах по всей своей империи, чтобы предоставлять распределенные приложения не только своим сотрудникам, но и своим пользователям по всему миру.
Тем не менее, Google не был долгое время одинок в своем увлечении контейнерными вычислениями. В какой-то момент из ниоткуда появился Docker, который в отличии от Google стандартизировал процессы доставки контейнеров, а также управления ими. Более того, Docker развивался сообществом энтузиастов в мире открытого исходного кода, что сделало его простым и очень популярным решением. С развитием проекта Docker буквально у каждого желающего появилась возможность получить скорость, гибкость и простоту управления программным обеспечением и инфраструктурой, которую предоставляют контейнеры.
Docker революция стала настолько значительной, что даже Microsoft присоединился к этой инициативе в первую очередь за счет поддержки Docker и Linux в Azure, а теперь и за счет интеграции этой технологии в Windows Server 2016. Самое интересное это то, что контейнеры Windows Server не основаны на Linux, это нечто совершенно новое. Windows контейнеры — это контейнеры, которые работают в Windows и запускают Windows внутри себя.
Причем Microsoft настолько серьезно стала относится к контейнерам, что сейчас активно участвует в Open Container Initiative (OCI), пытаясь перетягивать одеяло на себя так, как будто бы она сама придумала эту технологию.
Windows контейнер
Контейнер в Windows имеет много общего с его аналогом в Linux. Оба обеспечивают изолированную среду для запуска приложений. И там и там контейнеры используют передовые технологии изоляции для обеспечения портативной, но одновременно ограниченной среды, которая включает в себя практически все, чтобы приложение могло быть полностью функциональным.
Контейнер очень похож на виртуальную машину (ВМ) и часто рассматривается как отдельный тип виртуализации, но это два совершенно разные понятия. Да, каждый работает под управлением операционной системы (ОС), предоставляет внутри себя локальную файловую систему и может быть доступен по сети так же как физический компьютер. Тем не менее, при использовании ВМ вы имеете дело с полной и независимой ОС вместе с виртуальными драйверами устройств, управлением памятью и другими компонентами, которые добавляют к накладные расходы.
Контейнер переиспользует большее количество общих ресурсов хост-системы нежели виртуальная машина, а значит, он более легкий, быстрее разворачивается и проще масштабируется между различными датацентрами. Таким образом, контейнер может предложить более эффективный механизм для инкапсулирования приложения, обеспечивая ему при этом необходимые интерфейсы хост-системы — все из этого приводит к более эффективному использованию ресурсов и улучшению переносимости приложений.
Microsoft планирует предложить два типа контейнеров в Windows Server 2016: контейнер Windows Server и Hyper-V контейнер. Оба типа функционируют одинаковым образом, и могут быть созданы и управляются одинаково. Там, где они различаются — это в уровне изоляции, который каждый из них обеспечивает.
Контейнер Windows Server разделяет ядро с ОС работает на хост-машине, что означает, что все контейнеры, работающие на этой машине, разделяют одно и то же ядро. В то же время, каждый контейнер поддерживает свой собственный вид на операционную систему, реестр, файловую систему, IP-адреса и другие компоненты, сочетая это с изоляцией, предоставляемой каждому контейнеру при помощи процессов, пространства имен и технологий управления ресурсами.
Контейнер Windows Server хорошо подходит для ситуаций, в которых и основная ОС, и приложения в контейнерах лежат в пределах той же зоны доверия, например для приложений, которые охватывают несколько контейнеров или образуют общую службу. Тем не менее, контейнеры Windows Server обсуждаются в связи с их зависимостью от процесса обновления ОС хост-системы, который может осложнить обслуживание и препятствовать процессам. Например, патч примененный к хосту может сломать приложение, работающее в контейнере. Что еще более важно, в таких ситуациях, как многопользовательские среды, модель разделяемого ядра может раскрыть систему для уязвимостей приложений и кросс-контейнерных атак.
Hyper-V контейнер решает эти проблемы, предоставляя виртуальную машину, в которой нужно запустить контейнер Windows. При таком подходе контейнер больше не разделяет ядро хост-машины и не имеет зависимости от патчей ОС этой машины. Конечно, такой подход означает некоторую потерю скорости и эффективности упаковки, которые вы получаете с обычным контейнером в Windows Server, но взамен вы получаете более изолированную и безопасную среду.
Вне зависимости от типа контейнера, который вы используете, теперь у вас есть возможность использовать контейнеры с такими технологиями Windows как .NET или PowerShell, что не было возможно раньше. Контейнер для Windows предоставляет все необходимое для обеспечения работы приложения на любом компьютере под управлением Windows Server 2016, давая вам тот уровень переносимости, который был не доступен на протяжении большей части истории Windows. Вы можете создавать свои контейнеры локально, делать их доступными процессов для тестирования и контроля качества, а затем отправить их в команде, занимающейся продуктивом, без необходимости беспокоиться о сложных установках и конфигурациях на каждом шаге этого пути.
В мире контейнеров Windows
Ряд компонентов принимают участие в процессе создании и запуска контейнеров, начиная с хоста, на котором они должны работать. Хост может быть как физическим компьютером, так и ВМ с Windows 2016 Server. Единственное, что важно, чтобы была включена функция контейнеризации для Windows.
Вы можете разместить контейнеры на любой версии Windows: Server Full UI или же Core, которая устанавливается по умолчанию. Microsoft также представляет Nano издание для Windows Server 2016 — минимальную версию ОС, которая не включает в себя локальный графический пользовательский интерфейс или консоль.
Microsoft также добавила вложенную виртуализацию для Windows Server 2016, так что вы можете запустить Hyper-V контейнеры, если хостом является ВМ. Если вы планируете запускать такой тип контейнера, необходимо включить функцию Hyper-V на хост-ОС. Microsoft также добавляет поддержку контейнера для Windows 10, хотя только для Hyper-V контейнеров.
Как и с контейнерами Docker, вы разворачиваете контейнеры для Windows из образов. Каждый образ начинается с образа ОС контейнера — базового образа, включающего в себя операционную систему, которая будет работать внутри контейнера. В настоящее время Microsoft предоставляет два базовых образа: образ Server Core и образ Nano Server. Вы должны загрузить хотя бы один из этих образов ОС от Microsoft, прежде чем сможете развернуть контейнер.
Microsoft строго определяет, какие образы вы можете использовать с каким типом контейнера на основании хост-ОС, как описано в следующей таблице.
|
Хост-ОС |
Контейнер Windows Server |
Контейнер Hyper-V |
|
Windows Server Full UI |
Образ Server Core |
Образ Nano Server |
|
Windows Server Core |
Образ Server Core |
Образ Nano Server |
|
Windows Server Nano |
Образ Nano Server |
Образ Nano Server |
|
Windows 10 |
N/A |
Образ Nano Server |
Как вы можете видеть, Hyper-V контейнеры в настоящее время поддерживают только образ Nano сервера, но ваш выбор контейнеров Windows Server зависит от того, с какой версией Windows Server вы работаете.
Для этого типа контейнера, образ ОС должен также соответствовать хост-системы в отношении сборки и уровня обновления. Несоответствие может привести к непредсказуемому поведению как для контейнера, так и хоста. Это означает, что вы должны обновить образ базового контейнера ОС при обновлении ОС хоста. Это также означает, что вы не будете иметь возможность запускать Linux контейнер на Windows машине, или наоборот, и это также верно для Hyper-V контейнеров.
Образы обеспечивают высокую степень гибкости, когда речь идет о развертывании контейнеров. Вы можете создавать образы на основе существующего образа и обновлять новые образы так часто, как это необходимо. После этого вы можете развернуть один или несколько контейнеров из этого образа.
Например, предположим, что вы создаете образ, основанный на Server Core. В новый образ, вы устанавливаете приложение, которое в настоящее время находится в разработке вместе со всеми зависимостями этого приложения. Затем вы можете развернуть один или несколько контейнеров из этого образа. Каждый контейнер функционирует как песочница, которая включает все компоненты, необходимые для полной работоспособности приложения.
Образ может быть развернут так часто, как это необходимо, а также совместно использоваться любым количеством контейнеров. Вы создаете контейнеры по мере необходимости, а затем избавляетесь от них, когда вы с ними закончите. Но лучше всего то, что вы можете обновить и повторно развернуть образ в любое время, а затем создать из него новые контейнеры, которые содержат последние изменения.
Вам не нужно выбирать тип контейнера (Windows Server или Hyper-V) до тех пор, пока вы не будете готовы запустить фактический контейнер. Тип контейнера не имеет никакого отношения к тому, как вы собираете ваши образы. Образы хранятся в репозитории и доступны по запросу для разворачивания контейнеров, где и когда они необходимы, будь то контейнеры Windows Server или Hyper-V.
Связь с Docker
Помимо компании, Docker также является проектом с открытым кодом, которая облегчает процесс развертывания и управления контейнерами. Контейнеры Windows теперь являются частью этого проекта, и сообщество Docker интенсивно работает, чтобы полностью интегрировать контейнеры Windows в экосистему Docker. В рамках этой же инициативы Docker предлагает Docker Engine для Windows, и Docker Client для Windows.
Docker Engine обеспечивает функциональность, необходимую для управления Docker окружением. Например, Docker Engine позволяет автоматизировать создание контейнеров из образов. Хотя вы можете создавать образы вручную, Docker Engine предлагает целый ряд преимуществ, т.к. возможность хранения образов как кода, легкого пересоздания этих образов или включения их в цикл непрерывной интеграции в процессе разработки.
Тем не менее, Docker Engine не является частью установки Windows. Вы должны загрузить, установить и настроить его отдельно от Windows. Docker Engine работает как служба Windows. Можно настроить эту службу, используя файл конфигурации или Windows Service Control Manager (SCM). Например, вы можете установить отладку по умолчанию и параметры журнала или настроить, как Docker Engine принимает сетевые запросы. Microsoft рекомендует использовать файл конфигурации, а не SCM, но отмечает, что не каждый параметр конфигурации в файле применим к контейнерам Windows.
Docker Engine по существу делает всю рутинную работу по управлению контейнером за вас, расширяя API, необходимый для клиента Docker для взаимодействия Docker Engine. Клиент представляет собой интерфейс командной строки, который предоставляет набор команд для управления образами и контейнерами. Это те же самые команды, которые позволяют создавать и запускать контейнеры Docker в Linux. Хотя вы и не можете запустить контейнер для Windows на Linux или контейнер Linux на Windows, вы можете использовать один и тот же клиент для управления как Linux и Windows контейнерами, будь то контейнеры Windows Server или Hyper-V.
Как и с Docker Engine, вам необходимо загрузить и установить клиент Docker самостоятельно. Клиент может работать как на Windows 10 или Windows Server 2016. Вам нужно только указать клиенту Docker службу, которой необходимо начать управлять.
Мир Windows
Microsoft и Docker осталось сделать еще много работы, прежде чем контейнеры для Windows будут полностью функциональны, но то, что мы видим уже сейчас представляет собой значительный шаг вперед. Пользователям Windows, наконец, получат возможность пользоваться всеми преимуществами гибкости и переносимости, которые контейнеры предлагали миру Linux на протяжении более десяти лет.
Данная публикация является разбором особенностей контейнерной виртуализации Docker под системой Windows.
Она не претендует на роль исчерпывающей и по мере необходимости будет обновляться и дополняться.
За практическим руководством с нуля советую обратиться к этой публикации.
Содержание
- Предварительные настройки
- Выбор между Docker Toolbox on Windows или Docker for Windows
- Windows контейнеры и Linux контейнеры
- Особенности монтирования папок
- Монтирование с хост-машины или volume
- Особенности разметки диска GPT и MBR
- Docker Toobox to Windows
- Docker Swarm
- Проблемы с кодировкой
- Полезные ссылки
- Заключение
Предварительные настройки
Контейнерная виртуализация или виртуализация на уровне операционной системы Docker нативно работает только на дистрибутивах Linux и FreeBSD (экспериментально).
На Windows вам понадобится гостевая Linux система либо специальная минималистичная виртуальная машина с ядром Linux от разработчиков Docker, которая и ставится из коробки.
Само собой разумеется, что вы включили виртуализацию у себя в BIOS/UEFI
Пункт настройки может называться по-разному: VT-x, VT-d, Intel VT, AMD-V, Virtualization Technology.
Еще одним минимальным системным требованием будет разрядность системы x64 и версия не ниже Windows 7 Pro.
Выбор между Docker Toolbox on Windows или Docker for Windows
Появление Docker Toolbox on Windows и Docker Toolbox on Mac было большим событием.
Сборка включается в себя сам docker, утилиту docker-compose, утилиту для работы с виртуальной машиной docker-machine и клиент Kitematic.
Используется виртуальная машина (по умолчанию на VirtualBox) с минималистичным Linux окружением.
Позже для новых операционных систем выпустили Docker for Windows и Docker for Mac, которая на текущий момент является актуальной версией и продолжает развиваться.
Выбор между версиями не сложный:
— Если у вас Windows 10 x64 Pro, Enterprise или Education то включаем службу Hyper-V и ставим Docker for Windows.
Заметьте, что после включения службы Hyper-V пропадет возможность запускать и создавать x64 виртуальные машины на VirtualBox.
— Если же у вас другая версия Windows(7 Pro, 8, 8.1, 10 Home) то ставим VirtualBox и Docker Toolbox on Windows.
Несмотря на то, что Docker Toolbox разработчиками признан устаревшим работа с ним слабо отличается от Docker for Windows.
Вместе с установкой Docker Toolbox будет создана виртуальная машина.
В самом VirtualBox можно будет добавить оперативной памяти и ядер процессора на ваше усмотрение.
Windows контейнеры и Linux контейнеры
Docker for Windows предоставляет возможность переключать контейнеризацию между Linux и Windows версией.
В режиме Windows контейнеризации вы можете запускать только Windows приложения.
Замечу, что на май 2018 года в официальном Docker Hub существует всего 13 образов для Windows.
После включения Windows контейнеризации не забудьте добавить внешнюю сеть.
В конфигурационном файле docker-compose.yml это выглядит так:
networks:
default:
external:
name: nat
Особенности монтирования папок
На примонтированных volume-ах не кидаются события файловой системы, поэтому inotify-tools не работает.
Спасибо пользователю eee
Если вы разрабатываете свой проект и пользуетесь docker-compose вне домашней папки то вам нужно будет проделать некоторые манипуляции.
Используя Docker for Windows для монтирования нового диска у вашего локального пользователя обязательно должен стоять пароль, который будет использоваться для доступа к shared папки.
Особенность заключается в том, что монтируемые внутрь контейнера диск будет монтироваться как от удаленной машины //10.0.75.1/DISK_DRIVE по протоколу SMB.
Для Docker Toolbox диски монтируются в самом VirtualBox на вкладке «Общие папки»
Пример для диска «D»:
Права доступа к монтируемым файлам и папкам
Как бы вам не хотелось, но для всех примонтированных из хост-машины файлов и папок будут стоять права 755 (rwx r-x r-x) и поменять их вы не сможете.
Остро встает вопрос при монтировании внутрь файла закрытого SSH ключа, права на который должны быть только у владельца(например 600).
В данном случае либо генерируют ключ при создании образа, либо прокидывают сокет ssh-agent с хост-машины.
Монтирование с хост-машины или volume
Монтирование внутрь контейнера происходит с использованием сети и протокола SMB, следовательно, внутри контейнера диск «D:\» будет примонтирован из источника //10.0.75.1/D
Использование volume внутри контейнера отображается как монтирование локального диска /dev/sda1, что влияет на скорость работы.
Простым тестом копирование файла на обычном HDD скорость работы получилась следующая:
Такая разница в скорости скорее всего связана с тем, что в volume данные сбрасываются на диск постепенно, задействуя кеш в ОЗУ.
Особенности разметки диска GPT и MBR
Данный пункт не является истинной так как опровергающей или подтверждающей информации в интернете найти не смог.
Если на хост-машине таблица разделов MBR, то контейнер с MySQL/MariaDB может упасть с ошибкой:
InnoDB: File ./ib_logfile101: ‘aio write’ returned OS error 122. Cannot continue operation
По умолчанию в базе данных включеён параметр innodb_use_native_aio, отвечающий за асинхронный ввод/вывод и его надо будет выключить.
Данная проблема также встречается на некоторых версиях MacOS.
Docker Toobox to Windows
Главное правило: начинать работу с запуска ярлыка на рабочем столе «Docker Quickstart Terminal», это решает 80% проблем.
— Бывает возникают проблемы с отсутствия переменных окружения, решается командой:
eval $(docker-machine env default)
— Если все же возникают проблемы из разряда «docker: error during connect», необходимо выполнить:
docker-machine env --shell cmd default
@FOR /f "tokens=*" %i IN ('docker-machine env --shell cmd default') DO @%i
Название Docker Machine по умолчанию default.
Docker Swarm
Ни в Docker for Mac, ни в Docker for Windows — нет возможности использовать запущенные демоны в качестве клиентов кластера (swarm members).
Спасибо пользователю stychos
Проблемы с кодировкой
Используя Docker Toolbox(на Docker for Windows не удалось воспроизвести) нашлась проблема с тем, что русские комментарии в docker-compose.yml файле приводили к ошибке:
Traceback (most recent call last):
File "docker-compose", line 6, in <module>
File "compose\cli\main.py", line 71, in main
File "compose\cli\main.py", line 124, in perform_command
File "compose\cli\command.py", line 41, in project_from_options
File "compose\cli\command.py", line 109, in get_project
File "compose\config\config.py", line 283, in find
File "compose\config\config.py", line 283, in <listcomp>
File "compose\config\config.py", line 183, in from_filename
File "compose\config\config.py", line 1434, in load_yaml
File "site-packages\yaml\__init__.py", line 94, in safe_load
File "site-packages\yaml\__init__.py", line 70, in load
File "site-packages\yaml\loader.py", line 24, in __init__
File "site-packages\yaml\reader.py", line 85, in __init__
File "site-packages\yaml\reader.py", line 124, in determine_encoding
File "site-packages\yaml\reader.py", line 178, in update_raw
File "c:\projects\compose\venv\lib\encodings\cp1251.py", line 23, in decode
UnicodeDecodeError: 'charmap' codec can't decode byte 0x98 in position 1702: character maps to <undefined>
[4176] Failed to execute script docker-compose
Полезные ссылки
Docker Toolbox on Windows
Docker for Windows
Практическое руководство по Docker
Заключение
Особенности работы с Docker контейнеризацией на системе Windows не отличается от работы на Linux за исключение разобранных выше.
В статье я умышленно не упомянул заметно низкую скорость работы контейнеров и overhead используя систему Windows как само собой разумеющееся.
Буду рад услышать ваши отзывы. Не стесняйтесь предлагать улучшения или указывать на мои ошибки.
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Какой версией Docker вы пользуетесь?
32% Docker Toolbox on Windows88
68% Docker for Windows187
Проголосовали 275 пользователей. Воздержались 196 пользователей.
Что такое Docker Desktop
Docker Desktop — это инструмент для работы с Docker-контейнерами на локальной машине. Он упрощает процесс разработки, тестирования и развертывания приложений, позволяя взаимодействовать с контейнерами как через консоль, так и через удобный интерфейс.
Ключевые особенности:
- понятный графический интерфейс,
- удобное управление образами и контейнерами,
- встроенные инструменты для мониторинга,
- возможность разработки и тестирования без привязки к серверу,
- поддержка работы с Docker Compose.
Если вы только начинаете изучение Docker и хотите разобраться в основах, рекомендуем ознакомиться с отдельным вводным обзором. В нем разобрали принципы работы Docker, его основные компоненты и решаемые задач. Из текста вы узнаете, как создать и запустить контейнер, а также какую роль играет Kubernetes в связке c Docker.
О системных требованиях
Перед установкой Docker Desktop важно выбрать подходящий бэкенд для работы с контейнерами: WSL 2 или Hyper-V. Оба имеют свои особенности, так что от выбора будут зависеть и системные требования. Далее в тексте разберемся, когда и какой бэкенд подойдет лучше.
Когда нужен WSL
WSL 2 (Windows Subsystem for Linux 2) — это усовершенствованная версия подсистемы Windows для Linux, которая использует виртуальную машину с реальным Linux-ядром. В отличие от первой версии, WSL 2 обеспечивает лучшую совместимость с Linux-инструментами, технологиями и приложениями, а также более высокую производительность.
Преимущества использования WSL 2 с Docker Desktop
Работа с Linux-контейнерами. Docker изначально разрабатывали для работы в Linux-среде, поэтому большинство контейнеров в Docker Hub — это образы, ориентированные на Linux. Использование WSL 2 предоставляет Docker Desktop полноценную Linux-среду на Windows.
Повышенная производительность. WSL 2 значительно ускоряет выполнение контейнеров, что особенно заметно в сравнении с WSL 1 или Hyper-V, о котором мы расскажем дальше. Это преимущество обеспечивает полноценное Linux-ядро, которое позволяет Docker работать гораздо быстрее и с меньшими накладными расходами.
Работа с файловой системой Linux. В WSL 2 можно монтировать файловую систему Linux, что позволяет работать с кодом и данными в нативной Linux-среде. Это особенно важно при разработке приложений, которые будут запускаться в Linux-контейнерах и требуют специфической настройки среды — например, прав доступа или структуры каталогов.
Когда нужен Hyper-V
Рассмотрим ключевые сценарии, в которых предпочтительнее использовать Hyper-V.
Если система не поддерживает WSL 2
Некоторые сборки системы не позволяют включать необходимые компонентов для работы WSL 2 В частности, это касается старых версий Windows, а также устройств, которые не поддерживают Windows 10 Pro или 11 Pro, — WSL 2 для них недоступна, так как требует включенной виртуализации на уровне системы. В таких случаях можно использовать Hyper-V для виртуализации контейнеров и запуска Docker Desktop.
Для работы с Windows-контейнерами
Docker Desktop поддерживает как Linux-, так и Windows-контейнеры. Однако последние требуют прямого взаимодействия с ядром Windows, а WSL 2 предоставляет только Linux-среду. Hyper-V позволяет запускать Windows-контейнеры благодаря виртуализации Windows-системы.
Для изоляции и обеспечения безопасности
Hyper-V создает полноценные виртуальные машины, обеспечивая строгую изоляцию контейнеров друг от друга и от хост-системы. Это может быть важно в корпоративной среде или при работе с чувствительными данными.
Разница между WSL 2 и Hyper-V
Если вам нужны Linux-контейнеры и высокая производительность — выбирайте WSL 2. Если же требуется строгая изоляция или работа с Windows-контейнерами, Hyper-V будет предпочтительнее. Подробнее о разнице по ключевым критериям — в таблице:
| Критерий | WSL 2 | Hyper-V |
| Производительность | Высокая (нативное Linux-ядро) | Низкая (работа через полноценную ВМ) |
| Изоляция | Относительно низкая | Высокая (контейнеры изолированы) |
| Типы контейнеров | Только Linux-контейнеры | Linux- и Windows-контейнеры |
Системные требования Docker Desktop
При использовании WSL 2 в качестве бэкенда
- WSL версии 1.1.3.0 или новее.
- Windows 11 64-bit Home / Pro / Enterprise / Education, версия 22H2 или новее.
- Windows 10 64-bit Home / Pro / Enterprise / Education, версия 22H2 (сборка 19045) или новее.
- Включенная функция WSL 2 в Windows. Подробная инструкция есть в документации Microsoft;
- 4 ГБ ОЗУ.
- Включенная аппаратная виртуализация в BIOS на вашей локальной машине.
При использовании Hyper-V в качестве бэкенда
- Windows 11 64-разрядная Enterprise / Pro / Education, версия 22H2 или новее.
- Windows 10 64-разрядная Enterprise / Pro / Education, версия 22H2 (сборка 19045) или новее.
- Включенная функция Hyper-V. Подробнее об установке — в документации Microsoft;
- 4 ГБ ОЗУ.
- Включенная аппаратная виртуализация в BIOS на вашей локальной машине.
Установка WSL 2
1. Откройте PowerShell от имени администратора и введите команду wsl —install. Она выполняет следующие действия:
- включает дополнительные компоненты WSL и платформы виртуальных машин;
- скачивает и устанавливает последнюю версию ядра Linux;
- задает WSL 2 в качестве среды по умолчанию;
- скачивает и устанавливает дистрибутив Ubuntu Linux.
2. После успешной установки всех компонентов перезапустите компьютер.
Первичная настройка
1. Откройте установленный дистрибутив с помощью меню Пуск — найдите установленный дистрибутив (Ubuntu).
2. При первом запуске системы нужно создать имя пользователя и пароль для дистрибутива Linux.
3. Первичная настройка завершена, можно приступать к использованию WSL 2.
Альтернативный вариант — запустить WSL через PowerShell. Для этого введите команду wsl и система предложит произвести первичную настройку.
Установка Hyper-V
Для установки компонентов Hyper-V откройте PowerShell от имени администратора и выполните команду:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
Она установит все компоненты для работы Hyper-V, после чего нужно будет перезапустить компьютер.
Проверить корректность установки Hyper-V можно с помощью команды:
Get-WindowsOptionalFeature -Online -FeatureName *hyper*|ft
Установка Docker с бэкендом WSL 2
- Скачайте дистрибутив Docker Desktop с официального сайта и запустите установщик. Галочки оставьте на всех пунктах.
- После установки перезайдите в учетную запись и откройте ярлык Docker Desktop.
- Если все прошло успешно, вы увидите интерфейс инструмента:
Установка Docker с бэкендом Hyper-V
1. Скачайте дистрибутив Docker Desktop с официального сайта и запустите установщик. В инсталляционном окне уберите галочку Use WSL 2 instead of Hyper-V.
2. После установки перезайдите в учетную запись и откройте ярлык Docker Desktop.
3. Если установка выполнена корректно, программа запустится без ошибок и вы увидите интерфейс:
Запуск контейнера
Рассмотрим запуск первого контейнера на примере самого популярного образа — hello-world.
Поиск и скачивание образа
Поскольку вы только установили Docker Desktop, в системе нет образов контейнеров, которые можно запустить. Исправим это.
- Перейдите в раздел Images и нажмите кнопку Search images to run.
- Введите hello-world. В текущем окне на выбор есть две кнопки: Pull и Run. Если планируете для начала просто скачать образ, то выбирайте Pull. Если скачать и сразу запустить — Run.
- Оставляем стандартные настройки для запуска.
Проверка работы контейнера
Чтобы посмотреть запущенные контейнеры, перейдите во вкладку Containers и выберите созданный на прошлом этапе. В нашем примере для него было автоматически сгенерировано имя determined_jennings. Открыв контейнер, вы увидите сообщение, если настройка установка прошла успешно.
Как настроить запуск Docker при старте Windows
Для автозапуска Docker Desktop при авторизации на компьютере достаточно поставить галочку в настройках: Settings → General → Start Docker Desktop when you sign in to your computer.
После этого Docker Desktop будет запускаться автоматически при включении устройства.
Запуск Docker в облаке
Docker Desktop — удобный инструмент для локальной работы, но в ряде случаев может потребоваться облачная инфраструктура:
- если мощности вашего ПК не хватает для работы с контейнерами;
- если нужна среда для тестирования без нагрузки на локальную машину;
- если вы работаете с ML/AI и нужны видеокарты для обучения моделей.
1. В панели управления в верхнем меню перейдем в раздел Продукты → Облачные серверы.
2. Нажмем кнопку Создать сервер.
3. Выберем имя, регион и сегмент пула. Важно учесть, что от сегмента зависят доступные конфигурации и стоимость. После создания сервера менять сегмент пула нельзя.
4. В качестве источника выберите готовый образ, приложение, свой образ, сетевой диск или снапшот. В нашем случае — приложение Containers Ready с настроенной Ubuntu 22.04. Оно содержит:
- Docker версии 27.0.3;
- плагины для запуска Docker Compose версии 2.11.1;
- Portainer версии 2.20.3 — графический интерфейс для мониторинга и управления Docker-контейнерами, образами и сетью Docker.
5. Конфигурацию для примера возьмем базовую — 2 vCPU и 2 ГБ RAM, а в поле Диски выберем SSD Быстрый на 20 ГБ. Важно: это минимальные требования. Рекомендуем выбирать параметры серверы, исходя из ваших задач.
Помимо прочего, на этапе создания сервера или позже вы можете добавить GPU. При этом объем ОЗУ, который выделяется серверу, может быть меньше указанного в конфигурации — ядро ОС резервирует ее часть. Выделенный объем на сервере можно посмотреть с помощью команды sudo dmesg | grep Memory.
6. Для работы Containers Ready сервер должен быть доступен из интернета. Для этого создадим приватную подсеть и подключим публичный IP-адрес. В поле Сеть выберем Приватная подсеть и добавим новый публичный адрес. Подробнее о настройке подсети можно узнать в документации.
6. Добавьте SSH-ключ в поле Доступ. Подробнее о его генерации можно узнать в отдельной инструкции.
7. Ознакомьтесь с ценой и нажмите кнопку Создать сервер.
Сервер готов к использованию! Подробности о создании сервера с Сontainers Ready вы можете найти в документации. Если вам нужно запускать контейнеры с ML-моделями на мощных видеокартах, развернуть облачные серверы с GPU можно за несколько минут. Они помогут ускорить обучение нейросетей без закупки дорогого оборудования.
Читайте другие тексты о Docker
Docker. Основы работы
с контейнерами.
1. Виртуализация и виртуальные машины
Виртуализация позволяет абстрагироваться от аппаратных средств (реального «железа») для изоляции нескольких вычислительных процессов на одном компьютере. При этом процессе, фактически, происходит следующее:
- Имитируется физический объект;
- Ресурсы этого объекта отделены от аппаратной части;
- Появляется возможность внедрить несколько вычислительных процессов (операционных систем) на одной машине;
- Все операции изолированы.
Виртуализация необходима в современной разработке по ряду причин:
- Не нужно выделять физические серверы для серверной инфраструктуры под каждый отдельный случай (можно на одном сервере реализовать несколько);
- Запуск программ под конкретную операционную систему (так, пользователь Windows без проблем установит программу под macOS и наоборот);
- Необходимость организации виртуальных сетей (VPN). Они надежнее и безопаснее, особенно в корпоративных целях. Один из вариантов виртуализации — виртуальные машины.
“
Виртуальная машина — программная или аппаратная система, позволяющая исполнять программы на домашней платформе (host) в качестве гостевой.
Проще говоря, в виртуальной среде можно установить, например, Linux поверх ОС Windows. Что важно, «операционки» не будут конфликтовать, а гостевая система будет вести себя как реальный компьютер (с железом, сетевым доступом, набором программ). Да, это можно сделать и без виртуализации, но не всем удобно переключаться между ОС при перезагрузке компьютера.
Виртуальные машины обладают рядом свойств:
- Инкапсуляция. Виртуальный компьютер, операционная система, программные средства записываются на ваш ПК в виде отдельного набора файлов, которые легко переносятся;
- Изоляция. Любой набор виртуальных машин является полностью независимым и не связан с другими;
- Совместимость – виртуальные машины способны содержать разнообразные наборы операционных систем, оборудования и программ, и в то же время их легко реализовать на любом ПК;
- Независимость от железа. Так как они запускаются в виртуальном окружении, то полностью независимы от устройств домашнего компьютера.
До того, как контейнеры стали популярными, для изоляции приложений использовались именно виртуальные машины (VirtualBox, VMware). Главные их недостатки:
- Требуют много места в памяти;
- Относительно долго загружаются;
- Для их корректной работы необходима идентичность окружения (приходится устанавливать те же операционные системы и версии программ, которые имеются на тестовом оборудовании). Другими словами, следует полностью «клонировать» всю среду образа.
Контейнеры указанных недочетов не имеют, поэтому они настолько широко вошли в сферу разработки.
2. Контейнеры как инструмент разработчика
Docker – технология создания контейнеров и управления ими.
“
Контейнер — изолированная среда выполнения с центральным процессором, памятью, блоками ввода и вывода и сетевыми ресурсами, использующая ядро гостевой операционной системы.
В этом случае нет необходимости запускать отдельную операционную систему в виртуальном окружении, так как изоляция осуществляется на уровне домашней «операционки».
Один и тот же контейнер всегда работает одинаково, независимо от окружения, в котором он активирован. Контейнеры подобны реальным, в которые можно что-то положить, их легко переместить на другую машину. Они изолированы, друг с другом не «перемешиваются». Дополнительные установки не нужны, так как все уже упаковано внутри.
Virtual Machines vs. Containers
Поддержка контейнеров встроена в современные операционные системы. Docker упрощает создание и управление этими контейнерами. Таким образом, контейнеры позволяют создавать независимые, стандартизованные пакеты приложений.
В настоящее время практически все операционные системы поддерживают контейнеры: – любая версия Linux; – версия macOS не ниже 10.14; – версия Windows 10 64-bit Pro или выше.
Для Linux дистрибутивов все просто: тут поддержка контейнеризации уже встроена, нужно лишь дополнительно скачать с репозитория Docker Engine. На macOS или Windows нужно установить Docker Desktop. Его нужно запустить, прежде чем приступить к использованию команд Docker’a.
Дополнительно можно завести учетную запись на сайте репозитория контейнеров. Это позволит загружать свои проекты на ресурс и получать к ним доступ как со своей машины, так и в действующих приложениях (непрерывной интеграции и доставки).
3. Образы и контейнеры
Представим ситуацию: вы скачиваете с GitHub некое приложение, написанное на Python. Чтобы оно заработало на вашем компьютере, необходимо дополнительно загрузить требуемую версию интерпретатора языка, а также все зависимости. Далее следует активировать виртуальную среду, и лишь после этого мы получим возможность запустить скрипт.
Эти операции потребуется проделывать для каждой новой машины и проекта, в которых вы захотите использовать скачанный код. Docker предоставляет другой способ:
- При помощи документа Dockerfile описываются все зависимости и установки проекта;
- Далее создается образ (копия программы и необходимое для ее работы окружение);
- Docker из своего репозитория доустанавливает нужные приложения;
- Мы получаем возможность запускать контейнеры на основании созданного образа на любом компьютере, не задумываясь о среде и зависимостях.
Итак, фундаментальные понятия, с которыми нужно «подружиться» – образы (Images) и контейнеры (Containers).
“
Контейнер – отдельная активная единица некоего приложения (мы с ней работаем, используем ее функционал). Контейнер создается на основе образа.
“
Образ – шаблон, чертеж контейнера (на основе образов может создаваться любое количество контейнеров). Здесь содержится код и все необходимые настройки и дополнения.
Наглядность связи между этими категориями представлена на рисунке:
Docker: images and containers
Важно
В рамках данной статьи мы взаимодействуем с Docker на базе ОС Windows, однако обратите внимание, что используемые команды будут работать во всех системах.
Начнем работу с Docker (на Windows должно быть запущено приложение Docker Desktop). Для этого нам потребуется образ. Они бывают следующими:
- Официальные образы из Docker Hub (здесь можно найти «шаблоны» под любые цели: Python, NodeJS, PostgreSQL, Ubuntu и др.);
- Образы, размещенные другими программистами или командами, к которым мы имеем доступ (также размещаются на Docker Hub в большинстве случаев);
- Наши собственные образы, которые мы создавали ранее.
Скачаем первый образ из официального репозитория. Воспользуемся последней версией Python. Для этого нам понадобятся 2 команды: pull и run (применять их будем в терминале):
- pull – скачивает образ;
- run – скачивает образ и запускает его.
Команды: docker pull, docker run
> docker run python
Unable to find image 'python:latest' locally
latest: Pulling from library/python
d960726af2be: Pulling fs layer
e8d62473a22d: Pull complete
В консоли выведется сообщение о том, что требуемого образа на нашем ПК нет и начнется его скачивание с Docker Hub. После скачивания создается контейнер, который сразу же закроется, так как он не выполняет никакую команду. Такое поведение характерно для большинства контейнеров.
Проверить список имеющихся на компьютере контейнеров можно командой ps -a, а чтобы просмотреть только запущенные, убираем флаг a.
> docker ps
(результатов не увидим, так как нет запущенных контейнеров)
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5e0356b58ac9 python "python3" 15 minutes ago Exited (0) 15 minutes ago unruffled_moser
Как видно, 15 минут назад запустили контейнер Python с автоматическим присвоением имени unruffled_moser, который сразу же был остановлен, так как не выполнял никаких действий.
В данном случае такое поведение контейнера нам не очень интересно. Запустим образ в интерактивном режиме, чтобы поработать с консолью Python.
> docker run -it python
Python 3.9.5 (default, May 10 2021, 15:26:36)
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.name
'posix'
>>> os.listdir()
['tmp', 'bin', 'root', 'run', 'opt', 'media', 'etc', 'sys', 'boot', 'proc', 'sbin', 'mnt', 'lib64', 'var', 'usr', 'lib', 'dev', 'srv', 'home', '.dockerenv']
>>> exit()
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82984f732585 python "python3" 3 minutes ago Exited (0) 14 seconds ago frosty_meitner
5e0356b58ac9 python "python3" 31 minutes ago Exited (0) 31 minutes ago unruffled_moser
В примере мы активировали контейнер Python и поработали в нем. После остановки на компьютере образовалось уже 2 контейнера. При последующих взаимодействиях с шаблоном в памяти будут накапливаться старые контейнеры.
Избежать такого поведения можно тремя способами:
- Перезапускать ранее активированный контейнер (доступ к нему получаем по ID или имени);
- Удалять ненужные контейнеры (через команду rm);
- Запускать контейнер в режиме автоматического стирания после работы с ним (флаг —rm)
Удалим ранее созданный контейнер с именем «unruffled_moser»
> docker rm unruffled_moser
unruffled_moser
Запустим заново контейнер с идентификатором «82984f732585»
> docker start 82984f732585
82984f732585
Активируем новый контейнер с автоматическим удалением после завершения работы с ним (он запустится под случайным именем и сразу же удалится, так как ничего не делает).
В некоторых ситуациях возможно накопление большого числа неиспользуемых контейнеров, удалять которые поодиночке не очень удобно. В таких случаях мы может стереть их сразу все.
> docker rm -f $(docker ps -aq)
82984f732585
5e0356b58ac9
> docker ps -a
(В списке не окажется ни одного контейнера)
Флаг -f удалит в том числе и запущенные контейнеры, а команда ps -aq выведет все идентификаторы. Другими словами, мы получили перечень ID всех контейнеров и удалили их.
Docker позволяет получить список имеющихся образов, а также удалить ненужные. Установим для начала alpine (минималистичная версия Linux), а потом удалим ее.
> docker pull alpine
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest a6a0779c5fb2 44 hours ago 886MB
alpine latest 6dbb9cc54074 4 weeks ago 5.61MB
> docker rmi alpine
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
python latest a6a0779c5fb2 44 hours ago 886MB
После совершения всех операций на ПК остался только образ Python.
Еще одна полезная команда – запуск контейнера под нужным именем.
Задаем имя контейнеру
> docker run --name my_py python
Перезапускаем контейнер с именем «my_py»
> docker start my_py
Удостоверяемся, что все сработало
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
114fd2a873d9 python "python3" 10 seconds ago Exited (0) 7 seconds ago my_py
Читайте также
4. Создание собственных образов. Проброс портов.
Не под все наши задачи существуют образы. Более того, создание собственных приложений и их последующая докеризация — довольно частая практическая ситуация.
На примере несложного проекта на Node.js рассмотрим формирование личного образа и его запуск (знать Node.js не обязательно).
Разработанный сайт делает простую операцию: отражает текущую цель пользователя. При желании, ее можно поменять. Структура проекта такова:
--- main.js
--- package.json
--- css
|---- style.css
const express = require('express');
const bodyParser = require('body-parser');
const spa = express();
let myGoal = 'Learn Docker!';
spa.use(
bodyParser.urlencoded({
extended: false,
})
);
spa.use(express.static('css'));
spa.get('/', (req, res) => {
res.send(`
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="style.css">
<title>Моя цель</title>
</head>
<body>
<section>
<h2>Моя главная цель</h2>
<h3>${myGoal}</h3>
</section>
<form action="/save-goal" method="POST">
<div class="form">
<label>Определить новую цель</label>
<input type="text" name="goal">
</div>
<button>Подтвердить</button>
</form>
</body>
</html>
`);
});
spa.post('/save-goal', (req, res) => {
const newGoal = req.body.goal;
myGoal = newGoal;
res.redirect('/');
});
spa.listen(80);
{
"name": "site-js",
"version": "1.1.1",
"description": "Первый проект на Node и Docker",
"main": "main.js",
"author": "Your Name",
"license": "X11",
"dependencies": {
"express": "^4.17.1",
"body-parser": "1.19.0"
}
}
html {
font-family: cursive;
}
body {
margin: 0;
}
section,
form {
padding: 1rem;
border-radius: 14px;
box-shadow: 0 3px 6px rgba(165, 73, 73, 0.26);
margin: 2rem auto;
max-width: 35rem;
}
.form {
margin: 0.4rem 0;
}
input {
font: inherit;
}
input,
label {
display: block;
}
label {
font-weight: bold;
margin-bottom: 0.5rem;
}
button {
background-color: #421070;
border: 1px solid #0d0316;
color: white;
cursor: pointer;
padding: 0.6rem 1.4rem;
}
button:hover,
button:active {
background-color: #8b2399;
border-color: #1c0542;
}
Если у вас не установлен пакет Node.js, то, естественно, сайт не запустится. Исправим ситуацию с помощью Docker. Для формирования собственного образа в папке проекта нужно создать файл Dockerfile без расширения. В него внесем следующую информацию:
FROM node: 16-alpine
WORKDIR /site
COPY package.json /site
RUN npm install
COPY . /site
EXPOSE 80
CMD ["node", "main.js"]
Рассмотрим приведенные инструкции:
Теперь можно создать собственный образ с проектом (сразу зададим ему имя goal-site).
> docker build . -t goal-site
[+] Building 39.1s (11/11) FINISHED
> docker images
goal-site latest 04876a934435 5 minutes ago 131MB
Итак, мы успешно создали образ. Точка после команды build обозначает текущий каталог (следовательно, берем Dockerfile из этой папки). Если попробовать запустить контейнер, то консоль перейдет в режим ожидания (мы ничего в ней больше не сможем сделать), а при наборе в браузере адреса localhost страница не отобразится (хоть он по умолчанию и прослушивает порт 80).
Решим обе эти проблемы:
- Чтобы процесс не занимал консоль его удобно запускать в несвязанном режиме (detached, с помощью флага -d);
- Для доступа к порту 80 внутри контейнера нужно указать, с какого конкретно порта на нашей машине мы будем туда заходить.
> docker run -d -p 5115:80 goal-site
Теперь открываем браузер, вводим адрес localhost:5115 и наслаждаемся рабочим приложением.
Остался лишь один вопрос: как закрыть запущенный контейнер? Требуется применить команду stop и указать его имя или идентификатор.
Выводим список запущенных контейнеров
> docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
82b299f23831 goal-site "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:5115->80/tcp, :::5115->80/tcp confident_jang
Останавливаем по имени «confident_jang»
> docker stop confident_jang
confident_jang
Теперь сервер не доступен (что можно проверить в браузере).
Таким образом, Docker стандартизирует среду разработки и позволяет запускать приложения в едином окружении на любом компьютере. На основании образов (как готовых, так и личных) можно активировать требуемое количество контейнеров. И для этого не нужно думать ни о типе операционной системы, ни о зависимостях.
