Найти в Дзене
КУЗИНОБИТ

Урок 4: Работа с данными и томами (Volumes) в Docker.

В предыдущих уроках мы познакомились с основами Docker, научились работать с образами и контейнерами. Теперь пришло время разобраться, как Docker работает с данными и как обеспечить их сохранность между перезапусками контейнеров. В этом уроке мы рассмотрим тома (Volumes), их использование и преимущества. По умолчанию данные внутри контейнера хранятся в его файловой системе. Однако при удалении контейнера все данные будут потеряны. Тома позволяют: Создание тома: docker volume create myvolume Просмотр списка томов: docker volume ls Удаление тома: docker volume rm myvolume При запуске контейнера вы можете подключить том с помощью флага -v: docker run -d -v myvolume:/data --name mycontainer myimage В этом примере том myvolume будет подключён к директории /data внутри контейнера. Предположим, нам нужно запустить базу данных MySQL в Docker и сохранить данные между перезапусками контейнера. Шаг 1: Создаём том для данных MySQL. docker volume create mysql-data Шаг 2: Запускаем контейнер MyS
Оглавление

В предыдущих уроках мы познакомились с основами Docker, научились работать с образами и контейнерами. Теперь пришло время разобраться, как Docker работает с данными и как обеспечить их сохранность между перезапусками контейнеров. В этом уроке мы рассмотрим тома (Volumes), их использование и преимущества.

Зачем нужны тома?

По умолчанию данные внутри контейнера хранятся в его файловой системе. Однако при удалении контейнера все данные будут потеряны. Тома позволяют:

  • Сохранять данные между перезапусками и удалениями контейнеров.
  • Обмениваться данными между контейнером и хост-машиной.
  • Управлять данными более гибко и эффективно.

Типы томов.

  1. Тома (Volumes): Управляются Docker и хранятся в специальном месте на хост-машине (например, /var/lib/docker/volumes/ на Linux). Это предпочтительный способ постоянного хранения данных в Docker.
  2. Привязанные тома (Bind mounts): Привязывают определённую директорию или файл на хост-машине к контейнеру. Используются, когда необходимо работать с существующими данными на хосте.

Создание и использование томов.

Создание тома:

docker volume create myvolume

Просмотр списка томов:

docker volume ls

Удаление тома:

docker volume rm myvolume

Подключение тома к контейнеру.

При запуске контейнера вы можете подключить том с помощью флага -v:

docker run -d -v myvolume:/data --name mycontainer myimage

В этом примере том myvolume будет подключён к директории /data внутри контейнера.

Пример: Запуск MySQL с использованием тома.

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

Шаг 1: Создаём том для данных MySQL.

docker volume create mysql-data

Шаг 2: Запускаем контейнер MySQL с подключённым томом.

docker run -d --name mymysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -v mysql-data:/var/lib/mysql mysql

Теперь данные базы данных будут сохраняться в томе mysql-data, и вы не потеряете их при перезапуске или удалении контейнера.

Использование привязанных томов (Bind mounts).

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

Пример: Подключение локальной директории с конфигурацией Nginx

docker run -d --name mynginx -p 8080:80 -v /path/to/your/nginx.conf:/etc/nginx/nginx.conf nginx

В этом примере локальный файл nginx.conf будет использоваться контейнером вместо стандартного конфигурационного файла.

Просмотр данных в томе.

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

Пример: Просмотр содержимого тома mysql-data

docker run --rm -it -v mysql-data:/data alpine sh

Теперь вы находитесь в терминале Alpine Linux с доступом к данным в /data.

Удаление томов.

Будьте осторожны при удалении томов, так как это действие необратимо и приведёт к потере данных.

Удаление тома:

docker volume rm mysql-data

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

docker volume prune

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

Домашнее задание.

Задание 1: Запуск MySQL с сохранением данных.

1. Создайте том mysql-data для хранения данных MySQL.

2. Запустите контейнер MySQL с подключённым томом и установите пароль для пользователя root.

3. Подключитесь к базе данных из контейнера с помощью docker exec и создайте новую таблицу.

4. Остановите и удалите контейнер mymysql.

5. Запустите новый контейнер MySQL с тем же томом mysql-data.

6. Подключитесь к базе данных и убедитесь, что данные сохранились.

Задание 2: Использование привязанного тома для разработки.

1. Создайте локальную директорию /path/to/webapp и поместите туда файл index.html с любым содержимым.

2. Запустите контейнер Nginx, подключив локальную директорию к /usr/share/nginx/html внутри контейнера.

3. Откройте http://localhost:8080 в браузере и убедитесь, что видите содержимое вашего index.html.

4. Измените index.html на хост-машине и обновите страницу в браузере. Убедитесь, что изменения сразу отобразились.

Задание 3*: Создание и использование нескольких томов.

1. Создайте два тома app-data и app-logs.

2. Запустите контейнер (используйте образ по вашему выбору), подключив оба тома к разным директориям внутри контейнера.

3. Внутри контейнера создайте файлы в директориях /app/data и /app/logs. Убедитесь, что данные сохраняются между перезапусками контейнера.

Что дальше?

В следующем уроке я расскажу о работе с сетью (Network) в Docker. Вы узнаете, как Docker управляет сетевыми взаимодействиями, как контейнеры общаются между собой и с внешним миром, и как создавать собственные сети для контейнеров.