Как создать образ Docker для Windows с помощью метки Docker Build

Вы новичок в использовании образов Docker для Windows? Работаете ли вы в среде Windows и хотите узнать о сборке Docker для контейнерных образов? Вы попали по адресу. Лучший способ узнать что-то новое – это сделать это с помощью команд docker build и docker build "tag"!

В этой статье вы узнаете, как создать свой первый образ Docker для Windows из Dockerfile с помощью команды docker build.

Поехали!

Понимание образов контейнеров Docker

Долгие годы единственным способом тестирования или разработки на различных операционных системах (ОС) было иметь несколько выделенных физических или виртуальных машин с образом выбранной вами версии ОС. Этот метод требовал больше аппаратных средств и накладных расходов для создания новых машин для каждого программного обеспечения и спецификации ОС.

Однако в наши дни использование образов контейнеров Docker стало популярным частично из-за популярности микросервисной архитектуры. В ответ на рост популярности Docker, Microsoft начала публично поддерживать образы Docker для нескольких флагманских продуктов на своей странице Docker Hub. Они даже добавили поддержку образов для Windows как функцию продукта в Windows 10 и Windows Server 2016!

A Docker image is run on a container by using the Docker Engine. Docker images have many benefits such as portability (applicable to multiple environments and platforms), customizable, and highly scalable.  As you can see below, unlike traditional virtual machines, the Docker engine runs on a layer between the host OS kernel and the isolated application services that are being containerized.

Source: Docker

Понимание сборки Docker и образов

Команда docker build может использоваться для автоматизации создания образа контейнера, применения практики “контейнер как код” в DevOps и интеграции контейнеризации в цикл разработки ваших проектов. Файлы Dockerfile – это просто текстовые файлы, содержащие инструкции сборки, используемые Docker для создания нового образа контейнера, который основан на существующем образе.

Пользователь может указать базовый образ и список команд, которые должны быть выполнены при развертывании образа контейнера или при запуске в первый раз. В этой статье вы узнаете, как создать образ docker на базе Windows из Dockerfile с использованием контейнера Windows.

Этот процесс имеет несколько преимуществ по сравнению с использованием предварительно созданного образа контейнера:

  1. Вы можете перестроить образ контейнера для нескольких версий Windows, что отлично подходит для тестирования изменений кода на нескольких платформах.
  2. У вас будет больше контроля над тем, что установлено в контейнере. Это позволит вам минимизировать размер контейнера.
  3. По соображениям безопасности вы можете захотеть проверить контейнер на уязвимости и применить усиление безопасности к базовому образу

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

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

  • Установлен Docker для Windows. Я буду использовать Docker Community Edition (CE) версии 2.1.0.4 в моей среде.
  • Для загрузки образов Docker требуется доступ в Интернет
  • Операционная система Windows 10+ (в данном руководстве используется версия 1709)
  • Включенная вложенная виртуализация
  • 5 ГБ свободного места на жестком диске вашего компьютера
  • PowerShell 5.0+
  • В этом руководстве используется среда разработки Visual Studio Code. Однако вы можете использовать любую другую среду разработки по вашему выбору.

Примечание: Обязательно включите конфигурацию контейнеров Windows при установке Docker.

Подготовка

Сначала вам понадобится папка для хранения всех образов Docker и контейнеров, которые вы будете создавать на основе этих образов. Для этого откройте терминал PowerShell или cmd (в этой статье мы будем использовать PowerShell) и создайте новый каталог с именем C:\Containers.

После создания папки перейдите в нее. Это устанавливает текущий рабочий каталог консоли в C:\Containers для установки по умолчанию всех загрузок в этот каталог.

PS51> mkdir C:\Containers
PS51> cd C:\Containers

В этой статье вы получите первоначальный старт. Большинство файлов для работы над этим проектом уже доступны. После создания папки выполните Git pull, чтобы скопировать необходимые файлы для этой статьи из репозитория TechSnips Github в папку C:\Containers. После завершения проверьте, чтобы папка C:\Containers выглядела так, как указано ниже.

Tutorial files

Загрузка образа IIS Windows Docker

Первая задача – загрузить “шаблон” или базовый образ. Позже вы создадите свой собственный образ Docker, но сначала вам нужен образ для начала работы. Вы будете загружать последние образы IIS и Windows Server Core, необходимые для этого учебного пособия. Обновленный список образов можно найти на странице официального репозитория образов Microsoft Docker.

