0 added
0 removed
Original
2026-01-01
Modified
2026-02-19
1
Важная характеристика Docker-контейнеров - эфемерность. В любой момент контейнер может рестартовать: завершиться и вновь запуститься из образа. При этом все накопленные в нём данные будут потеряны. Но как в таком случае запускать в Docker приложения, которые должны сохранять информацию о своём состоянии? Для этого есть несколько инструментов.<p>В этой статье рассмотрим docker volumes, bind mount и tmpfs, дадим советы по их использованию, проведём небольшую практику.</p>
1
Важная характеристика Docker-контейнеров - эфемерность. В любой момент контейнер может рестартовать: завершиться и вновь запуститься из образа. При этом все накопленные в нём данные будут потеряны. Но как в таком случае запускать в Docker приложения, которые должны сохранять информацию о своём состоянии? Для этого есть несколько инструментов.<p>В этой статье рассмотрим docker volumes, bind mount и tmpfs, дадим советы по их использованию, проведём небольшую практику.</p>
2
<h2>Особенности работы контейнеров</h2>
2
<h2>Особенности работы контейнеров</h2>
3
Прежде чем перейти к способам хранения данных, вспомним устройство контейнеров. Это поможет лучше понять основную тему.<p>Контейнер создаётся из образа, в котором есть всё для начала его работы. Но там не хранится и тем более не изменяется ничего важного. В любой момент приложение в контейнере может быть завершено, а контейнер уничтожен, и это нормально. Контейнер отработал - выкидываем его и собираем новый. Если пользователь загрузил в приложение картинку, то при замене контейнера она удалится.</p>
3
Прежде чем перейти к способам хранения данных, вспомним устройство контейнеров. Это поможет лучше понять основную тему.<p>Контейнер создаётся из образа, в котором есть всё для начала его работы. Но там не хранится и тем более не изменяется ничего важного. В любой момент приложение в контейнере может быть завершено, а контейнер уничтожен, и это нормально. Контейнер отработал - выкидываем его и собираем новый. Если пользователь загрузил в приложение картинку, то при замене контейнера она удалится.</p>
4
<p>На схеме показано устройство контейнера, запущенного из образа Ubuntu 15.04. Контейнер состоит из пяти слоёв: четыре из них принадлежат образу, и лишь один - самому контейнеру. Слои образа доступны только для чтения, слой контейнера - для чтения и для записи. Если при работе приложения какие-то данные будут изменяться, они попадут в слой контейнера. Но при уничтожении контейнера слой будет безвозвратно потерян, и все данные вместе с ним.</p>
4
<p>На схеме показано устройство контейнера, запущенного из образа Ubuntu 15.04. Контейнер состоит из пяти слоёв: четыре из них принадлежат образу, и лишь один - самому контейнеру. Слои образа доступны только для чтения, слой контейнера - для чтения и для записи. Если при работе приложения какие-то данные будут изменяться, они попадут в слой контейнера. Но при уничтожении контейнера слой будет безвозвратно потерян, и все данные вместе с ним.</p>
5
В идеальном мире Docker используют только для запуска stateless-приложений, которые не читают и не сохраняют данные о своём состоянии и готовы в любой момент завершиться. Однако в реальности большинство программ относятся к категории stateful, то есть требуют сохранения данных между перезапусками.<p>Поэтому нужны способы сделать так, чтобы важные изменяемые данные не зависели от эфемерности контейнеров и, как бонус, были доступными сразу из нескольких мест.</p>
5
В идеальном мире Docker используют только для запуска stateless-приложений, которые не читают и не сохраняют данные о своём состоянии и готовы в любой момент завершиться. Однако в реальности большинство программ относятся к категории stateful, то есть требуют сохранения данных между перезапусками.<p>Поэтому нужны способы сделать так, чтобы важные изменяемые данные не зависели от эфемерности контейнеров и, как бонус, были доступными сразу из нескольких мест.</p>
6
<p>В Docker есть несколько способов хранения данных. Наиболее распространенные:</p>
6
<p>В Docker есть несколько способов хранения данных. Наиболее распространенные:</p>
7
<ul><li>тома хранения данных (docker volumes),</li>
7
<ul><li>тома хранения данных (docker volumes),</li>
8
<li>монтирование каталогов с хоста (bind mount).</li>
8
<li>монтирование каталогов с хоста (bind mount).</li>
9
</ul>Особые типы хранения:<ul><li>именованные каналы (named pipes, только в Windows),</li>
9
</ul>Особые типы хранения:<ul><li>именованные каналы (named pipes, только в Windows),</li>
10
<li>монтирование tmpfs (только в Linux).</li>
10
<li>монтирование tmpfs (только в Linux).</li>
11
</ul>На схеме показаны самые популярные типы хранения данных для Linux: в памяти (tmpfs), в файловой системе хоста (bind mount), в томе Docker (docker volumes). Разберём каждый вариант.<h2>Тома (docker volumes)</h2>
11
</ul>На схеме показаны самые популярные типы хранения данных для Linux: в памяти (tmpfs), в файловой системе хоста (bind mount), в томе Docker (docker volumes). Разберём каждый вариант.<h2>Тома (docker volumes)</h2>
12
Тома - рекомендуемый разработчиками Docker способ хранения данных. В Linux тома находятся по умолчанию в /var/lib/docker/volumes/. Другие программы не должны получать к ним доступ напрямую, только через контейнер.<p>Тома создаются и управляются средствами Docker: командой docker volume create, через указание тома при создании контейнера в Dockerfile или docker-compose.yml.</p>
12
Тома - рекомендуемый разработчиками Docker способ хранения данных. В Linux тома находятся по умолчанию в /var/lib/docker/volumes/. Другие программы не должны получать к ним доступ напрямую, только через контейнер.<p>Тома создаются и управляются средствами Docker: командой docker volume create, через указание тома при создании контейнера в Dockerfile или docker-compose.yml.</p>
13
<p>В контейнере том видно как обычный каталог, который мы определяем в Dockerfile. Тома могут быть с именами или без - безымянным томам Docker сам присвоит имя.</p>
13
<p>В контейнере том видно как обычный каталог, который мы определяем в Dockerfile. Тома могут быть с именами или без - безымянным томам Docker сам присвоит имя.</p>
14
<p>Один том может быть примонтирован одновременно в несколько контейнеров. Когда никто не использует том, он не удаляется, а продолжает существовать. Команда для удаления томов: docker volume prune.</p>
14
<p>Один том может быть примонтирован одновременно в несколько контейнеров. Когда никто не использует том, он не удаляется, а продолжает существовать. Команда для удаления томов: docker volume prune.</p>
15
<p>Можно выбрать специальный драйвер для тома и хранить данные не на хосте, а на удалённом сервере или в облаке.</p>
15
<p>Можно выбрать специальный драйвер для тома и хранить данные не на хосте, а на удалённом сервере или в облаке.</p>
16
<p><strong>Для чего стоит использовать тома в Docker:</strong></p>
16
<p><strong>Для чего стоит использовать тома в Docker:</strong></p>
17
<ul><li>шаринг данных между несколькими запущенными контейнерами,</li>
17
<ul><li>шаринг данных между несколькими запущенными контейнерами,</li>
18
<li>решение проблемы привязки к ОС хоста,</li>
18
<li>решение проблемы привязки к ОС хоста,</li>
19
<li>удалённое хранение данных,</li>
19
<li>удалённое хранение данных,</li>
20
<li>бэкап или миграция данных на другой хост с Docker (для этого надо остановить все контейнеры и скопировать содержимое из каталога тома в нужное место).</li>
20
<li>бэкап или миграция данных на другой хост с Docker (для этого надо остановить все контейнеры и скопировать содержимое из каталога тома в нужное место).</li>
21
</ul><h2>Монтирование каталога с хоста (bind mount)</h2>
21
</ul><h2>Монтирование каталога с хоста (bind mount)</h2>
22
Это более простая концепция: файл или каталог с хоста просто монтируется в контейнер.<p>Используется, когда нужно пробросить в контейнер конфигурационные файлы с хоста. Например, именно так в контейнерах реализуется DNS: с хоста монтируется файл /etc/resolv.conf.</p>
22
Это более простая концепция: файл или каталог с хоста просто монтируется в контейнер.<p>Используется, когда нужно пробросить в контейнер конфигурационные файлы с хоста. Например, именно так в контейнерах реализуется DNS: с хоста монтируется файл /etc/resolv.conf.</p>
23
<p>Другое очевидное применение - в разработке. Код находится на хосте (вашем ноутбуке), но исполняется в контейнере. Вы меняете код и сразу видите результат. Это возможно, так как процессы хоста и контейнера одновременно имеют доступ к одним и тем же данным.</p>
23
<p>Другое очевидное применение - в разработке. Код находится на хосте (вашем ноутбуке), но исполняется в контейнере. Вы меняете код и сразу видите результат. Это возможно, так как процессы хоста и контейнера одновременно имеют доступ к одним и тем же данным.</p>
24
<p><strong>Особенности bind mount:</strong></p>
24
<p><strong>Особенности bind mount:</strong></p>
25
<ol><li>Запись в примонтированный каталог могут вести программы как в контейнере, так и на хосте. Это значит, есть риск случайно затереть данные, не понимая, что с ними работает контейнер.</li>
25
<ol><li>Запись в примонтированный каталог могут вести программы как в контейнере, так и на хосте. Это значит, есть риск случайно затереть данные, не понимая, что с ними работает контейнер.</li>
26
<li>Лучше не использовать в продакшене. Для продакшена убедитесь, что код копируется в контейнер, а не монтируется с хоста.</li>
26
<li>Лучше не использовать в продакшене. Для продакшена убедитесь, что код копируется в контейнер, а не монтируется с хоста.</li>
27
<li>Для успешного монтирования указывайте полный путь к файлу или каталогу на хосте.</li>
27
<li>Для успешного монтирования указывайте полный путь к файлу или каталогу на хосте.</li>
28
<li>Если приложение в контейнере запущено от root, а совместно используется каталог с ограниченными правами, то в какой-то момент может возникнуть проблема с правами на файлы и невозможность что-то удалить без использования sudo.</li>
28
<li>Если приложение в контейнере запущено от root, а совместно используется каталог с ограниченными правами, то в какой-то момент может возникнуть проблема с правами на файлы и невозможность что-то удалить без использования sudo.</li>
29
</ol><strong>Когда использовать тома, а когда монтирование с хоста</strong><h2>Монтирование tmpfs</h2>
29
</ol><strong>Когда использовать тома, а когда монтирование с хоста</strong><h2>Монтирование tmpfs</h2>
30
Tmpfs - временное файловое хранилище. Это некая специально отведённая область в оперативной памяти компьютера. Из определения выходит, что tmpfs - не лучшее хранилище для важных данных. Так оно и есть: при остановке или перезапуске контейнера сохранённые в tmpfs данные будут навсегда потеряны.<p>На самом деле tmpfs нужно не для сохранения данных, а для безопасности, полученные в ходе работы приложения <em>чувствительные</em> данные безвозвратно исчезнут после завершения работы контейнера. Бонусом использования будет высокая скорость доступа к информации.</p>
30
Tmpfs - временное файловое хранилище. Это некая специально отведённая область в оперативной памяти компьютера. Из определения выходит, что tmpfs - не лучшее хранилище для важных данных. Так оно и есть: при остановке или перезапуске контейнера сохранённые в tmpfs данные будут навсегда потеряны.<p>На самом деле tmpfs нужно не для сохранения данных, а для безопасности, полученные в ходе работы приложения <em>чувствительные</em> данные безвозвратно исчезнут после завершения работы контейнера. Бонусом использования будет высокая скорость доступа к информации.</p>
31
<p>Например, приложение в контейнере тормозит из-за того, что в ходе работы активно идут операции чтения-записи, а диски на хосте не очень быстрые. Если вы не уверены, в какой каталог идёт эта нагрузка, можно применить к запущенному контейнеру команду docker diff. И вот этот каталог смонтировать как tmpfs, таким образом перенеся ввод-вывод с диска в оперативную память.</p>
31
<p>Например, приложение в контейнере тормозит из-за того, что в ходе работы активно идут операции чтения-записи, а диски на хосте не очень быстрые. Если вы не уверены, в какой каталог идёт эта нагрузка, можно применить к запущенному контейнеру команду docker diff. И вот этот каталог смонтировать как tmpfs, таким образом перенеся ввод-вывод с диска в оперативную память.</p>
32
<p>Такое хранилище может одновременно работать только с одним контейнером и доступно только в Linux.</p>
32
<p>Такое хранилище может одновременно работать только с одним контейнером и доступно только в Linux.</p>
33
<h2>Общие советы по использованию томов</h2>
33
<h2>Общие советы по использованию томов</h2>
34
<strong>Монтирование в непустые директории</strong><p>Если вы монтируете <em>пустой </em>том в каталог контейнера, где уже есть файлы, то эти файлы не удалятся, а будут скопированы в том. Этим можно пользоваться, когда нужно скопировать данные из одного контейнера в другой.</p>
34
<strong>Монтирование в непустые директории</strong><p>Если вы монтируете <em>пустой </em>том в каталог контейнера, где уже есть файлы, то эти файлы не удалятся, а будут скопированы в том. Этим можно пользоваться, когда нужно скопировать данные из одного контейнера в другой.</p>
35
<p>Если вы монтируете <em>непустой</em> том или каталог с хоста в контейнер, где уже есть файлы, то эти файлы тоже не удалятся, а просто будут скрыты. Видно будет только то, что есть в томе или каталоге на хосте. Похоже на простое монтирование в Linux.</p>
35
<p>Если вы монтируете <em>непустой</em> том или каталог с хоста в контейнер, где уже есть файлы, то эти файлы тоже не удалятся, а просто будут скрыты. Видно будет только то, что есть в томе или каталоге на хосте. Похоже на простое монтирование в Linux.</p>
36
<p><strong>Монтирование служебных файлов</strong></p>
36
<p><strong>Монтирование служебных файлов</strong></p>
37
<p>С хоста можно монтировать любые файлы, в том числе служебные. Например, сокет docker. В результате получится docker-in-docker: один контейнер запустится внутри другого. UPD: (*это не совсем так. <a>mwizard</a> в комментариях пояснил, что в таком случае родительский docker запустит sibling-контейнер). Выглядит как бред, но в некоторых случаях бывает оправдано. Например, при настройке CI/CD.</p>
37
<p>С хоста можно монтировать любые файлы, в том числе служебные. Например, сокет docker. В результате получится docker-in-docker: один контейнер запустится внутри другого. UPD: (*это не совсем так. <a>mwizard</a> в комментариях пояснил, что в таком случае родительский docker запустит sibling-контейнер). Выглядит как бред, но в некоторых случаях бывает оправдано. Например, при настройке CI/CD.</p>
38
<p><strong>Монтирование /var/lib/docker</strong></p>
38
<p><strong>Монтирование /var/lib/docker</strong></p>
39
<p>Разработчики Docker говорят, что не стоит монтировать с хоста каталог /var/lib/docker, так как могут возникнуть проблемы. Однако есть некоторые программы, для запуска которых это необходимо.</p>
39
<p>Разработчики Docker говорят, что не стоит монтировать с хоста каталог /var/lib/docker, так как могут возникнуть проблемы. Однако есть некоторые программы, для запуска которых это необходимо.</p>
40
<h2><strong>Практика: создадим тестовый том</strong></h2>
40
<h2><strong>Практика: создадим тестовый том</strong></h2>
41
Ключ командной строки для Docker при работе с томами.<p>Для volume или bind mount:</p>
41
Ключ командной строки для Docker при работе с томами.<p>Для volume или bind mount:</p>
42
<p><em>--volume | -v</em></p>
42
<p><em>--volume | -v</em></p>
43
<p>Для tmpfs:</p>
43
<p>Для tmpfs:</p>
44
<p><em>--tmpfs</em></p>
44
<p><em>--tmpfs</em></p>
45
<p>Команды для управления томами в интерфейсе CLI Docker:</p>
45
<p>Команды для управления томами в интерфейсе CLI Docker:</p>
46
<p><em>$ docker volume</em></p>
46
<p><em>$ docker volume</em></p>
47
<p><em>Commands:</em><em>create Create a volume (Создать том)</em><em>inspect Display detailed information on one or more</em><em>volumes (Отобразить детальную информацию)</em><em>ls List volumes (Вывести список томов)</em><em>prune Remove all unused volumes (Удалить все неиспользуемые тома)</em><em>rm Remove one or more volumes (Удалить один или несколько томов)</em></p>
47
<p><em>Commands:</em><em>create Create a volume (Создать том)</em><em>inspect Display detailed information on one or more</em><em>volumes (Отобразить детальную информацию)</em><em>ls List volumes (Вывести список томов)</em><em>prune Remove all unused volumes (Удалить все неиспользуемые тома)</em><em>rm Remove one or more volumes (Удалить один или несколько томов)</em></p>
48
<p>Создадим тестовый том:</p>
48
<p>Создадим тестовый том:</p>
49
<p><em>$ docker volume create slurm-storage</em><em>slurm-storage</em></p>
49
<p><em>$ docker volume create slurm-storage</em><em>slurm-storage</em></p>
50
<p>Вот он появился в списке:</p>
50
<p>Вот он появился в списке:</p>
51
<p><em>$ docker volume ls</em><em>DRIVER VOLUME NAME</em><em>local slurm-storage</em></p>
51
<p><em>$ docker volume ls</em><em>DRIVER VOLUME NAME</em><em>local slurm-storage</em></p>
52
<p>Команда inspect выдаст примерно такой список информации в json:</p>
52
<p>Команда inspect выдаст примерно такой список информации в json:</p>
53
<p><em>$ docker inspect slurm-storage</em><em>[</em><em>{</em><em>"CreatedAt": "2020-12-14T15:00:37Z",</em><em>"Driver": "local",</em><em>"Labels": {},</em><em>"Mountpoint": "/var/lib/docker/volumes/slurm-storage/_data",</em><em>"Name": "slurm-storage",</em><em>"Options": {},</em><em>"Scope": "local"</em><em>}</em><em>]</em></p>
53
<p><em>$ docker inspect slurm-storage</em><em>[</em><em>{</em><em>"CreatedAt": "2020-12-14T15:00:37Z",</em><em>"Driver": "local",</em><em>"Labels": {},</em><em>"Mountpoint": "/var/lib/docker/volumes/slurm-storage/_data",</em><em>"Name": "slurm-storage",</em><em>"Options": {},</em><em>"Scope": "local"</em><em>}</em><em>]</em></p>
54
<p>Попробуем использовать созданный том, запустим с ним контейнер:</p>
54
<p>Попробуем использовать созданный том, запустим с ним контейнер:</p>
55
<p><em>$ docker run --rm -v slurm-storage:/data -it ubuntu:20.10 /bin/bash</em><em># echo $RANDOM > /data/file</em><em># cat /data/file</em><em>13279</em><em># exit</em></p>
55
<p><em>$ docker run --rm -v slurm-storage:/data -it ubuntu:20.10 /bin/bash</em><em># echo $RANDOM > /data/file</em><em># cat /data/file</em><em>13279</em><em># exit</em></p>
56
<p>После самоуничтожения контейнера запустим другой и подключим к нему тот же том. Проверяем, что в нашем файле:</p>
56
<p>После самоуничтожения контейнера запустим другой и подключим к нему тот же том. Проверяем, что в нашем файле:</p>
57
<p><em>$ docker run --rm -v slurm-storage:/data -it centos:8 /bin/bash -c "cat /data/file"</em><em>13279</em></p>
57
<p><em>$ docker run --rm -v slurm-storage:/data -it centos:8 /bin/bash -c "cat /data/file"</em><em>13279</em></p>
58
<p>То же самое, отлично.</p>
58
<p>То же самое, отлично.</p>
59
<p>Теперь примонтируем каталог с хоста:</p>
59
<p>Теперь примонтируем каталог с хоста:</p>
60
<p><em>$ docker run -v /srv:/host/srv --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
60
<p><em>$ docker run -v /srv:/host/srv --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
61
<p>Docker не любит относительные пути, лучше указывайте абсолютные!</p>
61
<p>Docker не любит относительные пути, лучше указывайте абсолютные!</p>
62
<p>Теперь попробуем совместить оба типа томов сразу:</p>
62
<p>Теперь попробуем совместить оба типа томов сразу:</p>
63
<p><em>$ docker run -v /srv:/host/srv -v slurm-storage:/data --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
63
<p><em>$ docker run -v /srv:/host/srv -v slurm-storage:/data --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
64
<p>Отлично! А если нам нужно передать ровно те же тома другому контейнеру?</p>
64
<p>Отлично! А если нам нужно передать ровно те же тома другому контейнеру?</p>
65
<p><em>$ docker run --volumes-from slurm --name backup --rm -it centos:8 /bin/bash</em></p>
65
<p><em>$ docker run --volumes-from slurm --name backup --rm -it centos:8 /bin/bash</em></p>
66
<p>Вы можете заметить некий лаг в обновлении данных между контейнерами, это зависит от используемого Docker драйвера файловой системы.</p>
66
<p>Вы можете заметить некий лаг в обновлении данных между контейнерами, это зависит от используемого Docker драйвера файловой системы.</p>
67
<p>Создавать том заранее необязательно, всё сработает в момент запуска docker run:</p>
67
<p>Создавать том заранее необязательно, всё сработает в момент запуска docker run:</p>
68
<p><em>$ docker run -v newslurm:/newdata -v /srv:/host/srv -v slurm-storage:/data --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
68
<p><em>$ docker run -v newslurm:/newdata -v /srv:/host/srv -v slurm-storage:/data --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
69
<p>Посмотрим теперь на список томов:</p>
69
<p>Посмотрим теперь на список томов:</p>
70
<p><em>$ docker volume ls</em><em>DRIVER VOLUME NAME</em><em>local slurm-storage</em><em>local newslurm</em></p>
70
<p><em>$ docker volume ls</em><em>DRIVER VOLUME NAME</em><em>local slurm-storage</em><em>local newslurm</em></p>
71
<p>Ещё немного усложним команду запуска, создадим анонимный том:</p>
71
<p>Ещё немного усложним команду запуска, создадим анонимный том:</p>
72
<p><em>$ docker run -v /anonymous -v newslurm:/newdata -v /srv:/host/srv -v slurm-storage:/data --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
72
<p><em>$ docker run -v /anonymous -v newslurm:/newdata -v /srv:/host/srv -v slurm-storage:/data --name slurm --rm -it ubuntu:20.10 /bin/bash</em></p>
73
<p>Такой том самоуничтожится после выхода из контейнера, так как мы указали ключ -rm.</p>
73
<p>Такой том самоуничтожится после выхода из контейнера, так как мы указали ключ -rm.</p>
74
<p>Если этого не сделать, давайте проверим что будет:</p>
74
<p>Если этого не сделать, давайте проверим что будет:</p>
75
<p><em>$ docker run -v /anonymous -v newslurm:/newdata -v /srv:/host/srv -v slurm-storage:/data --name slurm -it ubuntu:20.10 /bin/bash</em><em>$ docker volume ls</em><em>DRIVER VOLUME NAME</em><em>local 04c490b16184bf71015f7714b423a517ce9599e9360af07421ceb54ab96bd333</em><em>local newslurm</em><em>local slurm-storage</em></p>
75
<p><em>$ docker run -v /anonymous -v newslurm:/newdata -v /srv:/host/srv -v slurm-storage:/data --name slurm -it ubuntu:20.10 /bin/bash</em><em>$ docker volume ls</em><em>DRIVER VOLUME NAME</em><em>local 04c490b16184bf71015f7714b423a517ce9599e9360af07421ceb54ab96bd333</em><em>local newslurm</em><em>local slurm-storage</em></p>
76
<p><em>Хозяйке на заметку:</em> тома (как образы и контейнеры) ограничены значением настройки dm.basesize, которая устанавливается на уровне настроек демона Docker. Как правило, что-то около 10Gb. Это значение можно изменить вручную, но потребуется перезапуск демона Docker.</p>
76
<p><em>Хозяйке на заметку:</em> тома (как образы и контейнеры) ограничены значением настройки dm.basesize, которая устанавливается на уровне настроек демона Docker. Как правило, что-то около 10Gb. Это значение можно изменить вручную, но потребуется перезапуск демона Docker.</p>
77
<p>При запуске демона с ключом это выглядит так:</p>
77
<p>При запуске демона с ключом это выглядит так:</p>
78
<p><em>$ sudo dockerd --storage-opt dm.basesize=40G</em></p>
78
<p><em>$ sudo dockerd --storage-opt dm.basesize=40G</em></p>
79
<p>Однажды увеличив значение, его уже нельзя просто так уменьшить. При запуске Docker выдаст ошибку.</p>
79
<p>Однажды увеличив значение, его уже нельзя просто так уменьшить. При запуске Docker выдаст ошибку.</p>
80
<p>Если вам нужно вручную очистить содержимое всех томов, придётся удалять каталог, предварительно остановив демон:</p>
80
<p>Если вам нужно вручную очистить содержимое всех томов, придётся удалять каталог, предварительно остановив демон:</p>
81
<p><em>$ sudo service docker stop</em><em>$ sudo rm -rf /var/lib/docker</em></p>
81
<p><em>$ sudo service docker stop</em><em>$ sudo rm -rf /var/lib/docker</em></p>
82
<h2>Может быть интересно:</h2>
82
<h2>Может быть интересно:</h2>
83
<ul><li><a>Интенсив по Python для инженеров и разработчиков</a></li>
83
<ul><li><a>Интенсив по Python для инженеров и разработчиков</a></li>
84
<li><a>Курс по GoLang для инженеров</a></li>
84
<li><a>Курс по GoLang для инженеров</a></li>
85
</ul><p>Александр Швалов, практикующий инженер Southbridge, Certified Kubernetes Administrator, автор и разр</p>
85
</ul><p>Александр Швалов, практикующий инженер Southbridge, Certified Kubernetes Administrator, автор и разр</p>
86
86