Докер на Windows? Начните учиться прямо сейчас Или…!

Если вы новичок в контейнерах и Docker и в основном работаете в Windows, вас ждет удивление. В этой статье вы узнаете, как настроить Docker в Windows 10 с использованием Docker Desktop для Windows или просто Docker Desktop, как в этой статье.

Docker Desktop представляет собой движок Docker и клиент управления, упакованные вместе для удобного использования в Windows 10. В этой статье вы установите Docker Desktop, развернете свой первый контейнер и будете обмениваться данными между хостом и контейнерами.

Предварительные требования для Docker в Windows

Это статья-инструкция, демонстрирующая различные шаги в Docker Desktop для Docker в Windows. Чтобы следовать за ней, убедитесь, что у вас есть несколько конкретных требований.

  • Интернет-соединение для загрузки данных размером более 800 МБ
  • Windows 10 64-разрядная версия Pro, Enterprise или Education с выпуском 1703 или новее. Это необходимо для запуска Hyper-V в Windows 10.
  • A CPU with SLAT (nested paging) compatibility. All AMD/Intel processors since approximately 2008 are SLAT compatible
  • Как минимум 4 ГБ оперативной памяти
  • BIOS-виртуализация оборудования иногда обозначается как Технология виртуализации или VTx. Она должна быть включена и отображаться как Включено на вкладке “Производительность” диспетчера задач, как показано ниже.
Enabled BIOS virtualization shown in Windows Task Manager

Загрузка и установка Docker Desktop

Сначала вам нужно скачать и установить Docker Desktop, чтобы начать использовать Docker в Windows. Docker Desktop доступен в двух версиях: стабильной и тестовой.

Стабильный выпуск выходит ежеквартально и гарантирует полностью протестированное приложение. В этой статье вы будете использовать стабильный выпуск.

Предупреждение: При установке Docker Desktop вас попросят установить гипервизор Hyper-V, если он еще не установлен. Таким образом, гипервизор Hyper-V предотвращает запуск гостевых виртуальных машин в режиме пользователя, таких как VirtualBox, VMWare и т. д. Поддержка Hyper-V для VirtualBox и VMWare ограничена, но будет добавлена.

Также у вас есть возможность загрузки Docker Desktop напрямую с Docker.com или через менеджер пакетов Windows, Chocolatey. Давайте кратко рассмотрим каждый метод.

С Docker.com

Чтобы загрузить Docker Desktop напрямую с docker.com, вы можете перейти на страницу продукта, зарегистрироваться и скачать его оттуда. Это предпочтительно, если вы собираетесь использовать Docker в производстве, зарегистрировав аккаунт.

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

После загрузки EXE-файла запустите его и следуйте подсказкам, принимая все значения по умолчанию.

Когда вас спросят, планируете ли вы использовать контейнеры Windows вместо контейнеров Linux, как показано ниже, необходимо не устанавливать флажок. В этой статье вы будете использовать контейнеры Linux.

Installing Docker Desktop

После завершения установки перезагрузите компьютер.

Выбор опции использования контейнеров Windows или контейнеров Linux указывает Docker’у присоединять образы к ядру Windows или ядру Linux. Вы можете изменить эту настройку в любое время после установки, щелкнув правой кнопкой мыши по значку Docker в области уведомлений и выбрав Переключиться на контейнеры Windows, как показано ниже.

Switching to Windows containers

Использование Chocolatey

Другой вариант загрузки и установки Docker Desktop – использовать Chocolatey. Chocolatey автоматизирует многие задачи по загрузке и установке для вас. Для этого откройте консоль командной строки (либо cmd, либо PowerShell) от имени администратора, чтобы загрузить и установить программу одной командой, запустив указанную ниже команду.

choco install docker-desktop

После завершения перезагрузите Windows 10.

Если вы хотите попробовать тестовый релиз в какой-то момент, вы можете загрузить и установить его, запустив choco install docker-desktop --pre.

Проверка установки Docker Desktop

После установки Docker Desktop автоматически запускается в качестве службы, предоставляя Docker в Windows. Он отображается в системном лотке при входе в Windows после перезагрузки. Но как убедиться, что он действительно работает?

