Работа с контейнерами Windows и Docker: сохранение данных

Tags: Windows, Docker, Linux

Это последняя статья в этой серии о контейнерах Windows и Docker. Прежде чем углубиться в тему, мы хотим просто описать различные версии Docker, которые существуют сегодня, если вы не работали в сфере Docker, или если вы только что начали использовать Docker. 2 марта 2017 года Docker изменил формат своей версии, а также изменил название пакета Docker Engine на Docker Community Edition или Docker Enterprise Edition.

Установка Docker Community Edition в Windows 10

Первое издание называется Docker Community Edition (CE). Docker (CE) - новое название для бесплатных продуктов Docker. Docker CE совместим со следующей платформой ОС: Mac OS, Windows 10, Amazon AWS, Azure, CentOS, Debian, Fedora и Ubuntu. Вдобавок к этому, Docker CE поставляется в двух вариантах: Edge и Stable:

  • Edge предназначен для пользователей, которые хотят каждый месяц получать последние и самые лучшие функции
  • Stable выпускается ежеквартально и предназначен для пользователей, которым требуется более легкая в обслуживании скорость выпуска

Как заявляют Docker, Community Edition отлично подходит для разработчиков и команд ops, которые начинают создавать приложения для контейнеров. Если вы хотите загрузить эту версию, перейдите в Docker Store. После завершения загрузки и установки вы можете запустить пакет под названием Docker For Windows. На момент написания этой статьи был установлен Docker CE v18.03.

Убедитесь, что вы можете запустить простой контейнер:

Если вы работаете с Docker v18.03, то одной из основных функций является возможность запуска изображений Windows и Linux бок о бок, вместо того, чтобы переключать Docker из Linux в режим Windows. Давайте подтвердим, что вы запускаете Daemon в экспериментальном режиме:

  PS > docker version -f '{{.Server.Experimental}}'
  
  True

 

Или через графический интерфейс:

 

Теперь используйте параметр platform=linux в режиме Windows Container для запуска образов Linux.




Если вы работаете с предыдущей версией Docker, она будет запускать контейнеры Linux по умолчанию. Таким образом, вы должны изменить этот параметр и переключиться в режим Windows Container с помощью меню лотка Docker:




или выполнив следующую команду в приглашении PowerShell

& $Env:ProgramFiles\Docker\Docker\DockerCli.exe SwitchDaemon

 

И это все. Docker CE работает и работает на Windows 10!

 

Теперь вы можете пойти в Docker Hub, чтобы узнать, какие изображения контейнера доступны. Например, вы можете запустить простой контейнер Windows, содержащий PowerShell Core:

И вы можете легко настроить свой движок Docker с помощью GUI Docker For Windows:

Установка Docker Enterprise Edition на Windows Server 2016

Второе издание называется Docker Enterprise Edition (EE) и является сертифицированной контейнерной платформой для: CentOS, Red Hat Enterprise Linux (RHEL), Ubuntu, SUSE Linux Enterprise Server (SLES), Oracle Linux, Windows Server 2016, IBM Z, Amazon AWS и Azure (Docker EE для Azure). Docker EE доступен в трех уровнях: базовом, стандартном и расширенном. Стандартные и расширенные уровни добавляют расширенное управление контейнерами (Docker Datacenter) и сканирование безопасности Docker. Вы можете найти дополнительную информацию о Docker EE в Docker Store и о том, как установить его в других операционных системах. В этом случае вам просто нужно запустить следующие команды в качестве администратора для установки Docker EE на Windows Server 2016:

  PS > Install-Module DockerProvider
  PS > Install-Package Docker -ProviderName DockerProvider -RequiredVersion preview -Force
  
  WARNING: A restart is required to enable the one or more features.
  Please restart your machine.
  Name       Version          Source       Summary
  ----       -------          ------       -------
  Docker     17.10.0-ee-pr... Docker       Docker Enterprise Edition for Windows Server...
  
  PS > Restart-Computer

Как вы можете заметить, параметр -Force используется для установки самой последней версии Docker EE. И затем выполняется перезапуск хоста Windows-контейнера Windows. В этой статье будет показано использование Docker EE v17.10 на Windows Server 2016.

