Установка Kubernetes с K3s: Лёгкая оркестрация контейнеров
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Типы Docker volume (named, bind mount, tmpfs), управление volumes, режимы Docker-сетей (bridge, host, overlay), создание пользовательских сетей и взаимодействие контейнеров. Полное руководство.
Docker-контейнеры по умолчанию эфемерны — при удалении контейнера его данные тоже теряются. Volumes решают эту проблему и обеспечивают сохранность данных независимо от жизненного цикла контейнера. Docker-сети управляют взаимодействием между контейнерами и с внешним миром.
| Тип | Описание | Случай использования |
|---|---|---|
| Named Volume | Управляется Docker | База данных, данные приложения |
| Bind Mount | Монтирование директории хоста | Разработка, конфигурационные файлы |
| tmpfs Mount | Временный в памяти | Чувствительные временные данные |
# Создать 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
# Запустить 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
# Монтировать текущую директорию в контейнер
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
# 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 (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
# Создать пользовательскую 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-сети (только Linux)
docker run -d \
--name nginx-host \
--network host \
nginx
# Список сетей
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
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 вы можете создавать надёжные и масштабируемые контейнерные среды.
Named volume управляется Docker (хранится в /var/lib/docker/volumes/), переносим и легко резервируется. Bind mount напрямую монтирует конкретную директорию хоста, идеален для мгновенного отображения изменений кода при разработке. Используйте named volumes в production, bind mounts — при разработке.
Контейнеры должны находиться в одной пользовательской сети. В стандартной bridge-сети контейнеры не могут найти друг друга по имени — только по IP. Создайте пользовательскую сеть с docker network create и подключите оба контейнера к ней. Тогда можно использовать имя контейнера как hostname.
Наиболее надёжный метод: используйте временный Alpine-контейнер для сжатия volume в tar-архив. Команда docker run --rm -v VOLUME_NAME:/data -v $(pwd):/backup alpine tar czf /backup/backup.tar.gz -C /data . создаёт резервную копию содержимого volume в текущей директории. Для восстановления используйте tar xzf.
Docker Compose автоматически помещает сервисы из одного docker-compose.yml в одну сеть. Сервисы могут находить друг друга по имени сервиса. Сервис с именем 'db' доступен из других сервисов по hostname 'db'. Если не определить пользовательскую сеть, Compose создаёт стандартную bridge-сеть.
Режим host-сети используется, когда контейнеру нужно напрямую использовать сетевой интерфейс хоста. Преимущество: максимальная сетевая производительность, не нужен маппинг портов. Недостаток: нет изоляции, возможны конфликты портов. Подходит для высокопроизводительных сетевых приложений. Работает только на Linux.
Настройка одно- и многоузлового кластера Kubernetes с K3s, использование kubectl, создание deployments и services, управление приложениями с Helm. Руководство по Kubernetes для VPS.
Драйверы логов Docker, команда docker logs, логи подов Kubernetes, централизованный сбор логов (Loki, ELK Stack), ротация логов и лучшие практики управления логами в production.
Лучшие практики безопасности Docker: пользователь без root, файловая система только для чтения, профили seccomp, сканирование образов, безопасность Docker socket, сетевая изоляция и управление секретами.