Цель урока: Понять, почему контейнеры "забывают" данные при удалении, и научиться использовать Volumes (Тома), чтобы сохранять файлы (сайты, базы данных) на жестком диске вашего сервера, даже если контейнер уничтожен.

Мы работаем от имени root.

Часть 1: Демонстрация проблемы (Амнезия контейнера)

Давайте убедимся, что проблема реальна.

  1. Очистка территории
    Удалим всё старое, чтобы не мешало.

    docker rm -f $(docker ps -aq)
  2. Запускаем простой контейнер
    Запустим Alpine (крошечный Linux) и зайдем внутрь него (флаг -it делает консоль интерактивной).

    docker run -it --name test-container alpine sh
  3. Создаем важный файл
    Теперь вы внутри контейнера (видите значок #). Создадим файл:

    echo "Очень важные данные" > /important.txt
    cat /important.txt

    Вывод: Очень важные данные. Файл существует.

  4. Выходим и удаляем контейнер
    Нажмите Ctrl + D (или наберите exit), чтобы выйти.
    Теперь удалим контейнер:

    docker rm test-container
  5. Запускаем снова и ищем файл

    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+OEnter) и выйдите (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: Проверка на "бессмертие"

Давайте уничтожим контейнер и проверим, выживут ли файлы.

  1. Удаляем контейнер Nginx:

    docker rm -f nginx-volume

    (Сайт перестал работать).

  2. Проверяем папку на сервере:

    ls -l /root/mysite/
    cat /root/mysite/index.html

    Файл на месте!

  3. Запускаем новый контейнер с той же папкой:

    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).

Мы детально разберем автоматическое создание сетей и общение контейнеров в следующем уроке, когда будем запускать несколько контейнеров сразу.

Итоги урока

Сегодня вы решили главную проблему контейнеризации - сохранение данных.

  1. Контейнеры не хранят данные вечно. Удалил контейнер - удалил файлы.

  2. Volumes (Тома) / Bind Mounts позволяют подключить папку сервера внутрь контейнера.

  3. Схема работы: Данные лежат на сервере (безопасно), Процесс работает в контейнере (изолированно).

  4. Это позволяет обновлять версии программ (удалять старый контейнер и ставить новый), не теряя пользовательские данные.

Теперь вы готовы к Уроку 64. Там мы возьмем всё, что выучили (образы, порты, тома, сети), и перестанем писать длинные команды docker run -d -p -v ....
Мы освоим Docker Compose - инструмент, который позволяет описать архитектуру целого проекта в одном файле и запускать его одной командой.

Перейти к просмотру - УРОК №64.

подарок Промо-код: PROMO15 - скидка 15%! огонь

Введите при оформлении первого заказа на сайте: Hosting-VDS.com

авторское право цифровые решения

Помог ли вам данный ответ? 0 Пользователи считают это полезным (0 голосов)