Чтобы проверить, что Docker Desktop работает правильно, откройте консоль командной строки и выполните команду docker. Если установка прошла успешно, вы увидите справочник по командам Docker.

Наконец, заставьте Docker загрузить и запустить пример образа контейнера под названием hello-world, выполнив команду docker run hello-world. Если все в порядке, вы увидите вывод как ниже.

A successful test image run via Docker Desktop

Выполнение команд в контейнерах Docker

Docker Desktop установлен, и вы проверили, что все в порядке? Что дальше? Для начала работы с Docker в Windows одной из распространенных задач является выполнение команд в контейнере Docker. Через команду docker run вы можете отправлять команды через хост (ваш компьютер с Windows 10) непосредственно в запущенный контейнер.

Чтобы выполнить команды в контейнере с помощью docker run, сначала нужно указать имя образа, за которым следует команда. Чтобы начать, скажите Docker’у выполнить команду hostname внутри контейнера, называемого alpine, как показано ниже.

> docker run alpine hostname
b74ff46601af

Поскольку у вас сейчас нет образа Docker с именем alpine на вашем компьютере, Docker в Windows загрузит этот маленький образ из Docker Hub, запустит контейнер из этого образа, выполнит команду непосредственно в контейнере и затем закроет его.

Если вы хотите сохранить работающий контейнер, вы также можете использовать параметр -it. Этот параметр указывает Docker’у оставить контейнер в “интерактивном режиме”, оставляя его запущенным на переднем плане после выполнения команды. Затем вы увидите, что вам предлагается приглашение терминала, готовое к использованию.

> docker run -it alpine sh
/ #

Когда закончите работу в терминале, введите exit, чтобы вернуться в Windows 10.

Доступ к файлам из Docker Host в контейнерах

Другая обычная задача – доступ к файлам хоста из контейнеров. Чтобы получить доступ к файлам хоста в контейнерах, Docker в Windows позволяет связать путь к папке с вашего рабочего стола, чтобы поделиться этой папкой с вашим контейнером. Этот процесс называется binding.

Чтобы создать привязку, создайте папку на локальном диске. В этом примере я использую E:\ и называю ее input. Затем создается новый текстовый документ с именем file.txt в этой папке. Можете использовать любой путь и файл, который вам нравится.

Когда у вас есть папка, которую вы хотите обменивать между хостом и контейнером, Docker должен примонтировать папку, используя параметр --mount. Параметр --mount требует три аргумента: тип монтирования, путь к исходной директории хоста и путь к целевой директории. Целевой путь будет символической ссылкой внутри контейнера.

Ниже вы увидите пример монтирования всего E:\ в Windows 10 хосте, чтобы он отображался как /home/TEST внутри контейнера Linux.

> docker run --mount type=bind,source="E:/",target=/home/TEST -it alpine

Когда вы пытаетесь примонтировать папку хоста, Docker Desktop попросит разрешение на обмен этим диском с контейнерами Docker, как показано ниже.

Sharing a Docker drive

Если вы создали файл file.txt в папке Windows 10, как описано ранее, выполните cat /home/TEST/input/file.txt. Вы увидите, что содержимое отображается.

Теперь удалите папку input, которую вы только что создали, и снова выполните команду cat .... Заметьте, что оболочка теперь сообщает, что файл больше не существует.

Working with files in Docker containers

Отображение сетевых портов

Еще одно важное понятие, которое следует знать, – это то, как Docker в Windows обрабатывает сетевое взаимодействие. Для краткого введения давайте посмотрим, что нужно сделать, чтобы получить доступ к веб-сервису, работающему в контейнере, с локального хоста.

Сначала запустите демонстрационный образ, который будет запускать пример веб-страницы. Загрузите и запустите образ Docker с именем dockersamples/static-site. Для этого используйте docker container run.

Следующая команда выполняет четыре действия одновременно:

  • Загружает образ Docker из Docker Hub с именем static-site в «каталоге» docker-samples
  • Запускает экземпляр контейнера из образа static-site
  • Немедленно отсоединяет контейнер от переднего плана терминала (--detach)
  • Делает доступными сетевые порты запущенного контейнера для хоста Windows 10 (--publish-all)