Обзор текущих базовых образов Docker

Перед тем как загрузить образ из репозитория образов, давайте сначала рассмотрим текущие базовые образы Docker, которые у вас уже есть в локальной системе. Для этого запустите консоль PowerShell от имени администратора и введите docker images. Эта команда вернет все образы на вашей локальной системе.

Как видно ниже, изначально доступные образы отсутствуют.

PS51> docker images
Docker Build Tag : Listing available Docker images

Загрузка базового образа

Теперь пришло время скачать базовый образ IIS с Docker Hub. Для этого выполните команду docker pull, как показано ниже. Этот процесс может занять некоторое время в зависимости от скорости вашего интернет-соединения.

PS51> docker pull mcr.microsoft.com/windows/servercore/iis
Downloading an image from the Docker Hub

Теперь выполните команду docker images, и у вас должен быть доступен самый последний образ Microsoft Windows Core IIS для этого руководства.

PS51> docker images
Viewing available Docker images

Инспекция Dockerfile

На предыдущем этапе вы скачали существующий Dockerfile для этого руководства. Давайте теперь рассмотрим, что именно это включает в себя.

Откройте файл C:\Containers\Container1\Dockerfile в вашем любимом редакторе. Содержимое этого Dockerfile используется для определения конфигурации образа контейнера на этапе сборки.

Вы можете увидеть объяснение того, что делает каждый фрагмент этого файла, встроенное в комментариях.

# Указывает, что будет использоваться последнее изображение microsoft/iis в качестве базового изображения
# Используется для указания базового контейнерного изображения, которое будет использоваться в процессе сборки.

# Обратите внимание, что соглашение о наименовании выглядит так: "**владелец/имя приложения: имя тега**"
# (показано как microsoft/iis:latest); таким образом, в нашем случае владельцем изображения является
# Microsoft, а приложением является IIS с использованием имени тега "latest"
# для указания того, что будет извлечена самая последняя доступная версия изображения.
FROM microsoft/iis:latest

# Копирует содержимое папки wwwroot в папку inetpub/wwwroot нового контейнерного изображения
# Используется для указания того, что вы хотите скопировать папку WWWroot в IIS inetpub WWWroot
# папка в контейнере. Вам не нужно указывать полный путь к вашим локальным
# файлам, потому что в docker уже встроена логика для ссылки на файлы и папки
# относительно расположения файла docker на вашей системе. Также обратите внимание, что
# docker будет распознавать только косые черты для путей к файлам - поскольку это
# контейнер на основе Windows, а не Linux.
COPY wwwroot c:/inetpub/wwwroot

# Запускает некоторые команды PowerShell внутри нового контейнера для настройки изображения

# Запустите команды PowerShell для удаления файлов IIS по умолчанию и создания нового
# пула приложений с именем TestPool
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.htm -force
RUN powershell Remove-Item c:/inetpub/wwwroot/iisstart.png -force
RUN powershell Import-Module WebAdministration
RUN powershell New-WebAppPool -Name 'TestPool'

# Открывает порт 80 на новом контейнерном изображении
# Используется для открытия TCP-порта 80 для разрешения подключения http к веб-сайту.
# Однако эта строка закомментирована, потому что в контейнере IIS этот порт
# уже открыт по умолчанию.
#EXPOSE 80

# Устанавливает основную команду контейнерного изображения
# Это указывает изображению запускать мониторинг службы для службы w3svc.
# Когда это указано, контейнер автоматически остановится
# если служба w3svc остановлена. Эта строка закомментирована из-за
# контейнера IIS уже имеет это входное значение по умолчанию.
#ENTRYPOINT ["C:\\ServiceMonitor.exe", "w3svc"]

Построение нового образа Docker

У вас готов Dockerfile, и вы загрузили базовый образ IIS. Теперь пришло время построить новый образ Docker с использованием Dockerfile.

Для создания нового образа используйте команду docker build "тег". Эта команда создает образ. В этой статье вы также используете опцию -t **, которая заменяет часть “тега”. Эта опция позволяет дать вашему новому образу дружественное имя и ссылаться на Dockerfile, указав путь к папке, где он находится.

