Управление Docker Volume и сетями: Постоянное хранилище и сетевая конфигурация
Типы Docker volume (named, bind mount, tmpfs), управление volumes, режимы Docker-сетей (bridge, host, overlay), создание пользовательских сетей и взаимодействие контейнеров. Полное руководство.
Содержание
Управление Docker Volume и сетями
Docker-контейнеры по умолчанию эфемерны — при удалении контейнера его данные тоже теряются. Volumes решают эту проблему и обеспечивают сохранность данных независимо от жизненного цикла контейнера. Docker-сети управляют взаимодействием между контейнерами и с внешним миром.
Типы Docker Volume
| Тип | Описание | Случай использования |
|---|---|---|
| Named Volume | Управляется Docker | База данных, данные приложения |
| Bind Mount | Монтирование директории хоста | Разработка, конфигурационные файлы |
| tmpfs Mount | Временный в памяти | Чувствительные временные данные |
Управление Named Volume
# Создать 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
# Запустить 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
# Монтировать текущую директорию в контейнер
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
# 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
# Резервное копирование 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-сеть (по умолчанию)
# Создать пользовательскую 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-сеть
# Запустить в режиме host-сети (только Linux)
docker run -d \
--name nginx-host \
--network host \
nginx
Управление Docker-сетями
# Список сетей
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
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 вы можете создавать надёжные и масштабируемые контейнерные среды.
Связанные статьи
Установка Kubernetes с K3s: Лёгкая оркестрация контейнеров
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Логирование контейнеров: Управление логами Docker и Kubernetes
Драйверы логов Docker, команда docker logs, логи подов Kubernetes, централизованный сбор логов (Loki, ELK Stack), ротация логов и лучшие практики управления логами в production.
Безопасность Docker: Усиление защиты контейнерной среды
Лучшие практики безопасности Docker: пользователь без root, файловая система только для чтения, профили seccomp, сканирование образов, безопасность Docker socket, сетевая изоляция и управление секретами.