В сосуде объемом 10 литров находится 2 г водорода при температуре 2000 К. Определить

Условие задачи:

В сосуде объемом 10 литров находится 2 г водорода при температуре 2000 К. Определить давление газа, если при такой температуре половина молекул диссоциирована на атомы.

Задача №4.2.57 из «Сборника задач для подготовки к вступительным экзаменам по физике УГНТУ»

Дано:

\(V=10\) л, \(m=2\) г, \(T=2000\) К, \(\alpha=0,5\), \(p-?\)

Решение задачи:

При высокой температуре молекулярный водород H2 начинает диссоциировать (распадаться) на атомы. При этом отношение количества распавшихся молекул к начальному числу молекул водорода H2 называется степенью диссоциации \(\alpha\). В этой задаче степень диссоциации равна 0,5 согласно условию.

Давление газа в сосуде будет равно сумме парциальных давлений атомарного (H) \(p_1\) и молекулярного (H2) \(p_2\) водорода согласно закону Дальтона.

\[p = {p_1} + {p_2}\;\;\;\;(1)\]

Пусть до начала диссоциации в сосуде содержалось \(N\) молекул H2. Если степень диссоциации равна \(\alpha\), то число атомов водорода будет равно \(2 \alpha N\), так как из одной молекулы образуется два атома, а число молекул водорода – \(\left( {1 – \alpha } \right)N\). Запишем уравнение Клапейрона-Менделеева для обоих газов, представив количество вещества как отношение числа частиц к числу Авогадро \(N_А\):