Ниже приведен цикл выпуска для Docker в 2017 году. Например, v17.03 означает, что этот выпуск был выпущен в марте 2017 года.




Цикл выпуска Docker с веб-сайта Docker

 

Подводя итог, Docker CE имеет те же основные функции, что и Docker Enterprise Edition, поэтому не бойтесь, вы можете использовать Docker CE вместо Docker EE. Тем не менее, если вы хотите запустить Docker на производстве, мы рекомендуем установить как минимум Docker EE Basic.

Где мои данные?

Представьте, что вы запускаете Windows  Container и имеете некоторые важные данные внутри контейнера. Да, контейнеры эфемерны, но вы можете сохранить эти данные за пределами контейнера по многим причинам. Ну, вы можете легко обмениваться данными между  Container Host и Windows Container. Кроме того, вы можете также обмениваться данными между двумя контейнерами Windows, если вам нужно. Эта функция очень полезна для многоконтейнерных приложений. Например, приложения должны предоставлять доступ к данным или сохранять данные после удаления контейнера, например, для баз данных или файлов журналов. Эта функция называется Docker Volumes.

 

В этом разделе я опишу, как работают Docker Volumes и объясняют четыре разных способа обмена данными с контейнерами:

 

  1. Создание независимого Docker Volume
  2. Совместное использование Docker Volume с несколькими контейнерами
  3. Копирование данных из Container Host в контейнер
  4. Создание Docker Volume из Dockerfile

 

При использовании контейнеров Windows по-прежнему рекомендуется использовать Docker Volumes для хранения данных на контейнерном хосте, а не на контейнере.  Вы также можете создать несколько контейнеров, которые будут использовать один и тот же Docker Volume. Docker Volume будет отображаться как на хосте контейнера, так и на контейнере. Первое, что нужно знать, это то, что объемы докеров сохраняются в следующем скрытом пути на хосте контейнера:

Примечание. Учитывая, что мы переключаемся между хосте контейнера и контейнерами, мы добавим комментарий перед каждой командой.

 

Создание независимого Docker Volume

Чтобы создать Docker Volume, введите следующую команду:

Чтобы просмотреть все существующие Docker Volume на узле контейнера, введите:

  #On the container host
  PS > Docker volume ls
  
  DRIVER              VOLUME NAME
  local               vol01


Теперь вы можете подключить существующий Docker Volume к новому контейнеру iis01, используя параметр -v. Синтаксис прост, вы должны указать папку на узле контейнера, а затем папку в контейнере:

Включив ключ -it и указав PowerShell, текущая консоль PowerShell будет использоваться для автоматического подключения к вашему контейнеру после его создания. Если вы хотите выйти из своего контейнера, введите Exit и ваш контейнер будет остановлен. Чтобы оставить контейнер в фоновом режиме, используйте CTRL + P + Q. Чтобы открыть новый сеанс PowerShell, запущенный в контейнере, используйте Docker attach <имя контейнера> и дважды нажмите ENTER. Когда в сеансе PowerShell для существующего контейнера, Exit просто вернется к хосту, но оставит контейнер включенным. Для запуска контейнера используйте Docker start <имя контейнера>.

Теперь создайте простой текстовый файл на хосте контейнера:




Убедитесь, что файл существует и в контейнере:

 

#On the iis01 container

 PS C:\> Get-ChildItem .\vol01\_data

Directory: C:\vol01\_data

 Mode                LastWriteTime Length Name

 ----                ------------- ------ ----

 -a----      3/2/2018   8:49 PM      19 TestFile.txt

Чтобы проверить контейнер, выполните следующую команду и проверьте раздел Mounts:

 #On the container host

 PS > Docker inspect iis01

Некоторым из вас, вероятно, интересно, можно ли переместить место хранения? К счастью, да! Чтобы выполнить эту задачу, вам необходимо создать файл конфигурации с именем daemon.json:

 #On the container host

 PS > New-Item -Type File -Path "C:\ProgramData\Docker\config" -Name daemon.json

Directory: C:\ProgramData\Docker\config

 Mode                LastWriteTime Length Name

 ----                ------------- ------ ----

 -a----      3/2/2018   9:00 PM          0 daemon.json

