Перейти к основному содержимому
Вернуться в категорию

Управление Docker Volume и сетями: Постоянное хранилище и сетевая конфигурация

Типы Docker volume (named, bind mount, tmpfs), управление volumes, режимы Docker-сетей (bridge, host, overlay), создание пользовательских сетей и взаимодействие контейнеров. Полное руководство.

Время чтения: 16 dk Контейнеры и оркестрация
dockervolumeсетьконтейнерхранилищеbridgeoverlay

Содержание

Управление Docker Volume и сетями

Docker-контейнеры по умолчанию эфемерны — при удалении контейнера его данные тоже теряются. Volumes решают эту проблему и обеспечивают сохранность данных независимо от жизненного цикла контейнера. Docker-сети управляют взаимодействием между контейнерами и с внешним миром.

Типы Docker Volume

ТипОписаниеСлучай использования
Named VolumeУправляется DockerБаза данных, данные приложения
Bind MountМонтирование директории хостаРазработка, конфигурационные файлы
tmpfs MountВременный в памятиЧувствительные временные данные

Управление Named Volume

hljs bash
# Создать volume
docker volume create myapp-data

# Список volumes
docker volume ls

# Просмотр деталей volume
docker volume inspect myapp-data

# Удалить volume
docker volume rm myapp-data

# Удалить неиспользуемые volumes
docker volume prune

Запуск контейнеров с Named Volumes

hljs bash
# Запустить MySQL с volume
docker run -d \
  --name mysql-db \
  -e MYSQL_ROOT_PASSWORD=StrongPass123! \
  -e MYSQL_DATABASE=myapp \
  -v mysql-data:/var/lib/mysql \
  -p 3306:3306 \
  mysql:8.0

# Запустить PostgreSQL с volume
docker run -d \
  --name postgres-db \
  -e POSTGRES_PASSWORD=StrongPass123! \
  -e POSTGRES_DB=myapp \
  -v postgres-data:/var/lib/postgresql/data \
  -p 5432:5432 \
  postgres:15

Использование Bind Mounts

hljs bash
# Монтировать текущую директорию в контейнер
docker run -d \
  --name nginx-web \
  -v /home/user/website:/usr/share/nginx/html:ro \
  -p 80:80 \
  nginx:latest

# Bind mount для разработки
docker run -it \
  --name node-dev \
  -v $(pwd):/app \
  -w /app \
  -p 3000:3000 \
  node:20 \
  npm run dev

Volumes с Docker Compose

hljs yaml
# docker-compose.yml
version: '3.8'

services:
  db:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: StrongPass123!
      MYSQL_DATABASE: myapp
    volumes:
      - mysql-data:/var/lib/mysql
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
    ports:
      - "3306:3306"

  app:
    image: myapp:latest
    volumes:
      - app-uploads:/app/uploads
      - ./config:/app/config:ro
    depends_on:
      - db

volumes:
  mysql-data:
    driver: local
  app-uploads:
    driver: local

Резервное копирование и восстановление Volume

hljs bash
# Резервное копирование volume (tar-архив)
docker run --rm \
  -v mysql-data:/data \
  -v $(pwd):/backup \
  alpine tar czf /backup/mysql-backup.tar.gz -C /data .

# Восстановление volume
docker run --rm \
  -v mysql-data:/data \
  -v $(pwd):/backup \
  alpine tar xzf /backup/mysql-backup.tar.gz -C /data

Режимы Docker-сетей

Bridge-сеть (по умолчанию)

hljs bash
# Создать пользовательскую bridge-сеть
docker network create myapp-network

# Подключить контейнеры к пользовательской сети
docker run -d \
  --name web \
  --network myapp-network \
  nginx

docker run -d \
  --name db \
  --network myapp-network \
  -e MYSQL_ROOT_PASSWORD=StrongPass123! \
  mysql:8.0

# Контейнеры в пользовательской сети находят друг друга по имени
docker exec web ping db

Host-сеть

hljs bash
# Запустить в режиме host-сети (только Linux)
docker run -d \
  --name nginx-host \
  --network host \
  nginx

Управление Docker-сетями

hljs bash
# Список сетей
docker network ls

# Просмотр деталей сети
docker network inspect myapp-network

# Создать сеть с пользовательской подсетью
docker network create \
  --driver bridge \
  --subnet 172.20.0.0/16 \
  --gateway 172.20.0.1 \
  myapp-network

# Подключить контейнер к сети
docker network connect myapp-network existing-container

# Отключить контейнер от сети
docker network disconnect myapp-network existing-container

# Удалить сеть
docker network rm myapp-network

Сети с Docker Compose

hljs yaml
version: '3.8'

services:
  frontend:
    image: nginx:latest
    networks:
      - frontend-net
    ports:
      - "80:80"

  backend:
    image: myapp:latest
    networks:
      - frontend-net
      - backend-net

  db:
    image: mysql:8.0
    networks:
      - backend-net
    environment:
      MYSQL_ROOT_PASSWORD: StrongPass123!

networks:
  frontend-net:
    driver: bridge
  backend-net:
    driver: bridge
    internal: true

Заключение

Управление Docker volume и сетями — краеугольные камни production-grade контейнерной инфраструктуры. Надёжно храните данные с named volumes, изолируйте контейнеры с пользовательскими bridge-сетями и определяйте всю инфраструктуру как код с Docker Compose. С этими конфигурациями на серверах REXE вы можете создавать надёжные и масштабируемые контейнерные среды.