
Цель урока: Понять, почему контейнеры "забывают" данные при удалении, и научиться использовать Volumes (Тома), чтобы сохранять файлы (сайты, базы данных) на жестком диске вашего сервера, даже если контейнер уничтожен.
Мы работаем от имени root.
Часть 1: Демонстрация проблемы (Амнезия контейнера)
Давайте убедимся, что проблема реальна.
-
Очистка территории
Удалим всё старое, чтобы не мешало.docker rm -f $(docker ps -aq) -
Запускаем простой контейнер
Запустим Alpine (крошечный Linux) и зайдем внутрь него (флаг -it делает консоль интерактивной).docker run -it --name test-container alpine sh -
Создаем важный файл
Теперь вы внутри контейнера (видите значок #). Создадим файл:echo "Очень важные данные" > /important.txt cat /important.txtВывод: Очень важные данные. Файл существует.
-
Выходим и удаляем контейнер
Нажмите Ctrl + D (или наберите exit), чтобы выйти.
Теперь удалим контейнер:docker rm test-container -
Запускаем снова и ищем файл
docker run -it --name test-container alpine sh cat /important.txtРезультат: cat: can't open '/important.txt': No such file or directory.
Вывод: Контейнеры эфемерны (временны). Удалил контейнер - потерял данные. Для базы данных или работающего сайта это катастрофа.
(Нажмите exit, чтобы выйти из контейнера).
Часть 2: Решение - Bind Mounts (Проброс папок)
Чтобы данные выжили, мы должны хранить их не в контейнере, а на нашем сервере (хосте), а контейнеру просто давать к ним доступ. Это как подключить флешку.
Мы будем использовать механизм Bind Mount. Мы скажем Докеру:
"Возьми папку /root/mysite на моем сервере и покажи её внутри контейнера по адресу /usr/share/nginx/html".
Шаг 1: Создаем папку на сервере
Мы находимся в системе (не в докере).
mkdir -p /root/mysite
Шаг 2: Создаем файл index.html на сервере
nano /root/mysite/index.html
Впишите текст:
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Тест Docker Volume</title>
</head>
<body>
<h1>Этот файл лежит на моем сервере!</h1>
<p>Контейнер просто отображает его.</p>
</body>
</html>
Сохраните (Ctrl+O, Enter) и выйдите (Ctrl+X).
Шаг 3: Запускаем Nginx с пробросом тома (Volume)
Внимательно с командой, здесь появился флаг -v.
docker run -d -p 80:80 --name nginx-volume -v /root/mysite:/usr/share/nginx/html nginx
Разбор флага -v (Volume):
-
-v /root/mysite:/usr/share/nginx/html
-
До двоеточия (/root/mysite): Путь на вашем реальном сервере (откуда брать).
-
После двоеточия (/usr/share/nginx/html): Путь внутри контейнера (куда класть). Это стандартная папка, где Nginx ищет сайт.
Шаг 4: Проверка
Откройте браузер: http://ВАШ_IP_АДРЕС.
Вы увидите: "Этот файл лежит на моем сервере!".

Часть 3: Магия живого редактирования
Теперь самое интересное. Мы изменили подход к работе.
В Уроке 62 мы "запекали" сайт внутрь образа. Чтобы обновить сайт, нам нужно было пересобирать образ (docker build).
Теперь файлы лежат у нас под ногами, в /root/mysite.
Задание:
Отредактируйте файл на сервере, не трогая контейнер.
nano /root/mysite/index.html
Поменяйте текст на:
<h1>Я изменил это через Nano на сервере, и Nginx подхватил!</h1>
Сохраните и обновите страницу в браузере.
Результат: Текст изменился мгновенно!
Почему это круто:
Вы можете разрабатывать код, править конфиги и смотреть логи, используя привычные инструменты сервера, а Docker просто исполняет этот код.
Часть 4: Проверка на "бессмертие"
Давайте уничтожим контейнер и проверим, выживут ли файлы.
-
Удаляем контейнер Nginx:
docker rm -f nginx-volume(Сайт перестал работать).
-
Проверяем папку на сервере:
ls -l /root/mysite/ cat /root/mysite/index.htmlФайл на месте!
-
Запускаем новый контейнер с той же папкой:
docker run -d -p 80:80 --name nginx-new -v /root/mysite:/usr/share/nginx/html nginxОбновите браузер. Сайт снова работает, данные сохранились.
Это и есть принцип работы Баз Данных в Docker. Мы храним файлы базы (/var/lib/mysql) в примонтированной папке на сервере. Если контейнер с MySQL упадет, мы просто поднимем новый, подключим ту же папку, и база будет цела.
Часть 5: Коротко о Сетях (Networks)
В названии урока есть "Сети". Давайте разберем базу.
Когда вы запускаете контейнеры, они по умолчанию подключаются к виртуальной сети Bridge.
У каждого контейнера есть свой внутренний IP-адрес (например, 172.17.0.2).
Как узнать IP контейнера?
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-new
Но вам не нужно запоминать эти IP-адреса.
Docker устроен так, что контейнеры могут общаться друг с другом по именам, если они находятся в одной пользовательской сети.
Пример (теория):
Если у вас есть контейнер php и контейнер mysql, то скрипт PHP будет подключаться к базе не по IP 172.17.0.3, а просто по хосту mysql. Docker сам переведет имя в IP (встроенный DNS).
Мы детально разберем автоматическое создание сетей и общение контейнеров в следующем уроке, когда будем запускать несколько контейнеров сразу.
Итоги урока
Сегодня вы решили главную проблему контейнеризации - сохранение данных.
-
Контейнеры не хранят данные вечно. Удалил контейнер - удалил файлы.
-
Volumes (Тома) / Bind Mounts позволяют подключить папку сервера внутрь контейнера.
-
Схема работы: Данные лежат на сервере (безопасно), Процесс работает в контейнере (изолированно).
-
Это позволяет обновлять версии программ (удалять старый контейнер и ставить новый), не теряя пользовательские данные.
Теперь вы готовы к Уроку 64. Там мы возьмем всё, что выучили (образы, порты, тома, сети), и перестанем писать длинные команды docker run -d -p -v ....
Мы освоим Docker Compose - инструмент, который позволяет описать архитектуру целого проекта в одном файле и запускать его одной командой.
Перейти к просмотру - УРОК №64.
Промо-код: PROMO15 - скидка 15%!
Введите при оформлении первого заказа на сайте: Hosting-VDS.com