\[\left\{ \begin{gathered}
{p_1}V = \frac{{2\alpha N}}{{{N_А}}}RT \hfill \\
{p_2}V = \frac{{\left( {1 – \alpha } \right)N}}{{{N_А}}}RT \hfill \\
\end{gathered} \right.\]

Поделим обе части представленных уравнений на объем \(V\), тогда:

\[\left\{ \begin{gathered}
{p_1} = \frac{{2\alpha N}}{{{N_А}V}}RT \hfill \\
{p_2} = \frac{{\left( {1 – \alpha } \right)N}}{{{N_А}V}}RT \hfill \\
\end{gathered} \right.\]

Оба выражения для давлений подставим в формулу (1):

\[p = \frac{{2\alpha N}}{{{N_А}V}}RT + \frac{{\left( {1 – \alpha } \right)N}}{{{N_А}V}}RT\]

\[p = \frac{{\left( {\alpha  + 1} \right)N}}{{{N_А}V}}RT\]

Отношение числа молекул \(N\) к числу Авогадро \(N_А\) равно количеству вещества \(\nu\), которое также можно найти по формуле:

\[\nu  = \frac{N}{{{N_А}}} = \frac{m}{M}\]

Здесь \(M\) – молярная масса водорода, равная 0,002 кг/моль. 23 * 0,1) = 0,639 кг/м3

Ответ: 0,639 кг/м3

Записаться на занятие к этому репетитору

Задайте свой вопрос!

Наши репетиторы максимально быстро дадут на него развёрнутый ответ. Это бесплатно!

Задать вопрос

Новые вопросы

Литература7 класс

У

Ученик

помогите пожалуйста, очень надо!!Самый запоминающийся эпизод в сказе «богиня в шинели» и о чём заставляет задуматься данное произведение? (И.М. Ермаков) буду очень благодарна!!

Ответ данНаталья Васильевна

Предметы: Математика, Подготовка к школе, Окружающий мир, Начальные классы, Литературное чтение, Русский язык, Онлайн няня

Химия8 класс

У

Ученик

Здравствуйте! Помогите, пожалуйста, с решением задачи. «Определите массу воды, взятой для приготовления 20% раствора соли, взятой в количестве 20 г».

Ответ данНаталья Сергеевна

Предметы: Математика, Геометрия, Алгебра, Окружающий мир, Начальные классы, Литературное чтение, Подготовка к ОГЭ, Русский язык

Алгебра8 класс

М

Матвей

Решите уравнение 𝑥^2 = 5,5𝑥 + 3 сначала графически, азатем с помощью формулы корней.

Ответ данНаталья Васильевна

Предметы: Математика, Подготовка к школе, Окружающий мир, Начальные классы, Литературное чтение, Русский язык, Онлайн няня

Всеобщая история7 класс

М

Макар

Помогите пожалуйста. сравнение уровня социально экономического развития германских государств с развитием англии или франции и укажи на основе различия.

Ответ данНаталья Васильевна

Предметы: Математика, Подготовка к школе, Окружающий мир, Начальные классы, Литературное чтение, Русский язык, Онлайн няня

Геометрия8 класс

М

Матвей

Из вершины 𝐵 треугольника 𝐴𝐵𝐶 проведеныбиссектриса 𝐵𝐸 и высота 𝐵𝐻, равная 12, причем высота делитсторону 𝐴𝐶 на отрезки 𝐴𝐻 и 𝐻𝐶, равные 9 и 16 соответственно.Найдите стороны треугольника и отрезки, на которые биссектриса делит сторону 𝐴𝐶.

Ответ данНаталья Сергеевна

Предметы: Математика, Геометрия, Алгебра, Окружающий мир, Начальные классы, Литературное чтение, Подготовка к ОГЭ, Русский язык

Геометрия8 класс

М

Матвей

Периметр треугольника 𝐴𝐵𝐶 равен 60 см. На сторонах𝐴𝐵, 𝐵𝐶, 𝐴𝐶 лежат точки 𝐷, 𝐸, 𝐹 соответственно так, что 𝐷𝐵𝐸𝐹 −ромб. Найдите стороны 𝐴𝐵 и 𝐵𝐶 треугольника, если 𝐴𝐹 = 10,𝐹𝐶 = 15.

Ответ дан

Тепаева Мария

История России6 класс

И

Ирина

Не могу найти значимые события в 982 году ? по истории 6 класс 

Ответ данИнна Игоревна

Предметы: Математика, Подготовка к школе, История России, Окружающий мир, Подготовка к ЕГЭ, Обществознание, Всеобщая история, ИЗО, МХК, Литературное чтение, Русский язык

Русский язык8 класс

М

Матвей

Найдите предложения с несогласованным определением, запишите только номера предложений: 1. Солнце гуляло по мокрым от вчерашнего дождя жнивьям. 2. Я не мог забыть девушку с синими глазами. 3. Дальше по оврагу еще лежал снег в желтых, в синих пятнах. 4. После душной ночи потянул на рассвете свежий ве…

Ответ данНаталья Васильевна

Предметы: Математика, Подготовка к школе, Окружающий мир, Начальные классы, Литературное чтение, Русский язык, Онлайн няня

Алгебра8 класс

М

Матвей

Решите графически уравнения:1. √𝑥 = 6 − 𝑥;2. 2√𝑥 = 2𝑥 − 4.

Ответ данНаталья Сергеевна

Предметы: Математика, Геометрия, Алгебра, Окружающий мир, Начальные классы, Литературное чтение, Подготовка к ОГЭ, Русский язык

Русский язык8 класс

М

Матвей

Выполните морфемный разбор слов: существование, горевший.

Ответ данНаталья Васильевна

Предметы: Математика, Подготовка к школе, Окружающий мир, Начальные классы, Литературное чтение, Русский язык, Онлайн няня

Volumes

Volumes являются предпочтительным механизмом для сохранения данных, созданных и используемых контейнерами Docker. В то время как монтирование привязки зависит от структура каталогов и ОС хост-машины, тома полностью управляются Докер. У томов есть несколько преимуществ перед привязкой:

  • Тома легче создавать резервные копии или мигрировать, чем связанные монтирования.
  • Вы можете управлять томами с помощью команд Docker CLI или Docker API.
  • Тома
  • работают как с контейнерами Linux, так и с Windows.
  • Тома могут быть более безопасно разделены между несколькими контейнерами.
  • Драйверы томов
  • позволяют хранить тома на удаленных хостах или у облачных провайдеров, чтобы шифровать содержимое томов или добавлять другие функции.
  • Содержимое новых томов может быть предварительно заполнено контейнером.
  • Тома
  • на рабочем столе Docker имеют гораздо более высокую производительность, чем монтирование с привязкой из Хосты Mac и Windows.

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

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

Тома используют распространение привязки rprivate , а распространение привязки не настраивается для томов.

Выберите флаг -v или —mount

В общем, --mount более явный и подробный. Самая большая разница в том, что 9Синтаксис 0027 -v объединяет все параметры вместе в одном поле, а --mount синтаксис разделяет их. Вот сравнение синтаксиса для каждого флага.

Если вам нужно указать параметры драйвера тома, вы должны использовать --mount .

  • -v или --volume : Состоит из трех полей, разделенных двоеточием (

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

    • В случае именованных томов первое поле — это имя тома. уникальным на данном хост-компьютере. Для анонимных томов первое поле опущено.
    • Второе поле — это путь, по которому монтируется файл или каталог. контейнер.
    • Третье поле является необязательным и представляет собой список параметров, разделенных запятыми, например как ро . Эти варианты обсуждаются ниже.
  • --mount

    : состоит из нескольких пар ключ-значение, разделенных запятыми, и каждый состоящий из кортежа = . Синтаксис --mount более подробный. чем -v или --volume , но порядок ключей не имеет значения, и значение флага легче понять.

    • типа крепления, которое может быть bind , volume или тмпфс . В этой теме обсуждаются объемы, поэтому тип всегда том .
    • Источник крепления. Для именованных томов это имя тома. Для анонимных томов это поле опущено. Может быть указан как источник или
      источник
      .
    • Пункт назначения принимает в качестве значения путь, по которому находится файл или каталог. монтируется в контейнер. Может быть указано как пункт назначения , dst , или цель .
    • только для чтения 9Опция 0028, если она присутствует, заставляет монтировать привязку в контейнер только для чтения. Может быть указан как только для чтения или ro .
    • Опция volume-opt , которую можно указывать более одного раза, занимает пара ключ-значение, состоящая из имени параметра и его значения.

Escape-значения из внешнего синтаксического анализатора CSV

Если ваш драйвер тома принимает список, разделенный запятыми, в качестве опции, вы должны экранировать значение от внешнего синтаксического анализатора CSV. Чтобы избежать том-опт , заключите его в двойные кавычки ( " ) и окружите весь параметр монтирования с одинарными кавычками ( ' ).

Например, локальный драйвер принимает параметры монтирования в виде разделенных запятыми список в параметре o .

В этом примере показан правильный способ выхода из списка.

 $ создание службы докеров \
    --mount 'type=volume,src=<ИМЯ-ТОМА>,dst=<ПУТЬ-КОНТЕЙНЕРА>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=: ,"volume-opt=o=addr=,vers=4,soft,timeo=180,bg,tcp,rw"'
    --название моей службы \
    <ИЗОБРАЖЕНИЕ>
 

В приведенных ниже примерах показан синтаксис --mount и -v , где это возможно, и --mount представлен первым.

Различия между

-v и --mount поведением

В отличие от привязки, все параметры томов доступны для обоих --mount и -v флаги.

При использовании томов со службами поддерживается только

--mount .

Создание томов и управление ими

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

Создать том :

 $ docker том создать my-vol
 

Список томов :

 $ том докера, лс
местный мой-vol
 

Проверка тома :

 $ docker том проверить my-vol
[
    {
        "Водитель": "местный",
        «Ярлыки»: {},
        "Точка монтирования": "/var/lib/docker/volumes/my-vol/_data",
        "Имя": "мой-том",
        "Параметры": {},
        "Область действия": "местный"
    }
]
 

Удалить том :

 $ объем докера rm my-vol
 

Запустить контейнер с объемом

Если вы запускаете контейнер с несуществующим томом, Docker создает объем для вас. В следующем примере том myvol2 монтируется в /app/ в контейнере.

Приведенные ниже примеры -v и --mount дают тот же результат. Вы не можете бежать их обоих, если вы не удалите devtest контейнер и том myvol2 после запуска первого.

  • --крепление
$ docker run -d \ --название разработчика \ --mount источник=myvol2, цель=/приложение \ nginx: последний
 $ docker run -d \
  --название разработчика \
  -v myvol2:/приложение \
  nginx: последний
 

Используйте docker inspect devtest , чтобы убедиться, что том создан и смонтирован. правильно. Ищите Mounts раздел:

 "Крепления": [
    {
        "Тип": "объем",
        "Имя": "myvol2",
        "Источник": "/var/lib/docker/volumes/myvol2/_data",
        «Назначение»: «/приложение»,
        "Водитель": "местный",
        "Режим": "",
        "RW": правда,
        "Распространение": ""
    }
],
 

Это показывает, что монтирование является томом, показывает правильный источник и назначение, и что монтирование доступно для чтения и записи.

Остановите контейнер и удалите том. Примечание. Удаление тома — это отдельная шаг.

 $ docker-контейнер остановить devtest
$ docker контейнер rm devtest
$ том докера rm myvol2
 

Использовать том с Docker Compose

Вот пример одной службы Docker Compose с томом:

 услуги:
  внешний интерфейс:
    изображение: узел:lts
    тома:
      - мое приложение:/дом/узел/приложение
тома:
  мое приложение:
 

Запуск docker compose up впервые создает том. Тот же том повторно используется при последующем выполнении команды.

Вы можете создать том непосредственно вне Compose, используя docker volume create и затем укажите его внутри docker-compose.yml следующим образом:

 услуги:
  внешний интерфейс:
    изображение: узел:lts
    тома:
      - мое приложение:/дом/узел/приложение
тома:
  мое приложение:
    внешний: правда
 

Дополнительные сведения об использовании томов в Compose см. Объемы раздел в спецификации Compose.

Запустить службу с томами

При запуске службы и определении тома каждый контейнер службы использует собственный локальный объем. Ни один из контейнеров не может делиться этими данными, если вы используете

местный объемный драйвер. Однако некоторые драйверы томов поддерживают общее хранилище.

В следующем примере запускается служба nginx с четырьмя репликами, каждая из которых использует локальный том с именем myvol2 .

 $ docker service create -d \
  --replicas=4 \
  --name devtest-сервис \
  --mount источник=myvol2, цель=/приложение \
  nginx: последний
 

Используйте службу докеров ps devtest-service , чтобы убедиться, что служба работает:

 $ служба докеров ps devtest-service
ID НАЗВАНИЕ ИЗОБРАЖЕНИЕ УЗЕЛ ТРЕБУЕМОЕ СОСТОЯНИЕ ТЕКУЩЕЕ СОСТОЯНИЕ ОШИБКА ПОРТЫ
4d7oz1j85wwn devtest-service.1 nginx:latest moby Выполняется Выполняется 14 секунд назад
 

Вы можете удалить службу, чтобы остановить запущенные задачи:

 $ служба докеров rm devtest-service
 

Удаление службы не приводит к удалению томов, созданных службой. Удаление тома — это отдельный шаг.

Различия в синтаксисе для служб

Команда docker service create не поддерживает флаг -v или --volume . При монтировании тома в контейнеры службы необходимо использовать параметр --mount . флаг.

Заполнение тома с помощью контейнера

Если вы запускаете контейнер, который создает новый том, а контейнер имеет файлы или каталоги в каталоге для монтирования, например /app/ , содержимое каталога копируется в том. Затем контейнер монтирует и использует том, а также другие контейнеры, которые также используют том иметь доступ к предварительно заполненному контенту.

Чтобы проиллюстрировать это, в следующем примере запускается контейнер nginx и заполняет новый том nginx-vol содержимым контейнера /usr/share/nginx/html каталог. Здесь Nginx хранит HTML по умолчанию. содержание.

Примеры --mount и -v имеют одинаковый конечный результат.

  • --крепление
 $ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html \
  nginx: последний
 
 $ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/доля/nginx/html \
  nginx: последний
 

После выполнения любого из этих примеров выполните следующие команды для очистки контейнеры и тома. Примечание. Удаление тома — это отдельный шаг.

 $ остановка контейнера докеров nginxtest
$ докер-контейнер rm nginxtest
$ том докера rm nginx-vol
 

Использовать том только для чтения

Для некоторых приложений разработки контейнеру необходимо выполнить запись в привязку mount, чтобы изменения распространялись обратно на хост Docker. В другие времена, контейнеру нужен только доступ для чтения к данным. Несколько контейнеры могут монтировать один и тот же том. Вы можете одновременно смонтировать один том как для чтения-записи для некоторых контейнеров и только для чтения для других.

Следующий пример изменяет приведенный выше, но монтирует каталог как доступный только для чтения том, добавив ro в (пустой по умолчанию) список опций, после точка монтирования внутри контейнера. Если присутствует несколько вариантов, вы можете разделить их с помощью запятых.

Примеры --mount и -v дают одинаковый результат.

  • --крепление
 $ docker run -d \
  --name=nginxtest \
  --mount source=nginx-vol,destination=/usr/share/nginx/html, только для чтения \
  nginx: последний
 
 $ docker run -d \
  --name=nginxtest \
  -v nginx-vol:/usr/share/nginx/html:ro \
  nginx: последний
 

Используйте docker inspect nginxtest , чтобы убедиться, что монтирование только для чтения было создано правильно. Ищите Mounts раздел:

 "Крепления": [
    {
        "Тип": "объем",
        «Имя»: «nginx-vol»,
        "Источник": "/var/lib/docker/volumes/nginx-vol/_data",
        «Назначение»: «/usr/share/nginx/html»,
        "Водитель": "местный",
        "Режим": "",
        "RW": ложь,
        "Распространение": ""
    }
],
 

Остановите и удалите контейнер, а также удалите том. Удаление объема – это отдельный шаг.

 $ остановка контейнера докеров nginxtest
$ докер-контейнер rm nginxtest
$ том докера rm nginx-vol
 

Обмен данными между машинами

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

Существует несколько способов добиться этого при разработке приложений. Один из них — добавить в ваше приложение логику для хранения файлов в облачном объекте. система хранения, такая как Amazon S3. Другой способ — создавать тома с помощью драйвера, который поддерживает запись файлов во внешнюю систему хранения, такую ​​как NFS или Amazon S3.

Драйверы томов

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

Использовать драйвер тома

При создании тома с помощью тома докера создайте или при запуске контейнер, использующий еще не созданный том, можно указать драйвер тома. В следующих примерах используется драйвер тома vieux/sshfs , первый при создании автономный том, а затем при запуске контейнера, который создает новый объем.

Первоначальная настройка

В следующем примере предполагается, что у вас есть два узла, первый из которых — Docker. host и может подключиться ко второму узлу с помощью SSH.

На хосте Docker установите подключаемый модуль vieux/sshfs :

 $ установка плагина докера --grant-all-permissions vieux/sshfs
 

Создание тома с помощью драйвера тома

В этом примере указан пароль SSH, но если два хоста имеют общие ключи настроен, вы можете исключить пароль. Каждый драйвер тома может иметь ноль или более настраиваемые параметры, каждый из которых указывается с помощью флага -o .

 $ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o пароль=тестовый пароль \
  sshvolume
 

Запустите контейнер, который создает том с помощью драйвера тома

В следующем примере указывается пароль SSH. Однако, если два хоста имеют общие ключи настроены, вы можете исключить пароль. Каждый драйвер тома может иметь ноль или более настраиваемых параметров.

Примечание:

Если драйвер тома требует передать какие-либо параметры, вы должны использовать флаг --mount для монтирования тома, а не -v .

 $ запуск докера -d \
  --имя sshfs-контейнера \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx: последний
 

Создайте службу, которая создает том NFS

В следующем примере показано, как можно создать том NFS при создании службы. Он использует 10.0.0.10 в качестве сервера NFS и /var/docker-nfs в качестве экспортируемого каталога на сервере NFS. Обратите внимание, что указан драйвер тома local .

NFSv3
 $ docker service create -d \
  --имя nfs-сервиса \
  --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,volume-opt=o =адрес=10.0.0.10' \
  nginx: последний
 
NFSv4
 $ docker service create -d \
    --имя nfs-сервиса \
    --mount 'type=volume,source=nfsvolume,target=/app,volume-driver=local,volume-opt=type=nfs,volume-opt=device=:/var/docker-nfs,"volume-opt= o=addr=10.0.0.10,rw,nfsvers=4,асинхронный"' \
    nginx: последний
 

Создание томов CIFS/Samba

Вы можете подключить общий ресурс Samba непосредственно в Docker без настройки точки подключения на своем хосте.

 $ создание тома докера \
--локальный драйвер \
--opt тип=cifs \
--opt устройство=//uxxxxx. your-server.de/backup \
--opt o=addr=uxxxxx.your-server.de,имя пользователя=uxxxxxxx,пароль=*****,file_mode=0777,dir_mode=0777 \
--name cif-том
 

Параметр addr требуется, если вы указываете имя хоста вместо IP. Это позволяет Docker выполнять поиск имени хоста.

Блочные запоминающие устройства

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

Важно

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

Принцип работы монтажных блочных устройств

Под капотом флаг --mount с использованием локального драйвера хранилища вызывает Linux монтирует системный вызов и перенаправляет переданные вами параметры без изменений. Docker не реализует никаких дополнительных функций помимо встроенных функций монтирования, поддерживаемых ядром Linux.

Если вы знакомы с Команда Linux mount , вы можете думать об опциях --mount как о переадресации на смонтируйте команду следующим образом:

 $ mount -t    -o 
 

Чтобы проиллюстрировать это, рассмотрим следующий пример команды mount . Эта команда монтирует устройство /dev/loop5 по пути /external-drive в системе.

 $ mount -t ext4 /dev/loop5 /внешний диск
 

Следующий докер запускает 9Команда 0028 дает аналогичный результат с точки зрения запускаемого контейнера. Запуск контейнера с этой опцией --mount настраивает монтирование так же, как если бы вы выполнили команда mount из предыдущего примера.

 $ запуск докера \
  --mount='type=volume,dst=/внешний диск,volume-driver=local,volume-opt=device=/dev/loop5,volume-opt=type=ext4'
 

Вы не можете выполнить команду mount внутри контейнера напрямую, потому что контейнер не может получить доступ к /dev/loop5 устройство. Вот почему вместо этого мы используем параметр --mount для команды docker run .

Пример: установка блочного устройства в контейнер

Следующие шаги создают файловую систему ext4 и монтируют ее в контейнер. Поддержка файловой системы вашей системой зависит от используемой вами версии ядра Linux.

  1. Создайте файл и выделите для него место:

     $ fallocate -f 1G disk.raw
     
  2. Создайте файловую систему на файле disk.raw :

     $ mkfs.ext4 disk.raw
     
  3. Создать кольцевое устройство:

     $ lossup -f --show disk.raw
    /dev/loop5
     

    Примечание

    lossup создает временную петлю, которая удаляется после перезагрузка системы или удаление вручную с помощью lossup -d .

  4. Запустите контейнер, который монтирует петлевое устройство как том:

     $ docker run -it --rm \
      --mount='type=volume,dst=/внешний диск,volume-driver=local,volume-opt=device=/dev/loop5,volume-opt=type=ext4' \
      убунту баш
     

    При запуске контейнера путь /внешний диск монтирует disk. raw файл из файловой системы хоста в качестве блочного устройства.

  5. Когда вы закончите и устройство будет отключено от контейнера, отсоедините петлевое устройство, чтобы удалить устройство из хост-системы:

     $ lossup -d /dev/loop5
     

Резервное копирование, восстановление или миграция томов данных

Тома

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

Резервное копирование тома

Например, создайте новый контейнер с именем dbstore :

.
 $ docker run -v /dbdata --name dbstore ubuntu /bin/bash
 

В следующей команде:

  • Запустить новый контейнер и смонтировать том из контейнера dbstore
  • Смонтируйте локальный каталог хоста как /backup
  • Передайте команду, которая архивирует содержимое тома dbdata в файл backup. tar внутри нашего каталога /backup .
 $ docker run --rm --volumes-from dbstore -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
 

Когда команда завершается и контейнер останавливается, создается резервная копия dbdata том.

Восстановить том из резервной копии

Только что созданную резервную копию можно восстановить в тот же контейнер, или в другой контейнер, который вы создали в другом месте.

Например, создайте новый контейнер с именем dbstore2 :

.
 $ docker run -v /dbdata --name dbstore2 ubuntu /bin/bash
 

Затем разархивируйте файл резервной копии в томе данных нового контейнера:

 $ docker run --rm --volumes-from dbstore2 -v $(pwd):/backup ubuntu bash -c "cd /dbdata && tar xvf /backup/backup.tar --strip 1"
 

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

Удалить тома

Том данных Docker сохраняется после удаления контейнера. Есть два типа томов для рассмотрения:

  • Именованные тома имеют определенный источник вне контейнера, например, awesome:/bar .
  • Анонимные тома не имеют определенного источника. Поэтому при удалении контейнера вы можете указать демону Docker Engine удалить их.

Удаление анонимных томов

Для автоматического удаления анонимных томов используйте параметр --rm . Например, эта команда создает анонимный том /foo . Когда вы удалите контейнер, Docker Engine удаляет том /foo , но не том awesome .

 $ docker run --rm -v /foo -v awesome:/bar busybox top
 

Примечание :

Если другой контейнер связывает тома с --volumes-из , определения томов скопированы и анонимный том также остается после удаления первого контейнера.

Удалить все тома

Чтобы удалить все неиспользуемые тома и освободить место:

 $ сокращение объема докера
 

Следующие шаги

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

Bind mounts

Bind mounts существуют с первых дней существования Docker. Крепления для привязки есть ограниченная функциональность по сравнению с томами. Когда вы используете привязку mount файл или каталог на хост-компьютере монтируется в контейнер. На файл или каталог ссылается его абсолютный путь на хосте машина. Напротив, когда вы используете том, внутри него создается новый каталог. Каталог хранилища Docker на хост-компьютере, и Docker управляет им. содержимое каталога.

Файл или каталог не должны уже существовать на хосте Docker. Это создается по запросу, если он еще не существует. Bind mount очень эффективны, но они полагаются на файловую систему хост-машины, имеющую определенную структуру каталогов доступный. Если вы разрабатываете новые приложения Docker, рассмотрите возможность использования вместо этого именованные тома. Вы не можете использовать команды Docker CLI для прямого управлять монтированием привязки.

Выберите флаг -v или --mount

В общем, --mount более явный и подробный. Самая большая разница в том, что синтаксис -v объединяет все параметры вместе в одном поле, а --mount синтаксис разделяет их. Вот сравнение синтаксиса для каждого флага.

Наконечник

Новые пользователи должны использовать синтаксис --mount . Опытные пользователи могут быть более знакомым с синтаксисом -v или --volume , но рекомендуется используйте --mount , потому что исследования показали, что его проще использовать.

  • -v или --volume : Состоит из трех полей, разделенных двоеточием ( : ). Поля должны быть в правильном порядке, а значение каждого поля сразу не видно.
    • В случае монтирования с привязкой первое поле — это путь к файлу или каталог на хост-компьютере .
    • Второе поле — это путь, по которому смонтирован файл или каталог. контейнер.
    • Третье поле является необязательным и представляет собой список параметров, разделенных запятыми, например как ро , z и Z . Эти варианты обсуждаются ниже.
  • --mount : состоит из нескольких пар ключ-значение, разделенных запятыми и состоящий из кортежа = . Синтаксис --mount более подробный. чем -v или --volume , но порядок ключей не имеет значения, и значение флага легче понять.
    • тип монтирования, которое может быть bind , volume или tmpfs . Этот тема обсуждает монтирование привязки, поэтому тип всегда bind .
    • Источник крепления. Для монтирования привязки это путь к файлу или каталог на хосте демона Docker. Может быть указан как источник или источник .
    • Пункт назначения принимает в качестве значения путь, по которому находится файл или каталог. монтируется в контейнер. Может быть указано как пункт назначения , дст , или цель .
    • Параметр только для чтения , если он присутствует, вызывает монтирование привязки в контейнер только для чтения.
    • Опция bind-propagation , если она присутствует, изменяет связать распространение. Может быть один из rprivate , частный , rshared , общий , rslave , ведомый .
    • Флаг --mount не поддерживает z или Z варианты модификации этикетки селинукс.

В приведенных ниже примерах показан синтаксис --mount и -v , где это возможно, и --mount представлен первым.

Различия между

-v и --mount поведением

Поскольку флаги -v и --volume долгое время были частью Docker. время их поведение не может быть изменено. Это означает, что есть одно поведение это отличается между -v и --mount .

Если вы используете -v или --volume для привязки-монтирования файла или каталога, который не еще существуют на хосте Docker, -v создает для вас конечную точку. Это всегда создается как каталог.

Если вы используете --mount для связывания монтирования файла или каталога, который не еще не существует на хосте Docker, Docker , а не автоматически создает его для вы, но выдает ошибку.

Запустить контейнер с привязанным креплением

Рассмотрим случай, когда у вас есть каталог с исходным кодом и когда вы создаете исходный код, артефакты сохраняются в другой каталог, source/target/ . Вы хотите, чтобы артефакты были доступны для контейнера по адресу /app/ , и вы хотите, чтобы контейнер получал доступ к новой сборке каждый раз, когда вы собираете исходный код на вашем хосте разработки. Используйте следующую команду для привязки цели /. каталог в ваш контейнер в /приложение/ . Запустите команду из исходный каталог . Подкоманда $(pwd) заменяет текущую рабочую каталог на хостах Linux или macOS. Если вы работаете в Windows, см. также Преобразование пути в Windows.

Приведенные ниже примеры --mount и -v дают тот же результат. Ты не может запустить их оба, если вы не удалите контейнер devtest после запуска первый.

  • --крепление
 $ docker run -d \
  -это \
  --название разработчика \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  nginx: последний
 
 $ docker run -d \
  -это \
  --название разработчика \
  -v "$(pwd)"/цель:/приложение \
  nginx: последний
 

Используйте docker inspect devtest , чтобы убедиться, что монтирование привязки было создано правильно. Ищите Mounts раздел:

 "Крепления": [
    {
        "Тип": "связать",
        "Источник": "/tmp/источник/цель",
        «Назначение»: «/приложение»,
        "Режим": "",
        "RW": правда,
        «Распространение»: «rprivate»
    }
],
 

Это показывает, что монтирование является монтированием bind , оно показывает правильный источник и назначения, он показывает, что монтирование доступно для чтения и записи и что распространение установить на rprivate .

Остановить контейнер:

 $ docker-контейнер остановить devtest
$ docker контейнер rm devtest
 

Смонтировать в непустой каталог контейнера

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

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

Примеры --mount и -v имеют одинаковый конечный результат.

  • --крепление
 $ docker run -d \
  -это \
  --name сломанный-контейнер \
  --mount type=bind,source=/tmp,target=/usr \
  nginx: последний
docker: ответ об ошибке от демона: ошибка времени выполнения oci: container_linux. go:262:
запуск процесса контейнера вызвал "exec: \"nginx\": исполняемый файл не найден в $PATH".
 
 $ docker run -d \
  -это \
  --name сломанный-контейнер \
  -v /tmp:/usr \
  nginx: последний
docker: ответ об ошибке от демона: ошибка времени выполнения oci: container_linux.go:262:
запуск процесса контейнера вызвал "exec: \"nginx\": исполняемый файл не найден в $PATH".
 

Контейнер создан, но не запускается. Удалите это:

 $ docker container rm сломанный-контейнер
 

Использовать монтирование только для чтения

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

Этот пример изменяет приведенный выше, но монтирует каталог как доступный только для чтения привязать монтирование, добавив ro в (пустой по умолчанию) список опций, после точка монтирования внутри контейнера. При наличии нескольких вариантов разделите их через запятую.

Примеры --mount и -v дают одинаковый результат.

  • --крепление
 $ docker run -d \
  -это \
  --название разработчика \
  --mount type=bind,source="$(pwd)"/target,target=/app,только для чтения \
  nginx: последний
 
 $ docker run -d \
  -это \
  --название разработчика \
  -v "$(pwd)"/цель:/приложение:ro \
  nginx: последний
 

Используйте docker inspect devtest , чтобы убедиться, что монтирование привязки было создано правильно. Ищите Mounts раздел:

 "Крепления": [
    {
        "Тип": "связать",
        "Источник": "/tmp/источник/цель",
        «Назначение»: «/приложение»,
        «Режим»: «ро»,
        "RW": ложь,
        «Распространение»: «rprivate»
    }
],
 

Остановить контейнер:

 $ docker-контейнер остановить devtest
$ docker контейнер rm devtest
 

Настройка распространения привязки

Распространение привязки по умолчанию равно rprivate как для монтирования привязки, так и для томов. Это настраивается только для монтирования с привязкой и только на хост-компьютерах Linux. Связывать Распространение — сложная тема, и многим пользователям не нужно настраивать ее.

Распространение привязки относится к тому, созданы ли монтирования в пределах данного bind-mount может распространяться на реплики этого монтирования. Учитывать точка монтирования /mnt , который также монтируется на /tmp . Настройки распространения контролировать, будет ли монтирование на /tmp/a также доступно на /mnt/a . Каждый настройка распространения имеет рекурсивный контрапункт. В случае рекурсии учтите, что /tmp/a также монтируется как /foo . Настройки распространения контролировать существование /mnt/a и/или /tmp/a .

Предупреждение

Распространение монтирования не работает с Docker Desktop.

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

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

Дополнительные сведения о распространении привязки см. Документация ядра Linux для общего поддерева.

В следующем примере каталог target/ дважды монтируется в контейнер. а второе монтирование устанавливает как опцию ro , так и распространение привязки rslave . вариант.

Примеры --mount и -v дают одинаковый результат.

  • --крепление
 $ запуск докера -d \
  -это \
  --название разработчика \
  --mount type=bind,source="$(pwd)"/target,target=/app \
  --mount type=bind,source="$(pwd)"/target,target=/app2,только для чтения,bind-propagation=rslave \
  nginx: последний
 
 $ docker run -d \
  -это \
  --название разработчика \
  -v "$(pwd)"/цель:/приложение \
  -v "$(pwd)"/target:/app2:ro,rslave \
  nginx: последний
 

Теперь, если вы создадите /app/foo/ , /app2/foo/ также существует.

Настройка метки selinux

Если вы используете selinux , вы можете добавить параметры z или Z , чтобы изменить selinux метка хост-файла или каталога , монтируемого в контейнер. Этот влияет на файл или каталог на самом хост-компьютере и может иметь последствия, выходящие за рамки Docker.

  • Параметр z указывает, что содержимое привязки используется несколькими контейнеры.
  • Параметр Z указывает, что содержимое монтирования привязки является частным и не используется совместно.

Будьте осторожны с этими параметрами. Привязка системного каталога например, /home или /usr с опцией Z отображает ваш хост-компьютер неработоспособен, и вам может потребоваться перемаркировать файлы хост-компьютера вручную.

Важно : При использовании связанных монтирований со службами метки selinux ( :Z и :z ), а также :ro игнорируются.