Контейнеры облегчают жизнь разработчика и повышают эффективность его работы. При этом одно из самых популярных решений контейнеризации — Docker.
Контейнеры Docker по своей природе неизменяемы. Это означает, что при перезапуске контейнера все данные, сохраненные в нем, сотрутся. Но сохранить эти данные можно. Для этого Docker предоставляет возможность подключения к контейнеру локальных директорий.
В этом руководстве мы рассмотрим два способа подключения и использования локальных папок в Docker. Знание обоих путей позволит вам более эффективно использовать контейнеры в разных ситуациях.
Как подключить локальную директорию при помощи docker run -v
Команда docker run
сперва создает доступный для записи слой контейнера поверх указанного образа, а затем запускает его с использованием указанной команды (Источник — docker.com).
Параметр -v
или --volume
(англ. volume — «том») позволяет монтировать локальные директории и файлы к контейнеру. Например, вы можете запустить базу данных MySQL и примонтировать директорию для хранения в ней настоящих данных.
# запустить контейнер mysql в фоне $ docker run --name mysql-db -v $(pwd)/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:8.0.28-debian # показать содержимое директории datadir $ ls -la datadir total 383848 -rw-r----- 1 sebarthel staff 196608 Mar 26 22:47 #ib_16384_0.dblwr -rw-r----- 1 sebarthel staff 8585216 Mar 26 22:47 #ib_16384_1.dblwr drwxr-x--- 12 sebarthel staff 384 Mar 26 22:47 #innodb_temp drwxr-xr-x@ 27 sebarthel staff 864 Mar 26 22:47 . drwxr-xr-x 3 sebarthel staff 96 Mar 26 22:47 .. -rw-r----- 1 sebarthel staff 56 Mar 26 22:47 auto.cnf -rw-r----- 1 sebarthel staff 913 Mar 26 22:47 binlog.000001 (more directories) # остановить контейнер mysql docker rm -f mysql-db
Подключение директории означает двустороннюю синхронизацию. Любой файл, измененный на хосте, изменится и в контейнере, а любой файл, измененный в контейнере, изменится и на хосте. Таким образом, если вы остановите и заново запустите базу данных, вы сможете примонтировать ту же директорию, и вам будут доступны ваши настройки и сохраненные данные.
Преимущество этого метода в том, что он прост и легок в использовании. Монтируйте локальные директории при помощи docker run -v
тогда, когда планируете просматривать и изменять файлы на хосте. Например, это подходит для файлов конфигурации и логов.
Как сохранять изменения при помощи томов Docker
Для сохранения изменений можно монтировать не локальную директорию, а том Docker.
Том Docker — это директория где-то в вашей папке-хранилище Docker, которую можно примонтировать к одному или нескольким контейнерам. Тома управляются Docker и не зависят от специфики операционной системы.
Давайте создадим том Docker и подключим его для сохранения данных MySQL.
# создать том (volume) docker volume create mysql-data # запустить контейнер mysql в фоне $ docker run --name mysql-db -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:latest # остановить контейнер mysql docker rm -f mysql-db # удалить том docker volume remove mysql-data
Перед удалением тома Docker вы можете открыть ваш Docker GUI и просмотреть том, кликнув на вкладку data.
Вы видите эти файлы, но они изолированы в томе Docker.
Этот способ сохранения данных рекомендуется для случаев, когда вам не нужно заглядывать в файлы или изменять их на вашем хосте. По сравнению с привязыванием локальной директории привязывание тома более производительно.
Итоги
Контейнеры Docker становятся куда более полезными, если вы умеете сохранять ваши данные и не теряете их при остановке контейнера.
Вы можете привязывать локальные директории и тома к контейнеру при помощи параметра -v
для команды docker run
. При этом вам придется указать абсолютный путь к локальной папке или имя тома и примонтировать их к директории внутри контейнера -v <source>:<target>
.
От редакции Techrocks. Если вам интересна эта тема, можем порекомендовать хорошее видео. В нем разбирается подключение директории с помощью флага -v
(как в этой статье), а также с помощью флага --mount
.
Перевод статьи «Docker Mount Volume – How To Mount a Local Directory».
[customscript]techrocks_custom_after_post_html[/customscript]
[customscript]techrocks_custom_script[/customscript]