JavaRush /Курсы /Модуль 2: Fullstack /Монтирование томов и сетей

Монтирование томов и сетей

Модуль 2: Fullstack
14 уровень , 6 лекция
Открыта

7.1 Монтирование томов

Монтирование томов и сетей в Docker Compose позволяет создавать гибкие и эффективные многоконтейнерные приложения. Тома (volumes) используются для хранения данных, которые должны сохраняться вне контейнеров, в то время как сети (networks) обеспечивают взаимодействие между контейнерами. В этой лекции мы подробно рассмотрим, как использовать тома и сети в Docker Compose.

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

Типы томов:

  • Именованные тома (Named Volumes): управляются Docker и сохраняются в специальной директории на хосте.
  • Привязанные тома (Bind Mounts): монтируются в контейнер из указанной директории на хосте.

Задание томов в Docker Compose

Пример именованных томов

В этом примере создан именованный том postgres-data, который монтируется в директорию /var/lib/postgresql/data внутри контейнера db.

Yaml

version: '3.8'

services:
  db:
    image: postgres:latest
    volumes:
      - postgres-data:/var/lib/postgresql/data

volumes:
  postgres-data:

Пример привязанных томов

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

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
<

7.2 Монтирование сетей

Сети в Docker Compose позволяют контейнерам взаимодействовать друг с другом. Каждый контейнер может быть подключён к одной или нескольким сетям, что обеспечивает изоляцию и управление трафиком.

Типы сетей:

  • Мостовые сети (Bridge): по умолчанию контейнеры подключаются к мостовой сети, которая обеспечивает их взаимодействие на одном хосте.
  • Оверлейные сети (Overlay): используются для взаимодействия контейнеров, запущенных на разных хостах в кластере Docker Swarm.
  • Сетевые плагины (Network Plugins): позволяют использовать сторонние сетевые драйверы для более сложных конфигураций.

Пример создания и использования пользовательских сетей

В этом примере создаются две пользовательские сети front-end и back-end. Сервис app подключён к обеим сетям, сервис web только к front-end, а сервис db только к back-end.

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    networks:
      - front-end

  app:
    image: myapp:latest
    networks:
      - front-end
      - back-end

  db:
    image: postgres:latest
    networks:
      - back-end

networks:
  front-end:
  back-end:

Практические советы:

  1. Использование именованных томов: именованные тома управляются Docker и обеспечивают простоту использования и управления данными. Именованные тома можно подключать к нескольким сервисам одновременно. Например, сервис бекенда записывает логи, а мониторинг-сервис анализирует их и уведомляет при обнаружении ошибок уровня error.
  2. Разделение сетей: использование нескольких сетей позволяет изолировать различные части приложения и контролировать их взаимодействие.
  3. Хранение конфигурационных файлов: используйте привязанные тома для монтирования конфигурационных файлов, что позволяет легко изменять конфигурацию без пересборки образов.
  4. Безопасность сетей: ограничьте доступ к сетям, чтобы только необходимые контейнеры могли взаимодействовать, что повышает безопасность приложения.

7.3 Примеры использования томов и сетей

Примеры использования томов и сетей в Docker Compose:

Пример 1: Приложение с веб-сервером и базой данных

Yaml

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    networks:
      - webnet

  db:
    image: postgres:latest
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
      POSTGRES_DB: mydb
    volumes:
      - db-data:/var/lib/postgresql/data
    networks:
      - webnet

volumes:
  db-data:

networks:
  webnet:

В этом примере:

  • Веб-сервер nginx и база данных PostgreSQL подключены к одной сети webnet, что позволяет им взаимодействовать. Если сеть одна, её можно не указывать — будет создана дефолтная сеть.
  • Данные базы данных хранятся в именованном томе db-data, что обеспечивает их сохранность при перезапуске контейнеров.

Пример 2: Приложение с несколькими уровнями

Yaml

version: '3.8'

services:
  frontend:
    image: myfrontend:latest
    networks:
      - front-tier
      - back-tier

  backend:
    image: mybackend:latest
    networks:
      - back-tier
    volumes:
      - backend-data:/var/lib/backend

  database:
    image: mysql:latest
    environment:
      MYSQL_ROOT_PASSWORD: example
    volumes:
      - db-data:/var/lib/mysql
    networks:
      - back-tier

volumes:
  backend-data:
  db-data:

networks:
  front-tier:
  back-tier:

В этом примере:

  • Созданы две сети: front-tier и back-tier.
  • Сервис frontend подключён к обеим сетям, что позволяет ему взаимодействовать как с backend, так и с внешними клиентами.
  • Сервисы backend и database подключены только к сети back-tier для обеспечения их изоляции и взаимодействия.
  • Данные сервисов backend и database хранятся в отдельных именованных томах backend-data и db-data.
3
Задача
Модуль 2: Fullstack, 14 уровень, 6 лекция
Недоступна
Монтирование именованного тома
Монтирование именованного тома
3
Задача
Модуль 2: Fullstack, 14 уровень, 6 лекция
Недоступна
Привязанный том для Nginx
Привязанный том для Nginx
3
Задача
Модуль 2: Fullstack, 14 уровень, 6 лекция
Недоступна
Сети для взаимодействия сервисов
Сети для взаимодействия сервисов
3
Задача
Модуль 2: Fullstack, 14 уровень, 6 лекция
Недоступна
Монтирование данных с привязанным и именованным томом
Монтирование данных с привязанным и именованным томом
Комментарии (1)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Slevin Уровень 1
8 октября 2025
Я в восторге от заданий(нет) которые требуют указать определенный путь, версию и т.п. - БЕЗ УКАЗАНИЯ В УСЛОВИИ, ЧТО ЭТО ЗА ПУТЬ!