Извлечение существующего образа Docker и его локальное развертывание

Завершено

Docker — это технология, которая позволяет легко и быстро развертывать приложения и службы. Приложение Docker выполняется с использованием образа Docker. Образ Docker — это предварительно упакованная среда, содержащая код приложения и среду, в которой он выполняется.

В корпоративном сценарии, описанном ранее, необходимо изучить возможность упаковки и запуска приложения с помощью Docker. Вы решаете создать и развернуть образ Docker с запущенным тестовым веб-приложением.

В этом уроке вы узнаете об основных концепциях и процессах, связанных с выполнением контейнерного приложения, хранящегося в образе Docker.

Общие сведения о Docker

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

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

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

Внимание

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

При разработке и тестировании в локальной среде можно запустить Docker на настольном ПК или ноутбуке. В рабочих системах Docker доступен для серверных сред, включая множество вариантов Linux и Microsoft Windows Server 2016. Многие поставщики также поддерживают Docker в облаке. Например, вы можете хранить образы Docker в реестре контейнеров Azure и запускать контейнеры с помощью экземпляров контейнеров Azure.

В этом модуле Docker будет использоваться локально для сборки и запуска образа. Затем вы отправите образ в Реестр контейнеров Azure и запустите его в экземпляре контейнера Azure. Эта версия Docker подходит для локальной разработки и тестирования образов Docker.

Образы Docker для Linux и Windows

Docker изначально был разработан для Linux и с тех пор расширен для поддержки Windows. Отдельные образы Docker основаны либо на Windows, либо на Linux, но не могут поддерживать обе этих системы одновременно. Операционная система образа определяет, какой тип операционной системы используется внутри контейнера.

Авторы образов Docker, желающие предоставить аналогичную функциональность в образах как для Linux, так и для Windows, могут создать отдельные образы. Например, корпорация Майкрософт предлагает образы Docker и Windows, содержащие ASP.NET базовую среду, которые можно использовать в качестве основы для контейнерных приложений ASP.NET Core.

Компьютеры Linux с установленным Docker позволяют запускать только контейнеры Linux. Компьютеры Windows с установленным Docker позволяют запускать оба вида контейнеров. Windows работает как с помощью виртуальной машины для запуска системы Linux, так и использует виртуальную систему Linux для запуска контейнеров Linux.

В этом модуле вы создадите и запустите образ на базе Linux.

Реестры Docker и Docker Hub

Образы Docker хранятся и предоставляются в виде реестров. Реестр — это веб-служба, к которой Docker может подключаться, чтобы отправлять и скачивать образы контейнеров. Наиболее известным реестром является Docker Hub, который является общедоступным. Многие пользователи и организации публикуют образы в Docker Hub, и вы можете скачать и запустить их с помощью Docker, запустив его на настольном компьютере, сервере или в облаке. Вы можете создать учетную запись Docker Hub и бесплатно отправить в нее свои образы.

Реестр упорядочивается в виде набора репозиториев. Каждый репозиторий содержит несколько образов Docker, использующих общее имя, кроме того, они обычно обладают одинаковым назначением и одинаковой функциональностью. Эти изображения обычно имеют разные версии, идентифицируемые с тегом. Этот механизм позволяет публиковать и хранить несколько версий образов по соображениям совместимости. При скачивании и запуске образа нужно указать для него реестр, репозиторий и тег версии. Теги — это текстовые метки, и вы можете использовать собственную систему нумерации версий (v1.0, v1.1, v1.2, v2.0 и т. д.).

Предположим, вы хотите использовать образ Docker среды выполнения ASP.NET Core. Этот образ доступен в двух версиях:

  • 8.0 (долгосрочная поддержка): mcr.microsoft.com/dotnet/aspnet:8.0
  • 6.0 (долгосрочная поддержка): mcr.microsoft.com/dotnet/aspnet:6.0