Затем укажите новое место хранения, добавив его в файл daemon.json:

 {

 "data-root": "D:\\DockerVolumes"

 }

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

 #On the container host

 PS > Get-Service *Docker* | Restart-Service

 PS > Docker volume create --name newvolume

Папка для новой папки Data Root будет создана автоматически. Будьте осторожны, старые тома не перемещаются автоматически, и существующие контейнеры и тома больше не будут видны Docker. Обратите внимание, что вы можете удалить существующий Docker Volume с помощью Docker volume rm <имя тома>.



Совместное использование  Docker Volume с несколькими контейнерами

Начните с создания нового контейнера под названием iis02 на основе изображения nanoserver/iis и прикрепите к нему том. Обратите внимание, что вам не нужно указывать папку Data Root, потому что Docker создаст каталог со случайным именем папки. Затем создайте файл на новом томе.

Убедитесь, что файл существует на хосте контейнера:




Во время последнего шага вы создали новый контейнер и добавили новый Docker Volume. Теперь вы создадите второй контейнер iis03 и присоедините тот же самый Docker Volume C:/vol03, используя параметр -volumes-from:

 

 #On the container host

 PS > docker run -it --name iis03 --volumes-from iis02 nanoserver/iis powershell

Убедитесь, чтотом установлен. Создайте новый текстовый файл с именем vol03-from-iis03.txt:

 #On the iis03 container

 PS C:\> dir .\vol03

     Directory: C:\vol03

 Mode                LastWriteTime Length Name

 ----                ------------- ------ ----

 -a----      3/3/2018   2:24 PM      32 vol03.txt

 

 #The text file created on iis02 is visible on iis03 thanks to the "--volumes-from" parameter

 #On the "iis03" Container

 PS C:\> "Hello" > .\vol03\vol03-from-iis03.txt

На узле контейнера отображаются оба файла:




По умолчанию доступ к Docker Volume осуществляется в режиме чтения / записи. В некоторых случаях вам необходимо ограничить доступ к Docker Volume. Вы можете установить том как только для чтения. Создайте контейнер под названием db01 и добавьте том с доступом только для чтения (RO):

 

#On the container host

 PS > Docker run -it --name db01 --volumes-from iis02:ro nanoserver/iis powershell

Теперь попробуйте создать файл на этом томе, но задача не будет выполнена:

 #On the db01 container

 PS C:\> dir .\vol03

     Directory: C:\vol03

 Mode                LastWriteTime Length Name

 ----                ------------- ------ ----

 -a----      3/3/2018   2:36 PM      16 vol03-from-iis03.txt

 -a----      3/3/2018   2:24 PM      32 vol03.txt

PS C:\> "Welcome" > .\vol03\vol03-from-db01.txt

 

 out-file : Access to the path 'C:\vol03\vol03-from-db01.txt' is denied.

 At line:1 char:1

 + "Welcome" > .\vol03\vol03-from-db01.txt

 + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     + CategoryInfo          : OpenError: (:) [Out-File], UnauthorizedAccessException

     + FullyQualifiedErrorId : FileOpenFailure,Microsoft.PowerShell.Commands.OutFileCommand

Копирование данных из хоста контейнера в контейнер

Вот еще один интересный способ обмена данными между хостом контейнера и контейнером Windows. Утилита docker cp копирует из файловой системы контейнера в хост контейнера или обратно, от хоста контейнера до контейнера. Создайте новый файл MyPackage.zip в папке C:\Packages. Затем скопируйте файл Zip из контейнера в контейнер iis02:

Команда Docker Attach будет подключаться к контейнеру iis02. Будьте осторожны, вы должны дважды нажать ENTER, чтобы подключиться к вашему контейнеру. Проверьте, существует ли пакет в контейнере:

Создание Docker Volume из DockerFile

Вы можете установить Docker Volume с помощью DockerFile. В следующем примере вы создадите изображение nanoserver/iis с помощью ключевого слова VOLUME для установки папки. Обязательно создайте каталог C:\Volume на хосте, если он не существует.

  #On the container host
  PS > New-Item C:\Volume\Dockerfile -ItemType file
  PS > Add-Content -Path "C:\Volume\Dockerfile" -Value "FROM nanoserver/iis"
  PS > Add-Content -Path "C:\Volume\Dockerfile" -Value "VOLUME C:/Vol03"
  PS > Add-Content -Path "C:\Volume\Dockerfile" -Value "RUN powershell -Command gci"

