Начало работы с контейнерами (часть 8)

Опубликовано: 18 Апреля, 2023

  • Начало работы с контейнерами (часть 2)

В своей предыдущей статье из этой серии я начал с постановки вопроса — как вы взаимодействуете с контейнерами? Я частично ответил на этот вопрос, показав вам, как создать контейнер веб-сервера. При этом мы создали новый базовый образ, установили IIS, добавили некоторый пользовательский код веб-сайта, а затем создали контейнер. Тем не менее, вопрос о том, как вы можете взаимодействовать с контейнером, все еще остается.

Взаимодействие с контейнером Windows Server на самом деле ничем не отличается от взаимодействия с виртуальной машиной. Однако есть пара ключевых отличий.

Ключом к взаимодействию с контейнером является понимание того, что контейнер получает те же типы ресурсов, что и любая другая среда Windows Server. Позвольте мне показать вам, что я имею в виду. На снимке экрана ниже черное окно PowerShell запущено внутри контейнера. Я использовал команду Docker Run и ключ -it для интерактивного запуска контейнера. Я добавил команду CMD к команде Docker Run, в результате чего контейнер открыл окно командной строки. Оттуда я запустил сеанс PowerShell.

Синее окно PowerShell изначально работает на хост-сервере. Это окно не запускается внутри контейнера.

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

В целях демонстрации я запускаю общий контейнер IIS. Если вы посмотрите на рисунок ниже, то увидите, что мой контейнер называется Microsoft/iis.

Я загрузил этот контейнер напрямую из Microsoft с помощью следующей команды:

Докер тянет Microsoft/iis

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

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

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

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

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

Выход
Выход
Докер rm $(докер ps -a -q)
Docker run -d -p 80:80 microsoft/iis ping -t localhost

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

Теперь, если я открою браузер (на другом компьютере) и введу IP-адрес хост-сервера, мне будет представлен веб-сайт контейнера по умолчанию.

Конечно, это поднимает вопрос о том, как вы можете управлять IIS. На данный момент единственным реальным вариантом является управление IIS через PowerShell. Теоретически должна быть возможность использовать диспетчер информационных служб Интернета (IIS) для подключения к контейнерному веб-приложению. Однако Windows Server 2016 еще не выпущен, и, несмотря на то, что я потратил несколько часов на попытки такого подключения, я не смог заставить его работать. Предположительно, после выхода Windows Server 2016 можно будет управлять контейнерами с помощью графических инструментов.

Как вы помните, я использовал эту команду для запуска контейнера Microsoft/iis:

Docker run -d -p 80:80 microsoft/iis ping -t localhost

Эта команда обеспечивает перенаправление порта для порта 80, чтобы трафик, предназначенный для порта 80, перенаправлялся на веб-сервер. Мой подход заключался в том, чтобы реализовать перенаправление портов и для диспетчера IIS. Диспетчер IIS использует номер порта 8172 для подключения к веб-серверу. Таким образом, я выполнил следующую команду, чтобы принудительно перенаправить порт для порта 80 и порта 8172:

Docker run -d -p 80:80 -p 8172:8172 microsoft/iis ping -t localhost

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

Так как же подключить PowerShell к контейнеру Docker, когда контейнер не запускается в интерактивном режиме? Поначалу это кажется серьезной проблемой. Помните, что в настоящее время наш контейнер находится в изолированной подсети, поэтому мы не можем просто использовать командлет Enter-PSSession. К счастью, Docker может помочь с этой проблемой.

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

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

На данный момент процесс немного глючит, но к моменту выпуска Windows Server 2016 он должен быть исправлен. Если вы посмотрите на рисунок ниже, вы увидите, что я использовал команду Docker ps для получения имени контейнера, а затем использовал Docker attach для подключения к контейнеру. В этот момент кажется, что окно заблокировано. Однако вы можете нажать Enter, чтобы вернуться к командной строке PowerShell. Когда вы закончите взаимодействие с контейнером, вы можете ввести Exit. Консоль не будет выглядеть по-другому, но чтобы доказать, что я действительно работал внутри контейнера, я набрал команду DIR до и после выхода из контейнера. Как видно на рисунке, каталог контейнера отличается от каталога хост-сервера.

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

  • Начало работы с контейнерами (часть 2)
  • Начало работы с контейнерами (часть 7)