Скрипт обработал файл и записал результат в /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 может измениться.
Попробуйте в учебном терминале
Сохраните файл в томе, подключите готовый CSV только для чтения и соберите общую сеть базы с клиентом. Проверка смотрит содержимое файлов и настройки подключений. Реального сетевого соединения в песочнице нет.
Здесь команды Docker имитируются: терминал хранит учебное состояние образов, контейнеров и файлов. Реальные службы и внешнюю сеть он не запускает.
- 1. Создайте том results, запишите result.txt со строкой rows=3 из одноразового контейнера. Подключите тот же том к работающему reader в /data.
- 2. Запустите input-reader с alpine:3.21 и sleep 3600. Подключите /home/de/inputs к /input только для чтения.
- 3. Создайте bridge-сеть data-net. Запустите в ней db-net из postgres:17 с учебным паролем и client-net из alpine:3.21 с sleep 3600. Опубликуйте порт базы 15432:5432.