deшка
Урок 5.5

Данные и сеть: тома, каталоги и порты

Сохраняем результат отдельно от контейнера и настраиваем путь подключения.

Скрипт обработал файл и записал результат в /data/result.txt. Если /data относится к слою контейнера, удаление экземпляра удалит и результат. Чтобы данные жили дольше программы, каталог подключают отдельно.

Файл в слое экземпляра исчезает при удалении; именованный том и папка компьютера имеют отдельный срок жизни.

Именованный том

Volume — хранилище, которым управляет Docker. Программа видит подключённый том как обычный каталог. Один экземпляр может записать в него данные, другой позже прочитать:

docker volume create demo-results
docker run --rm --mount type=volume,source=demo-results,target=/data alpine:3.21 sh -c 'printf rows=3 > /data/result.txt'
docker run --rm --mount type=volume,source=demo-results,target=/data alpine:3.21 cat /data/result.txt

Первый запуск создал файл и завершился, второй вывел rows=3. Оба контейнера удалены через --rm, но том demo-results существует. source задаёт имя тома, target — путь внутри контейнера.

Для PostgreSQL 17 такой том подключают к /var/lib/postgresql/data: именно там база хранит файлы. При замене контейнера прежний том подключают снова. На Docker Desktop том находится в его Linux-окружении. Для переноса базы на другой компьютер создают согласованную резервную копию средствами PostgreSQL.

docker volume rm demo-results удалит том вместе с содержимым, если на него больше не ссылаются контейнеры. Том защищает данные от пересоздания контейнера; резервная копия защищает от ошибочной записи или потери самого хранилища.

Папка компьютера: bind mount

Bind mount связывает конкретный путь хоста с путём контейнера. Это удобно для входного CSV и редактируемого кода. В Bash на Linux, macOS или в WSL:

mkdir -p inputs
printf 'value\n7\n' > inputs/source.csv
docker run --rm --mount "type=bind,source=$(pwd)/inputs,target=/input,readonly" alpine:3.21 cat /input/source.csv

Контейнер прочитает две строки исходного файла. Путь /input/source.csv внутри соответствует inputs/source.csv на компьютере. readonly разрешает читать файл и запрещает запись через это подключение. Без него изменения из контейнера меняют файлы хоста.

В примере $(pwd) подставляет абсолютный путь текущей папки. В учебном терминале ниже файлы уже лежат в /home/de/inputs, поэтому в заданиях используется этот готовый путь. Подключение поверх каталога временно скрывает файлы, которые были в этом месте образа.

Два адреса PostgreSQL

Приложение на компьютере и приложение в соседнем контейнере идут к базе разными путями. Сначала создадим общую сеть и запустим PostgreSQL:

docker network create demo-net
docker run -d --name demo-db --network demo-net -p 127.0.0.1:15432:5432 -e POSTGRES_PASSWORD=study-only-password postgres:17

-p публикует порт: 15432 принадлежит хосту, 5432 — серверу внутри контейнера. SQL-клиент на компьютере подключается к localhost:15432. Адрес 127.0.0.1 ограничивает доступ локальным интерфейсом; запись без него обычно публикует порт на всех интерфейсах.

Клиент на компьютере обращается к опубликованному порту; контейнер в общей сети — к имени службы и её внутреннему порту.

Соседнему контейнеру в demo-net нужен адрес demo-db:5432. Имена разрешаются внутри пользовательской сети Docker. localhost в этом контейнере означает его собственное окружение, а не компьютер и не базу. Если к базе обращаются только соседи, внешний порт можно не публиковать.

В Compose такой сетью обычно становится сеть проекта, а адресом базы — имя сервиса, например db:5432. Это остаётся удобным и после пересоздания контейнера, когда его IP может измениться.

1. Контейнер базы удалили, затем подключили тот же именованный том к новому. Что ожидается?
2. Python в соседнем сервисе Compose должен подключиться к db. Какой адрес нужен в нашей лаборатории?

Попробуйте в учебном терминале

Сохраните файл в томе, подключите готовый CSV только для чтения и соберите общую сеть базы с клиентом. Проверка смотрит содержимое файлов и настройки подключений. Реального сетевого соединения в песочнице нет.

Здесь команды Docker имитируются: терминал хранит учебное состояние образов, контейнеров и файлов. Реальные службы и внешнюю сеть он не запускает.

учебный терминалзадания 0 / 3
Введите команду. Подсказка: help покажет, что умеет этот терминал.
de@deshka:~$
ЗАДАНИЯ
  1. 1. Создайте том results, запишите result.txt со строкой rows=3 из одноразового контейнера. Подключите тот же том к работающему reader в /data.
  2. 2. Запустите input-reader с alpine:3.21 и sleep 3600. Подключите /home/de/inputs к /input только для чтения.
  3. 3. Создайте bridge-сеть data-net. Запустите в ней db-net из postgres:17 с учебным паролем и client-net из alpine:3.21 с sleep 3600. Опубликуйте порт базы 15432:5432.
решённые задания сохранятся в прогресс после входа
Войти, чтобы отмечатьдальше →
5.6 →Compose: окружение из файла