Теперь предположим, что вы хотите использовать образцы .NET Core для образов Docker. Вот у нас есть четыре версии, из которых можно выбрать:

  • mcr.microsoft.com/dotnet/samples:dotnetapp
  • mcr.microsoft.com/dotnet/samples:dotnetapp-chiseled
  • mcr.microsoft.com/dotnet/samples:aspnetapp
  • mcr.microsoft.com/dotnet/samples:aspnetapp-chiseled

Примечание.

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

Репозиторий также является средством обеспечения конфиденциальности образа. Если вы не хотите предоставлять образ для общего доступа, можете сделать репозиторий закрытым. Вы можете предоставить доступ другим пользователям, совместно с которыми хотите использовать образ.

Просмотр Docker Hub и извлечение образа

Примечание.

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

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

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

Снимок экрана: страница поиска Docker Hub, в которой перечислены разные образы контейнеров.

Для извлечения образа используется команда docker pull с его именем. По умолчанию Docker загружает образ, помеченный latest, из этого репозитория в Docker Hub, если указать только имя репозитория. Помните, что можно изменить команду, чтобы извлечь другие теги и из разных репозиториев. В этом примере извлекается изображение с тегом aspnetapp из репозитория mcr.microsoft.com/dotnet/samples:aspnetapp . Этот образ содержит простое веб-приложение ASP.NET Core.

Примечание.

Примеры в этом уроке призваны продемонстрировать синтаксис различных команд Docker. Вам не нужно выполнять эти команды при изучении данного урока. Приведенные после урока упражнения помогут вам научиться работать с Docker напрямую.

docker pull mcr.microsoft.com/dotnet/samples:aspnetapp

При извлечении образа Docker сохраняет его локально и делает доступным для выполняемых контейнеров. Вы можете просмотреть образы в локальном реестре с помощью команды docker image list.

docker image list

Выходные данные выглядят так:

REPOSITORY TAG IMAGE ID CREATED SIZE
mcr.microsoft.com/dotnet/samples   aspnetapp           6e2737d83726        6 days ago          263MB

Идентификатор имени образа можно использовать для ссылки на изображение во многих других командах Docker.

Запуск контейнера Docker

Используйте команду docker run, чтобы запустить контейнер. Укажите образ, который нужно выполнить, по его имени или идентификатору. Если вы еще не выполнили процедуру docker pull для образа, Docker сделает это за вас.

docker run mcr.microsoft.com/dotnet/samples:aspnetapp

В этом примере команда отвечает на следующее сообщение:

warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
 No XML encryptor configured. Key {d8e1e1ea-126a-4383-add9-d9ab0b56520d} may be persisted to storage in unencrypted form.
Hosting environment: Production
Content root path: /app
Now listening on: http://[::]:80
Application started. Press Ctrl+C to shut down.

Этот образ содержит веб-приложение, поэтому теперь он прослушивает поступление запросов через HTTP-порт 80. Однако если открыть веб-браузер и перейти по адресу http://localhost:80, вы не увидите приложение.

По умолчанию Docker не позволяет входящим сетевым запросам достигнуть контейнера. Нужно указать Docker назначить определенный номер порта на вашем компьютере определенному номеру порта в контейнере, добавив параметр -p в docker run. Эта инструкция включает сетевые запросы к контейнеру по указанному порту.

Кроме того, веб-приложение в этом образе не предназначено для интерактивного использования из командной строки. Нам нужно, чтобы Docker запустил его в фоновом режиме и позволил ему выполняться. Используйте флаг -d, чтобы указать Docker запустить веб-приложение в фоновом режиме.

Нажмите клавиши CTRL+C , чтобы остановить изображение, а затем перезапустите его, как показано в следующем примере:

docker run -p 8080:80 -d mcr.microsoft.com/dotnet/samples:aspnetapp

Эта команда сопоставляет порт 80 в контейнере с портом 8080 на вашем компьютере. Если вы откроете страницу http://localhost:8080 в браузере, то увидите пример веб-приложения.

Снимок экрана: пример веб-приложения, запущенного в браузере.

Контейнеры и файлы

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