Перейдите в каталог, в котором находится этот файл Dockerfile, и выполните следующую команду:

  #On the container host
  PS C:\Volume> docker build -t volumeimg .
 
  Sending build context to Docker daemon  2.048kB
  Step 1/3 : FROM nanoserver/iis
   ---> 234e90a5d146
  Step 2/3 : VOLUME C:/Vol03
   ---> Using cache
   ---> 9acd2015fab2
  Step 3/3 : RUN powershell -Command gci
   ---> Running in 98c4a64d54e2
      Directory: C:\
  Mode                LastWriteTime         Length Name
  ----                -------------         ------ ----
  d-----         3/3/2018   4:37 PM                inetpub
  d-----         3/3/2018   4:37 PM                Program Files
  d-----        7/16/2016  12:09 PM                Program Files (x86)
  d-r---         3/3/2018   4:37 PM                Users
  d----l         3/3/2018   4:37 PM                vol03
  d-----         3/3/2018   4:37 PM                Windows
  -a----       11/20/2016  11:32 AM           1894 License.txt
  []
  Successfully tagged vol3:latest

Создано пользовательское изображение Docker:

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

На хосте контейнера был успешно создан новый файл с именем mount.txt. Вы можете подтвердить путь установки с проверкой Docker:

Этот метод очень полезен в режиме DevOps или когда вы хотите развернуть несколько контейнеров Windows в массовом режиме. Volume будет смонтирован автоматически во время развертывания.

Контейнеры Linux в Windows?

Еще одно большое улучшение - контейнеры Linux. Теперь вы можете запускать контейнеры Linux на хосте контейнера Windows. Однако его можно запустить только в среде dev/test, поскольку он все еще находится в экспериментальной версии. Итак, что это значит? Ну, вы сможете развернуть свой Windows Containers Host, затем установить движок Docker и, наконец, запустить контейнер Linux или контейнер Windows. Благодаря LinuxKit и Moby Project вы можете использовать контейнеры Linux в Windows, используя одну из следующих сборок Windows для поддержки этой функции:

  • Windows 10 Fall Creators Update
  • Windows Server 2016 1709 (новое основное издание)

Чтобы запустить Linux-контейнеры в Windows, Microsoft использует функцию Linux Containers on Windows (LCOW). LCOW будет использовать изоляцию Hyper-V, поэтому перед использованием Linux-контейнеров необходимо установить Hyper-V:

Затем Docker daemon работает как процесс Windows, и каждый раз, когда вы запускаете контейнер Linux, Docker запускает минимальную виртуальную машину с ядром Linux. Однако «виртуальная машина» не отображается пользователем в консоли Hyper-V! По-прежнему невозможно совместно использовать контейнеры для Windows и Linux Docker. Это означает, что вы должны включить LCOW для запуска контейнеров Linux и отключить LCOW для запуска контейнеров Windows. Если вы работаете в Windows 10, обратите внимание, что поддержка LCOW доступна только на канале Edge.

Начните с включения функции LCOW со следующими командами.

  • Эта функция включена, поэтому вы можете создать контейнер Linux на основе Ubuntu, используя следующую команду:

На этом этапе вы работаете в контейнере Ubuntu на своем Windows Server:

Чтобы закончить с забавным контейнером Linux, вы можете запустить контейнер NyanCat:

  #On the container host
  PS > Docker run -it supertest2014/nyan

Заключение

В этой статье серии обсуждались новые версии Docker, которые вы можете использовать в зависимости от ваших потребностей. Первый - Docker CE, который предназначен для среды разработки и тестирования, а второй - Docker EE, который предназначен для использования в производстве. Затем вы увидели:

  • Как обмениваться данными между хостом контейнера и контейнером.
  • Как делиться данными между двумя контейнерами.

И в конце вы запускали контейнеры Linux на хосте Windows-контейнера, что является отличным улучшением для sysadmin и разработчиков. В настоящее время LCOW все еще находится в стадии бета-тестирования и не поддерживается. В производственной среде, пожалуйста, используйте его для целей dev.



No Comments

Add a Comment