- Обзор хранилища контейнера Container Storage Overview
- Область временных файлов Scratch Space
- Хранилище уровня Layer Storage
- Где хранятся уровни и как их изменить Where layers are stored and how to change it
- Поддерживаемые операции хранилища уровня Supported operations in layer storage
- Постоянное хранилище Persistent Storage
- Ограничения хранилища Storage Limits
- Примеры Examples
- SPBDEV Blog
- Установка Docker Community Edition в Windows 10
- Установка Docker Enterprise Edition на Windows Server 2016
- Где мои данные?
- Создание независимого Docker Volume
- Где docker хранит контейнеры?
- 2 ответа 2
- Команда commit
- Ошибка в версии Ruby
- Загрузка образов
Обзор хранилища контейнера Container Storage Overview
В этом разделе приводятся общие сведения о различных способах использования контейнерами хранилища в Windows. This topic provides an overview of the different ways containers use storage on Windows. В случае хранилища контейнеры ведут себя иначе, чем виртуальные машины. Containers behave differently than virtual machines when it comes to storage. По сути, контейнеры создаются так, чтобы выполняющееся в них приложение не могло записывать свое состояние в файловую систему узла. By nature, containers are built to prevent an app running within them from writing state all over the host’s filesystem. По умолчанию контейнеры используют «вспомогательное» пространство, но Windows также предоставляет средства для хранения в постоянном хранилище. Containers use a «scratch» space by default, but Windows also provides a means to persist storage.
Область временных файлов Scratch Space
Контейнеры Windows по умолчанию используют временное хранилище. Windows containers by default use ephemeral storage. Все операции ввода-вывода контейнера выполняются во «вспомогательном пространстве», и у каждого контейнера такое пространство свое. All container I/O happens in a «scratch space» and each container gets their own scratch. Данные о создании и записи файлов записываются во вспомогательное пространство и не отправляются на узел. File creation and file writes are captured in the scratch space and do not escape to the host. При остановке экземпляра контейнера все изменения, произошедшие во вспомогательном пространстве, сбрасываются. When a container instance is stopped, all changes that occurred in the scratch space are thrown away. При запуске нового экземпляра контейнера ему предоставляется новое вспомогательное пространство. When a new container instance is started, a new scratch space is provided for the instance.
Хранилище уровня Layer Storage
Как описано в статье Общие сведения о контейнерах, образы контейнеров представляют собой набор файлов, представленный в виде совокупности слоев. As described in the Containers Overview, container images are a bundle of files expressed as a series of layers. Хранилище слоя содержит все файлы, которые встроены в контейнер. Layer storage is all the files that are built into the container. При каждом выполнении операции docker pull и docker run с контейнером результаты совпадают. Every time you docker pull then docker run that container — they are the same.
Где хранятся уровни и как их изменить Where layers are stored and how to change it
При установке по умолчанию уровни хранятся в C:\ProgramData\docker и распределяются между каталогами «image» и «windowsfilter». In a default installation, layers are stored in C:\ProgramData\docker and split across the «image» and «windowsfilter» directories. Вы можете изменить место хранения уровней, используя конфигурацию docker-root , как показано в документации по подсистеме Docker в Windows. You can change where the layers are stored using the docker-root configuration, as demonstrated in the Docker Engine on Windows documentation.
Для хранилища уровня поддерживается только файловая система NTFS. Only NTFS is supported for layer storage. ReFS не поддерживается. ReFS is not supported.
Вам не следует менять какие-либо файлы в каталогах уровня — они тщательно контролируются с помощью таких команд, как: You should not modify any files in the layer directories — they’re carefully managed using commands such as:
Поддерживаемые операции хранилища уровня Supported operations in layer storage
Запущенные контейнеры могут использовать большинство операций NTFS, за исключением транзакций. Running containers can use most NTFS operations with the exception of transactions. К ним относятся настройка списков управления доступом, при этом все списки проверяются внутри контейнера. This includes setting ACLs, and all ACLs are checked inside the container. Если вы хотите запускать процессы как множество пользователей в контейнере, вы можете создать пользователей в Dockerfile с помощью RUN net user /create . , настроить списки управления доступом к файлу, а затем настроить процессы для выполнения с этим пользователем с помощью директивы Dockerfile USER. If you want to run processes as multiple users inside a container, you can create users in your Dockerfile with RUN net user /create . , set file ACLs, then configure processes to run with that user using the Dockerfile USER directive.
Постоянное хранилище Persistent Storage
Контейнеры Windows поддерживают механизмы для обеспечения постоянного хранения с помощью привязок и томов. Windows containers support mechanisms for providing persistent storage via bind mounts and volumes. Дополнительные сведения см. в разделе Постоянное хранилище в контейнерах. To learn more, see Persistent Storage in Containers.
Ограничения хранилища Storage Limits
Обычно приложения для Windows запрашивают объем свободного места на диске перед установкой или созданием новых файлов, а также для удаления временных файлов. A common pattern for Windows applications is to query the amount of free disk space before installing or creating new files or as a trigger for cleaning up temporary files. Для обеспечения максимальной совместимости приложений диск C: в контейнере Windows представляет виртуальное свободное пространство размером 20 ГБ. With the goal of maximizing application compatibility, the C: drive in a Windows container represents a virtual free size of 20GB.
Некоторым пользователям может потребоваться переопределить это значение по умолчанию и настроить свободное пространство меньшей или большей емкости. Some users may want to override this default and configure the free space to a smaller or larger value. Это можно сделать с помощью параметра «size» в конфигурации «storage-opt». this can be accomplished though the “size” option within the “storage-opt” configuration.
Примеры Examples
Командная строка: docker run —storage-opt «size=50GB» mcr.microsoft.com/windows/servercore:ltsc2019 cmd Command line: docker run —storage-opt «size=50GB» mcr.microsoft.com/windows/servercore:ltsc2019 cmd
Вы также можете изменить файл конфигурации Docker напрямую. Or you can change the docker configuration file directly:
Этот способ подходит также для команды docker build. This method works for docker build, too. В документе Настройка docker представлены дополнительные сведения об изменении файла конфигурации docker. See the configure docker document for more details on modifying the docker configuration file.
SPBDEV Blog
Это последняя статья в этой серии о контейнерах 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 в экспериментальном режиме:
Или через графический интерфейс:
Теперь используйте параметр platform=linux в режиме Windows Container для запуска образов Linux.
Если вы работаете с предыдущей версией Docker, она будет запускать контейнеры Linux по умолчанию. Таким образом, вы должны изменить этот параметр и переключиться в режим Windows Container с помощью меню лотка Docker:
или выполнив следующую команду в приглашении PowerShell
И это все. 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:
Как вы можете заметить, параметр -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, введите следующую команду:
Где docker хранит контейнеры?
У меня redmine установлен на сервере в двух контейнерах:
Хочу перенести их, запустить в другом месте, и сделать резервную копию. В документации ясно написано, что контейнеры создаются в том числе для переноса, однако инструкций как это делается я не нашёл. Нашёл, что docker хранит свои файлы в директории /var/lib/docker однако там у меня много тысяч файлов на 4 GB, а мои контейнеры — намного меньше, не хотелось бы таскать всё что есть в этой директории
2 ответа 2
В приведённой вами инструкции видно, что контейнер запускается с опцией
В момент монтирования происходит затирание данных в контейнере, если те присутствовали по этому пути.
Если опция —volume не была указана, то docker автоматически создаёт volumes исходя из параметров указанных в конфигурационном файле Dockerfile.
Если обратиться к исходникам образа для PostgreSQL, то можно заметить, что это два volumes: /var/lib/postgresql и /run/postgresql . По первому пути расположены данные postgres. Собственно, они нас и интересуют.
Узнать всю информацию про volumes отдельно взятого контейнера можно командой
Данные возвращаются в json-формате, а потому предусмотрена возможность фильтрации/поиска через опцию —format
Все volumes для которых не указан путь расположения на хосте (левая часть /host/path/to/data:/container/to/data ) хранятся в директории /var/lib/docker/volumes/ /_data/ . Таким образом, можно просто исследовав все директории в /var/lib/docker/volumes/ и найти необходимый.
Если левая часть указана, а правая совпадает с volumes, которые указаны в Dockerfile (volumes by default), то происходит переопределение директории на хосте. Зачем нам два волиума с одинковыми данными на хосте ( /var/lib/docker/volumes/ /_data/ и /host/path/to/data ), правда?
Как уже было отмечено @dmitrz, пока не существует возможности управлять volumes уже на поднятых контейнерах, также как и линковать. Первая проблема должна уже очень скоро решиться.
Команда commit
Volume является отдельной сущностью и потому не попадает в commit. Вот что говорит официальная документация.
The commit operation will not include any data contained in volumes mounted inside the container.
Вообще смущает наличие двух методов создания образов: файлами конфигурации и коммитами.
Файл конфигурации задаёт изначальную конфигурацию контейнера в момент запуска, а коммит сохраняет состояние на момент коммита. Если, к примеру, волиумы не задавать (не в конфиге и не при запуске), то состояние контейнера будет меняться (писаться данные будут именно в него). Возможно, у вас может возникнуть ситуация, когда нужно подправить конфиг postgres или ещё что-то сделать внутри контейнера, то с помощью команды docker exec -it postgresql bash вы можете зайти внутрь. Далее, все сделанные изменения вы можете закоммитить в образ, чтобы запуская контейнер где-нибудь ещё из этого образа не повторять все эти действия. Но такой подход сомнительный. Лучше сделать правки в основном конфиге Dockerfile .
Ошибка в версии Ruby
В docker существует такое понятие, как entrypoint. Обычно это shell-скрипт, который дёргается при запуске docker run или docker start . Если посмотреть листинг entrypoint.sh для redmine, то можно заметить установку плагинов (bundles) для redmine. Далее, если файла $
Если данные redmine критичны ( /srv/docker/redmine/redmine:/home/redmine/data ), то их обязательно нужно перенести на новую машину. Далее, поднять либо закоммиченый образ, либо загрузить контейнер с уже новой версией redmine по той инструкции.
Можете ознакомится со всеми доступными версиями redmine образов от sameersbn.
Что касается PostgreSQL контейнера, то его данные ( /srv/docker/redmine/postgresql:/var/lib/postgresql ) обязательно необходимо перенести.
Загрузка образов
Загрузка образов из registry (https://hub.docker.com/, https://quay.io/, можно даже поднять локальный) осуществляется с помощь команды
, где тег — это, как правило, версия софта, который находится в этом образе.
Запуск контейнера происходит командой
Если образа с таким именем и тегом на локальной машине нет, то прозрачно срабатывает команда docker pull , т.е. образ ищется на удалённых registry.