Ниже вы видите пример того, как убедиться, что консоль находится в каталоге C:\Containers, а затем создать новый образ из Dockerfile в каталоге C:\Containers\Container1.

PS51> cd C:\Containers
PS51> docker build -t container1 .\Container1

После запуска вы увидите ход выполнения команды, когда она обрабатывает каждую инструкцию в файле docker построчно:

Building a progress of the command as it traverses each instruction in the docker filenew Docker image

После завершения у вас должен быть новый образ Docker!

Теперь выполните команду docker images, чтобы просмотреть доступные изображения. Ниже приведен пример созданного образа container1.

Viewing available Docker images

Примечание: Команда docker build —help – это полезный параметр для отображения подробной информации о выполняемой команде Docker.

Запуск Docker Container

На этом этапе у вас должен быть создан новый образ. Пришло время запустить контейнер с использованием этого образа. Для запуска нового контейнера используйте команду docker run.

docker run команда запустит новый контейнер Docker на основе образа container1, который вы создали ранее. Вы можете увидеть пример ниже.

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

Когда выполнится команда docker run, она вернет идентификатор созданного контейнера. Приведенный ниже пример записывает этот идентификатор в переменную $containerID, чтобы мы могли легко обращаться к нему позже.

PS51> $containerID = docker run -d container1
PS51> $containerID
Running a Docker container

После того как контейнер запущен, выполните команду docker ps. Эта команда позволяет увидеть, какие контейнеры в данный момент работают с использованием каждого образа. Обратите внимание, что запущенный образ автоматически получает прозвище (busy_habit в данном случае). Это прозвище иногда используется вместо идентификатора контейнера для управления им.

Listing running Docker containers

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

A new container is built from a new image you just created. Let’s now start actually using that container to run code. Running code inside of a Docker container is done using the docker exec command.

В этом примере выполните docker exec, чтобы просмотреть вывод PowerShell для команды Get-ChildItem в контейнере с использованием следующего синтаксиса команды. Это позволит убедиться, что инструкции в Dockerfile по удалению файлов IIS по умолчанию были выполнены успешно.

PS51> docker exec $containerID powershell Get-ChildItem c:\inetpub\wwwroot

Вы можете видеть ниже, что существует только файл index.html, что означает, что файлы IIS по умолчанию были удалены.

Running PowerShell commands in a Docker container

Теперь выполните команду ipconfig в контейнере, чтобы получить локальный IP-адрес образа контейнера и попытаться подключиться к веб-сайту IIS.

PS51> docker exec $containerID ipconfig

Вы можете видеть ниже, что ipconfig был запущен в контейнере так же, как если бы он был запущен на вашем локальном компьютере, и вернул всю информацию об IP.

Running ipconfig in a Docker container

Инспектирование веб-сайта IIS

Теперь пришло время раскрыть плоды вашего труда! Пора посмотреть, правильно ли сервер IIS, работающий в контейнере Docker, обслуживает страницу index.html.

Откройте браузер и вставьте IP-адрес IPv4, найденный через ipconfig, в адресную строку. Если все хорошо, вы должны увидеть сообщение Hello World!!, как показано ниже.

IIS webpage running in a Docker container

Обзор истории Docker

Одна из полезных команд, которую можно использовать при работе с контейнерами Docker, – это команда docker history. Хотя она не обязательно связана с созданием образа или самого контейнера, команда docker history является полезной, поскольку позволяет просматривать изменения, внесенные в образ контейнера.

PS51> docker history container1

Вы можете видеть ниже, что команда docker history возвращает всю информацию о действиях Dockerfile и PowerShell, выполненных в контейнере container1, с которым вы работали.

Inspecting container changes with docker history

Очистка запущенных образов Docker

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

Запустите команду docker ps, чтобы просмотреть список контейнеров, работающих на вашей системе:

PS51> docker ps
Viewing available Docker containers

Теперь остановите запущенные контейнеры с помощью команды docker stop:

PS51> docker stop <image nick name: busy_haibt in my case>
PS51> docker stop <image nick name: unruffled_driscoll in my case>
Stopping Docker containers

Наконец, вы можете окончательно удалить остановленные контейнеры с помощью команды docker system prune.

PS51> docker system prune
Removing Docker images

Дополнительное чтение

Source:
https://adamtheautomator.com/docker-build-tag/