HTML Diff
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 &gt; /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 &gt; /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