Работа с контейнерами Windows и Docker: сохранение данных
Это последняя статья в этой серии о контейнерах 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.
|
PS > Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V –All
PS > Get-Service *docker*
Status Name DisplayName
------ ---- -----------
Running com.docker.service Docker for Windows Service
|
Убедитесь, что вы можете запустить простой контейнер:
|
PS > Docker run --rm -v c:/Users:/data alpine ls /data
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete
Digest: sha256:7b848083f93822dd21b0a2f14a110bd99f6efb4b838d499df6d04a49d0debf8b
Status: Downloaded newer image for alpine:latest
All Users
Default
Default User
Nicolas
Public
defaultuser0
desktop.ini
|
Если вы работаете с 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:
|
PS > docker pull microsoft/powershell
Using default tag: latest
latest: Pulling from microsoft/powershell
1be7f2b886e8: Pull complete
6fbc4a21b806: Pull complete
[…]
74ebbb198c87: Pull complete
Digest: sha256:38ac64ecec7e36b1868458b6b49e9d41332de56da2053c14830ef4915d909813
Status: Downloaded newer image for microsoft/powershell:latest
PS > docker run --name PSCore -it microsoft/powershell
PowerShell v6.0.1
Copyright (c) Microsoft Corporation. All rights reserved.
https://aka.ms/pscore6-docs
Type 'help' to get help.
PS > $PSVersionTable
Name Value
---- -----
PSVersion 6.0.1
PSEdition Core
GitCommitId v6.0.1
OS Linux 4.9.75-linuxkit-aufs #1 SMP Tue Jan 9 10:58:17 UTC 2018
Platform Unix
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
PSRemotingProtocolVersion 2.3
SerializationVersion 1.1.0.1
WSManStackVersion 3.0
|
И вы можете легко настроить свой движок 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 и объясняют четыре разных способа обмена данными с контейнерами:
- Создание независимого Docker Volume
- Совместное использование Docker Volume с несколькими контейнерами
- Копирование данных из Container Host в контейнер
- Создание Docker Volume из Dockerfile
При использовании контейнеров Windows по-прежнему рекомендуется использовать Docker Volumes для хранения данных на контейнерном хосте, а не на контейнере. Вы также можете создать несколько контейнеров, которые будут использовать один и тот же Docker Volume. Docker Volume будет отображаться как на хосте контейнера, так и на контейнере. Первое, что нужно знать, это то, что объемы докеров сохраняются в следующем скрытом пути на хосте контейнера:
Примечание. Учитывая, что мы переключаемся между хосте контейнера и контейнерами, мы добавим комментарий перед каждой командой.
Создание независимого Docker Volume
Чтобы создать Docker Volume, введите следующую команду:
|
#On the container host
Docker volume create --name vol01
Vol01
|
Чтобы просмотреть все существующие Docker Volume на узле контейнера, введите:
|
#On the container host
PS > Docker volume ls
DRIVER VOLUME NAME
local vol01
|
Теперь вы можете подключить существующий Docker Volume к новому контейнеру iis01, используя параметр -v. Синтаксис прост, вы должны указать папку на узле контейнера, а затем папку в контейнере:
|
#On the container host
PS > Docker run --name iis01 -it -v C:\ProgramData\Docker\Volumes\Vol01:C:\Vol01 nanoserver/iis PowerShell
|
Включив ключ -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 создаст каталог со случайным именем папки. Затем создайте файл на новом томе.
|
#On the container host
PS > Docker run -it --name iis02 --volume c:/vol03 nanoserver/iis powershell
#On the "iis02" Container
PS > "Welcome vol03" > .\vol03\vol03.txt
PS > dir .\vol03
Directory: C:\vol03
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/3/2018 2:24 PM 32 vol03.txt
|
Убедитесь, что файл существует на хосте контейнера:
Во время последнего шага вы создали новый контейнер и добавили новый 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:
|
#On the container host
PS > Docker cp C:\Packages\MyPackage.zip iis02:/inetpub
PS > Docker attach 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:
Итак, теперь каждый контейнер, созданный с использованием этого изображения, автоматически монтирует том:
|
#On the container host
PS > docker run --rm -it --name srv01 volumeimg powershell
#On the "srv01" Container
PS > cd vol03
PS C:\vol03> "Mount from Container" > mount.txt
|
На хосте контейнера был успешно создан новый файл с именем 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:
|
#On the container host
PS > Install-WindowsFeature Hyper-V -IncludeManagementTools -Restart
|
Затем Docker daemon работает как процесс Windows, и каждый раз, когда вы запускаете контейнер Linux, Docker запускает минимальную виртуальную машину с ядром Linux. Однако «виртуальная машина» не отображается пользователем в консоли Hyper-V! По-прежнему невозможно совместно использовать контейнеры для Windows и Linux Docker. Это означает, что вы должны включить LCOW для запуска контейнеров Linux и отключить LCOW для запуска контейнеров Windows. Если вы работаете в Windows 10, обратите внимание, что поддержка LCOW доступна только на канале Edge.
Начните с включения функции LCOW со следующими командами.
|
#On the container host
PS > [Environment]::SetEnvironmentVariable("LCOW_SUPPORTED", "1", "Machine")
PS > Restart-Service Docker
|
- Эта функция включена, поэтому вы можете создать контейнер Linux на основе Ubuntu, используя следующую команду:
|
#On the contaner host
PS > Docker run –it ubuntu
|
На этом этапе вы работаете в контейнере Ubuntu на своем Windows Server:
|
root@58e001fba499:/# pwd
/
root@58e001fba499:/# mkdir /tmp/Linux
root@58e001fba499:/# ls /tmp
linux
|
Чтобы закончить с забавным контейнером Linux, вы можете запустить контейнер NyanCat:
|
#On the container host
PS > Docker run -it supertest2014/nyan
|
Заключение
В этой статье серии обсуждались новые версии Docker, которые вы можете использовать в зависимости от ваших потребностей. Первый - Docker CE, который предназначен для среды разработки и тестирования, а второй - Docker EE, который предназначен для использования в производстве. Затем вы увидели:
- Как обмениваться данными между хостом контейнера и контейнером.
- Как делиться данными между двумя контейнерами.
И в конце вы запускали контейнеры Linux на хосте Windows-контейнера, что является отличным улучшением для sysadmin и разработчиков. В настоящее время LCOW все еще находится в стадии бета-тестирования и не поддерживается. В производственной среде, пожалуйста, используйте его для целей dev.