В контейнер можно добавить тома, доступные для записи. Том представляет файловую систему, которую контейнер может подключить, и предоставляется приложению, работающему в контейнере. Данные в томе сохраняются после остановки контейнера, и несколько контейнеров могут совместно использовать один том. Подробные сведения о создании и использовании томов выходят за рамки этого модуля.

Рекомендуется избегать внесения изменений в файловую систему образа для приложений, развернутых с помощью Docker. Используйте его только для временных файлов, которые можно потерять без серьезных последствий.

Управление контейнерами Docker

Вы можете можно просмотреть активные контейнеры с помощью команды docker ps.

docker ps

Выходные данные включают состояние контейнера — up, если он запущен, exited, если он завершен, среди других значений, таких как флаги командной строки, указанные при запуске образа, и дополнительные сведения. Docker позволяет одновременно запускать несколько контейнеров из одного образа, поэтому каждому из них назначается уникальный идентификатор, а также уникальное понятное имя. Большинство команд Docker, используемых для управления отдельными контейнерами, позволяет указать идентификатор или имя для ссылки на конкретный контейнер.

В следующих выходных данных можно увидеть два контейнера. Поле PORTS показывает, что контейнер с идентификатором elegant_ramanujan представляет собой образ, выполняющийся через порт 80 на узле Docker, сопоставленный с портом 8080 на вашем компьютере. Экземпляр youthful_heisenberg — это контейнер для предыдущего запуска образа. Поле COMMAND содержит команду, которую выполнил контейнер для запуска приложения в образе. В данном случае для обоих контейнеров это dotnet aspnetapp.dll. Идентификатор образа для контейнеров также совпадает, так как оба контейнера выполняют один и тот же образ.

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   42 seconds ago      Up 41 seconds       0.0.0.0:8080->80/tcp   elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   5 minutes ago      Up 5 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Примечание.

docker ps является ярлыком для docker container ls. Имена этих команд основаны на служебных программах Linux ps и ls, которые выдают список запущенных процессов и файлов, соответственно.

Можно остановить активный контейнер с docker stop помощью команды, указав идентификатор контейнера.

docker stop elegant_ramanujan

При повторном запуске docker ps вы увидите, что контейнера elegant_ramanujan больше нет в выходных данных. Контейнер по-прежнему существует, но он больше не размещает выполняющийся процесс. Остановленные контейнеры можно включить в выходные данные docker ps, указав флаг -a:

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57b9587583e3        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   2 minutes ago       Exited (0) 21 seconds ago                       elegant_ramanujan
d27071f3ca27        mcr.microsoft.com/dotnet/core/samples:aspnetapp   "dotnet aspnetapp.dll"   7 minutes ago      Up 7 minutes       0.0.0.0:8081->80/tcp   youthful_heisenberg

Вы можете перезапустить остановленный контейнер с помощью команды docker start. Основной процесс контейнера запускается заново.

docker start elegant_ramanujan

Как правило, после остановки контейнера его также следует удалить. Это приводит к очистке всех оставшихся в нем ресурсов. После удаления контейнера все изменения, внесенные в его файловую систему образа, утрачиваются без возможности восстановления.

docker rm elegant_ramanujan

Вы не можете удалить контейнер, который выполняется, но вы можете принудительно остановить и удалить контейнер с флагом -f в команде docker rm . Этот способ позволяет быстро остановить и удалить контейнер, но его следует использовать, только если для приложения внутри контейнера не требуется нормальное завершение работы.

docker container rm -f elegant_ramanujan

Удаление образов Docker

Вы можете удалить образ с локального компьютера с помощью команды docker image rm. Укажите идентификатор образа, который требуется удалить. Следующий пример удаляет образ для примера веб-приложения.

docker image rm mcr.microsoft.com/dotnet/core/samples:aspnetapp

Контейнеры, где выполняется образ, следует завершить перед его удалением. Если образ по-прежнему используется контейнером, вы получите примерно такое сообщение об ошибке. В этом примере ошибка возникает, так как контейнер youthful_heisenberg по-прежнему использует образ.

Error response from daemon: conflict: unable to delete 575d85b4a69b (cannot be forced) - image is being used by running container c13165988cfe