docker container run --detach --publish-all dockersamples/static-site
## Альтернативный/краткий синтаксис, выполняющий то же самое:
## docker container run -d -P dockersamples/static-site
## docker run -d -P dockersamples/static-site

После выполнения Docker вернет идентификатор контейнера, который был запущен, как показано ниже.

Docker container ID returned from running a container

Публикация сетевых портов

С момента использования параметра --publish-all порты локального хоста теперь отображаются на сетевой стек контейнера. Вы можете использовать подкоманду docker ps, чтобы перечислить все запущенные контейнеры, включая порты, назначенные всем работающим контейнерам. В приведенном ниже примере один контейнер работает, отображая порт хоста 32777 на порт контейнера 80 и порт хоста 32776 на порт контейнера 443.

Showing port mapping of Docker container

Docker в Windows присваивает случайные порты контейнерам при использовании параметра --publish-all, если они явно не указаны.

Теперь откройте веб-браузер и перейдите по адресу http://localhost:32777 или порту, который Docker назначил для отображения порта 80, как указано в выводе docker ps. Если все прошло успешно, вы должны увидеть веб-страницу, приведенную ниже.

Resulting webpage running in the Docker container

Изменение опубликованных портов

Теперь у вас есть контейнер Docker, работающий в Docker в Windows, предоставляющий простую веб-страницу. Поздравляю! Но теперь вам нужно указать конкретное привязывание порта, не полагаясь на случайный выбор порта с параметром --publish-all. Нет проблем. Используйте параметр -p.

Сначала остановите работающий контейнер, указав уникальную строку его идентификатора контейнера. Вы можете найти этот идентификатор контейнера, выполнив docker ps. Как только вы узнали идентификатор контейнера, остановите контейнер и запустите новый, указав Docker назначить конкретный порт для публикации.

Синтаксис для указания порта выглядит так: <внешний порт>:<порт контейнера>. Для каждого порта, который вы хотите опубликовать, используйте переключатель --publish или -p с указанием номеров внешнего и контейнерного портов, как показано ниже.

> docker stop f766
> docker run --detach -p 1337:80 dockersamples/static-site

При указании идентификатора контейнера вам достаточно ввести достаточное количество символов, чтобы он был уникальным. Если вы запускаете только один контейнер и его идентификатор – f766f4ac8d66bf7, вы можете идентифицировать контейнер, введя любое количество символов, включая только f. Требование состоит в том, что то, что вы вводите, позволяет однозначно идентифицировать отдельный контейнер.

Теперь перейдите в веб-браузер и перейдите по адресу localhost:1337. Помните, что вы не изменяете образ, и он всегда слушает порт 80; вы изменяете правило перевода портов в конфигурации Docker, позволяющее вам подключаться к контейнеру.

Webpage being served up on port 1337

Остановка всех контейнеров

С помощью docker stop вы можете остановить контейнер, но как остановить несколько контейнеров одновременно? Один из способов сделать это – предоставить несколько идентификаторов контейнеров, разделенных пробелами. Ниже приведен пример остановки трех контейнеров с идентификаторами fd50b0a446e7, 36ee57c3b7da и 7c45664906ff.

> docker stop fd50 36ee 7c45

Если вы управляете контейнерами Docker в PowerShell, вы также можете использовать ярлык для остановки всех контейнеров. Передайте список идентификаторов контейнеров через docker ps -q параметру stop с помощью развертывания команд PowerShell docker stop (docker ps -q).

Подтвердите, что все контейнеры остановлены, убедившись, что при вводе docker ps нет перечисленных контейнеров.

Очистка

Вы загрузили несколько образов контейнеров и запустили некоторые контейнеры, которые теперь остановлены. Несмотря на то, что они остановлены, выделенное для них место на локальном диске хоста не освобождено. Чтобы освободить это место и избежать загромождения вашего рабочего пространства, вы должны удалить контейнеры.

Чтобы удалить один контейнер, используйте параметр удаления контейнера rm, как показано ниже.

> docker container rm <container ID>

Или, чтобы удалить все остановленные контейнеры, используйте параметр очистки prune, как показано ниже.

> docker container prune

Source:
https://adamtheautomator.com/docker-windows/