- Установка Docker на Windows
- Что нужно знать перед установкой Docker на Windows?
- Установка Docker на Windows 10
- Еще один способ установки и использования Docker в Windows 10
- Установка WSL 2
- Установка Docker
- Запуск контейнеров
- Отладка .NET приложения запущенного в контейнере
- Что такое Docker, и как его использовать? Подробно рассказываем
- Что такое Docker?
- В чем отличие от виртуализации?
- Какие очевидные плюсы?
- Поддерживаемые платформы
- Установка
- Терминология
- Пример 1: Hello World
- ps показывает нам, что у нас есть два контейнера:
- Пример 2: Nginx
- Пример 3: запись Dockerfile
- Создание образа
- Рекомендации по созданию образов
- Соединение между контейнерами
- Пример 4: Python + Redis
- В заключение
Установка Docker на Windows
Обновл. 13 Апр 2021 |
Docker Desktop для Windows — это нативное Windows-приложение, которое предоставляет среду для сборки и запуска контейнеризированных приложений. В его основе лежат нативная Hyper-V виртуализация и сеть, что является наиболее быстрым и стабильным вариантом для работы с Docker в Windows. Docker Desktop для Windows поддерживает как Windows-, так и Linux-контейнеры.
Что нужно знать перед установкой Docker на Windows?
Нам потребуется операционная система Windows 10 версии Корпоративная, Профессиональная или Образовательная. Также должны быть подключены компоненты Hyper-V и Windows Containers. Для работы с этими компонентами система должна выполнять следующие требования:
64-разрядный процессор с поддержкой преобразования адресов второго уровня (сокр. «SLAT» от англ. «Second Level Address Translation»).
Не менее 4 ГБ оперативной памяти.
Поддержка аппаратной виртуализации на уровне BIOS.
Есть два способа проверить, включена ли у вас виртуализация на уровне BIOS.
Способ №1: Посмотреть в «Диспетчер задач» > «Производительность» в поле «Виртуализация» должно быть значение «Включено» :
Способ №2: Воспользоваться утилитой systeminfo . Для этого нужно открыть приложение Windows Powershell или Командную строку с правами администратора ( Win+R ) и запустить команду systeminfo . Нас интересует последний пункт — «Требования Hyper-V» , где значением каждого подпункта должно быть «Да» :
Наличие технологии Microsoft Hyper-V является обязательным условием для установки Docker в Windows. Инсталлятор Docker для Windows предложит вам включить нужные компоненты и перезагрузить вашу машину.
Примечание: Если у вас на компьютере было установлено бесплатное ПО виртуализации VirtualBox, то после включения компонента Hyper-V VirtualBox перестанет работать, при этом все образы ваших виртуальных машин будут сохранены.
Docker для Windows включает в себя следующие компоненты:
Docker CLI клиент
Контейнеры и образы, созданные с помощью Docker Desktop для Windows, доступны всем пользователям машины, на которую он установлен, так как все пользователи используют одну и ту же виртуальную машину для сборки и запуска контейнеров.
Установка Docker на Windows 10
Существует два варианта установки Docker на Windows:
Приложение «Docker Toolbox for Windows».
Приложение «Docker for Windows».
Примечание: Обратите внимание, что «Docker Toolbox for Windows» является устаревшим решением, которым вы можете воспользоваться, если ваш компьютер не удовлетворяет требованиям установки «Docker for Windows». Более детально об установке Docker Toolbox вы можете прочитать здесь.
На этом уроке мы установим Docker через приложение «Docker for Windows», так как это решение является наиболее стабильным и надежным. Итак, сначала нам нужно скачать установщик.
Далее запускаем инсталлятор Docker Desktop Installer.exe . Следуйте инструкциям мастера установки, дайте установщику разрешение на использование прав администратора и дождитесь окончания установки.
Примечание: Приложению Docker права администратора нужны для того, чтобы установить сетевые компоненты, создать ссылки на само приложение и дать возможность Hyper-V управлять виртуальными машинами.
Чтобы запустить Docker Desktop, воспользуйтесь поиском в Windows:
Индикатором запуска Docker является иконка «кита», появившаяся в системном трее:
Если иконка «кита» скрыта в системном трее, то нажмите на стрелочку вверх, чтобы посмотреть все иконки. После установки Docker Desktop вы также получите всплывающее уведомление о том, что Docker установлен и готов к работе:
После того, как инициализация закончена, нажмите на иконку «кита» в системном трее и выберите пункт «About Docker Desktop» , чтобы проверить, что вы используете последнюю версию Docker.
Поздравляю! Вы успешно установили Docker Desktop на Windows.
Поделиться в социальных сетях:
Еще один способ установки и использования Docker в Windows 10
В этой статье мы подготовим окружение для запуска контейнеров в Windows 10 и создадим простое контейнеризированное .NET приложение
Чтобы все описанные ниже действия были успешно выполнены, потребуется 64-разрядная система с версией не меньше 2004 и сборкой не меньше 18362. Проверим версию и номер сборки, выполнив в PowerShell команду winver
Если версия ниже требуемой, то необходимо произвести обновление и только после этого идти дальше
Установка WSL 2
Сначала включим компонент Windows Subsystem for Linux (WSL). Для этого запустим PowerShell с правами администратора и выполним первую команду
Выполним следующую команду
Чтобы завершить установку, перезагрузим компьютер shutdown -r -t 1
Выберем WSL 2 по умолчанию для новых дистрибутивов Linux wsl —set-default-version 2
Для целей этой статьи это необязательно, но установим дистрибутив Linux через Microsoft Store, например, Ubuntu 20.04 LTS
При первом запуске установленного дистрибутива введем имя пользователя и пароль
Чтобы увидеть запущенные дистрибутивы Linux, выполним в PowerShell команду wsl —list —verbose
Чтобы завершить работу дистрибутива Linux, выполним команду wsl —terminate Ubuntu-20.04
Файловая система запущенного дистрибутива Linux будет смонтирована по этому пути \\wsl$
Установка Docker
Скачаем Docker Desktop для Windows и установим, следуя простым инструкциям
После установки запустим приложение Docker Desktop и установим интеграцию Docker с дистрибутивом Linux (WSL 2)
Теперь отправлять команды Docker можно как через PowerShell, так и через Bash. Выполним команду docker version
Запуск контейнеров
Чтобы убедиться, что Docker правильно установлен и работает должным образом, запустим простой контейнер busybox, который всего лишь выведет в консоль переданное сообщение и завершит свое выполнение
Хорошо. Давайте сделаем что-то более интересное. Например, запустим контейнер rabbitmq
Разберем выполненную команду:
docker run — запускает контейнер из образа. Если данный образ отсутствует локально, то предварительно он будет загружен из репозитория Docker Hub
—name rabbit1 — присваивает запускаемому контейнеру имя rabbit1
-p 8080:15672 — пробрасывает порт с хоста в контейнер. 8080 — порт на хосте, 15672 — порт в контейнере
rabbitmq:3.8.9-management — имя образа и его тег/версия, разделенные двоеточием
Теперь мы можем извне контейнера взаимодействовать с сервером RabbitMQ через порт 5672 и получить доступ к управлению из браузера через порт 8080
Посмотреть статус контейнеров, в том числе остановленных, можно с помощью команд docker container ls —all или docker ps -a
Чтобы остановить наш контейнер: docker stop rabbit1 . Запустить вновь: docker start rabbit1
Отладка .NET приложения запущенного в контейнере
Для нашего примера нам понадобится отдельная сеть, т.к. мы запустим целых два контейнера, которые будут взаимодействовать между собой. На самом деле все запускаемые контейнеры по умолчанию попадают в уже существующую сеть с именем bridge, но т.к. в своей сети мы без лишних проблем сможешь обращаться из одного контейнера к другому прямо по имени, создадим сеть с названием mynet типа bridge
Далее запустим redis и подключим его к ранее созданной сети. Благодаря параметру -d процесс в контейнере будет запущен в фоновом режиме
Далее с помощью Visual Studio 2019 создадим новый проект ASP.NET Core Web API, который будет использован для демонстрации отладки
Добавим для взаимодействия с Redis пакет StackExchange.Redis через Package Manager Console
Мы не будем акцентироваться на правильности и красоте дизайна, а быстро создадим рабочий пример
Добавим в проект файл RandomWeatherService.cs, где будет находится служба для выдачи не очень точного прогноза
Добавим файл RedisRepository.cs, где будет находится служба кеширования сформированных прогнозов
Зарегистрируем созданные службы в классе Startup
И наконец, изменим созданный автоматически единственный контроллер WeatherForecastController следующим образом
Помимо прочего в проект автоматически был добавлен файл Dockerfile с инструкциями для Docker. Оставим его без изменений
В результате получим следующую структуру проекта
Если по какой-то невероятной причине Вам понадобятся исходники, то они здесь
Запустим наше приложение в контейнере под отладкой
После того как контейнер будет запущен, также подключим его к сети mynet
После убедимся, что все необходимые контейнеры находятся в одной сети
Далее установим Breakpoint в единственном методе контроллера и пошлем запрос через Postman, или через любой браузер
Кстати, используемый порт в Вашем случае может отличаться и его можно посмотреть в окне Containers
Результат в окне Postman
Дополнительно убедимся, что значение зафиксировано в redis, подключившись с помощью консоли redis-cli
Что такое Docker, и как его использовать? Подробно рассказываем
Разберем по косточкам, ведь Docker – это мощный инструмент, и огромное количество информации по работе с ним вряд ли уместится в брошюрку.
Что такое Docker?
Это ПО с открытым кодом, принцип работы которого проще всего сравнить с транспортными контейнерами. Только подумайте, ведь когда-то транспортные компании сталкивались с похожими проблемами:
- Как перевозить разные (несовместимые) типы товаров вместе (например, продукты питания с химикатами или стекло с кирпичом)?
- Как обрабатывать пакеты разных размеров одним и тем же транспортным средством?
С введением контейнеров стало возможным перевозить вместе кирпичи и стекло, химикаты и еду, а также многое другое. Груз разного размера может быть распределен по стандартизированным контейнерам, которые загружаются/выгружаются одним и тем же транспортным средством.
Но вернемся же к контейнерам. Когда вы разрабатываете приложение, вам нужно предоставить код вместе со всеми его составляющими, такими как библиотеки, сервер, базы данных и т. д. Вы можете оказаться в ситуации, когда приложение работает на вашем компьютере, но отказывается включаться на устройстве другого пользователя.
Эта проблема решается через создание независимости ПО от системы.
В чем отличие от виртуализации?
Изначально виртуализация была призвана избавить от подобных проблем, но в ней есть существенные недостатки:
- медленная загрузка;
- возможная плата за предоставление дополнительного пространства;
- не все виртуальные машины (VM) поддерживают совместимое использование;
- поддерживающие VM часто требуют сложной настройки;
- образ может быть слишком большим, так как «дополнительная ОС» добавляет гигабайт пространства в проект поверх операционной системы, а в большинстве случаев на сервер ставится несколько VM, которые занимают еще больше места.
Докер же просто разделяет ядро ОС на все контейнеры (Docker container), работающие как отдельные процессы. Это не единственная подобная платформа, но, бесспорно, одна из самых популярных и востребованных.
Какие очевидные плюсы?
К его преимуществам относятся:
- Ускоренный процесс разработки. Нет необходимости устанавливать вспомогательные инструменты вроде PostgreSQL, Redis, Elasticsearch: их можно запускать в контейнерах.
- Удобная инкапсуляция приложений.
- Понятный мониторинг.
- Простое масштабирование.
Поддерживаемые платформы
Докер работает не только на его родной ОС, Linux, но также поддерживается Windows и macOS. Единственное отличие от взаимодействия с Linux в том, что на macOS и Windows платформа инкапсулируется в крошечную виртуальную машину. На данный момент Докер для macOS и Windows достиг значительного уровня удобства в использовании.
Кроме того, существует множество дополнительных приложений, таких как Kitematic или Docker Machine, которые помогают устанавливать и использовать Докер на платформах, отличных от Linux.
Установка
Здесь можно посмотреть подробную инструкцию по установке. Если вы работаете с Докером на ОС Linux, вам нужно выполнить несколько несложных действий и повторно войти в систему:
Терминология
1. Контейнер – это исполняемый экземпляр, который инкапсулирует требуемое программное обеспечение. Он состоит из образов. Его можно легко удалить и снова создать за короткий промежуток времени.
2. Образ – базовый элемент каждого контейнера. В зависимости от образа, может потребоваться некоторое время для его создания.
3. Порт – это порт TCP/UDP в своем первоначальном значении. Чтобы все было просто, предположим, что порты могут быть открыты во внешнем мире или подключены к контейнерам (доступны только из этих контейнеров и невидимы для внешнего мира).
4. Том – описывается как общая папка. Тома инициализируются при создании контейнера и предназначены для сохранения данных, независимо от жизненного цикла контейнера.
5. Реестр – это сервер, на котором хранятся образы. Сравним его с GitHub: вы можете вытащить образ из реестра, чтобы развернуть его локально, и так же локально можете вносить в реестр созданные образы.
6. Docker Hub – публичный репозиторий с интерфейсом, предоставляемый Докер Inc. Он хранит множество образов. Ресурс является источником «официальных» образов, сделанных командой Докер или созданных в сотрудничестве с разработчиком ПО. Для официальных образов перечислены их потенциальные уязвимости. Эта информация открыта для любого зарегистрированного пользователя. Доступны как бесплатные, так и платные аккаунты.
Пример 1: Hello World
Пришло время запустить наш первый контейнер:
- docker run – это команда запуска контейнера.
- ubuntu – образ, который вы запускаете (например, образ операционной системы Ubuntu). Когда вы его указываете, Докер сначала анализирует элемент в разрезе хоста.
- /bin/echo ‘Hello world’ – команда, которая будет запускаться внутри нового контейнера. Данный контейнер просто выводит «Hello world» и останавливает выполнение.
Теперь попробуем создать интерактивную оболочку внутри контейнера:
- -t присваивает псевдо-tty или терминал внутри нового контейнера.
- -i позволяет создавать интерактивное соединение, захватывая стандартный вход (STDIN) контейнера.
- —rm требуется для автоматического удаления контейнера при выходе из процесса. По умолчанию контейнеры не удаляются.
Если вы хотите, чтобы контейнер работал после окончания сеанса, вам необходимо его «демонизировать»:
- —name daemon назначает имя новому контейнеру. Если вы его не укажете, имя сгенерируется и назначится автоматически.
- -d запускает контейнер в фоновом режиме («демонизирует» его).
Давайте посмотрим, какие контейнеры у нас есть на данный момент:
- docker ps – команда для перечисления контейнеров.
- -a показывает все контейнеры (без -a ps покажет только запущенные контейнеры).
ps показывает нам, что у нас есть два контейнера:
- gifted_nobel (имя для этого контейнера генерировалось автоматически) – первый контейнер, который мы создали с набранным «Hello world».
- daemon – третий контейнер, который мы создали и «демонизировали».
Примечание: второй контейнер (с интерактивной оболочкой) отсутствует, потому что мы устанавливаем параметр -rm, в результате чего этот контейнер автоматически удаляется после выполнения.
Давайте проверим журналы и посмотрим, что делает контейнер-демон прямо сейчас:
- docker logs получают журналы контейнера.
- -f следит за выходом журнала.
Теперь давайте остановим контейнер-демон:
Проверяем его остановку:
Контейнер остановлен. Давайте запустим его снова:
Убедимся, что он запущен:
Теперь остановим его и удалим все контейнеры вручную:
Чтобы удалить все контейнеры, мы можем использовать следующую команду:
- docker rm – команда удаления контейнера.
- -f (для rm) должен остановить контейнер, если он работает (принудительное удаление).
- -q (для ps) – это вывод только идентификаторов контейнера.
Пример 2: Nginx
Начиная с этого примера, вам понадобятся дополнительные файлы, которые вы можете найти в репозитории GitHub. Как вариант, загрузите образцы файлов по ссылке.
Пришло время создать и запустить более важный контейнер, такой как Nginx.
Измените каталог на examples/nginx:
- -p – отображение портов HOST PORT: CONTAINER PORT.
- -v отвечает за HOST DIRECTORY:CONTAINER DIRECTORY.
Теперь проверьте этот URL-адрес в своем веб-браузере.
Еще мы можем попробовать изменить /example/nginx/index.html (который добавляется в каталог /usr/share/nginx/html внутри контейнера) и обновить страницу.
Получим информацию о контейнере test-nginx:
Эта команда отображает системную информацию об установке Докер. Она включает версию ядра, количество контейнеров и образов, открытые порты и т. д.
Пример 3: запись Dockerfile
Чтобы создать образ, сперва вам нужно создать Dockerfile: это текстовый файл с инструкциями и аргументами. Краткое описание инструкций, которые мы собираемся использовать в примере:
- FROM – задать базовый образ
- RUN – выполнить команду в контейнере
- ENV – задать переменную среды
- WORKDIR – установить рабочий каталог
- VOLUME – создать точку монтирования для тома
- CMD – установить исполняемый файл для контейнера
Более подробная информация здесь.
Давайте создадим образ, который получит содержимое сайта и сохранит его в текстовом файле. Нам нужно передать URL-адрес через переменную SITE_URL. Результирующий файл будет помещен в каталог, установленный как том:
Dockerfile готов, пришло время создать образ.
Создание образа
Перейдите к examples/curl и выполните следующую команду:
- docker build создает новый образ локально.
- -t устанавливает в образе метку имени.
Теперь у нас есть новый образ, и мы можем его увидеть в списке существующих:
Мы можем создавать и запускать контейнер из образа. Давайте попробуем сделать это с параметрами по умолчанию:
Чтобы просмотреть результаты, сохраненные в файле:
Попробуем с facebook.com:
Чтобы просмотреть результаты, сохраненные в файле:
Рекомендации по созданию образов
- Избегайте установки ненужных пакетов – они будут потреблять дополнительное дисковое пространство.
- Используйте кэш.
- Будьте осторожны с объемами. Вы должны помнить, какие данные в томах. Поскольку тома являются постоянными и не «умирают» с контейнерами – следующий контейнер будет использовать данные из тома, которые были созданы предыдущим контейнером.
- Используйте переменные среды (в RUN, EXPOSE, VOLUME). Это сделает ваш Dockerfile более гибким.
Соединение между контейнерами
Docker compose — это единственный правильный способ подключения контейнеров друг к другу.
Пример 4: Python + Redis
В этом примере мы подключим контейнеры Python и Redis.
Перейдем к examples/compose и выполним команду:
Текущий пример увеличит счетчик просмотров в Redis. Откройте ссылку и убедитесь в этом.
Использование docker-compose – это тема для целого учебника. Чтобы начать работу, вы можете поиграться с некоторыми образами из Docker Hub, а если хотите создать свои собственные – следуйте рекомендациям, перечисленным выше. Единственное, что можно добавить с точки зрения использования docker-compose – всегда давайте явные имена вашим томам. Это простое правило избавит вас от проблемы в будущем.
В этом случае redis_data будет именем внутри файла docker-compose.yml.
Смотрим выполнение тома:
Без явного имени тома будет UUID. И вот пример:
В заключение
Докер стал одним из важнейших инструментов современного разработчика. Да, он имеет некоторые ограничения и требования в зависимости от архитектуры вашей системы, но немного усидчивости – и мир контейнеров обязательно будет приручен!